2002-04-21 Dan Lewis <dihlewis@yahoo.co.uk>
[mono.git] / mono / metadata / object.h
index 7fa202d828e6f1354dde4f447a8e7e93bead6df4..65daf10ceb7dd20a3f78de43a02b06c5c2468e89 100644 (file)
@@ -4,7 +4,33 @@
 #include <mono/metadata/class.h>
 #include <mono/metadata/threads-types.h>
 
-#define MONO_CHECK_ARG(arg, expr)      G_STMT_START{                     \
+#if 1
+#define mono_assert(expr)                 G_STMT_START{                  \
+     if (!(expr))                                                        \
+       {                                                                 \
+               MonoException *ex;                                        \
+                char *msg = g_strdup_printf ("file %s: line %d (%s): "    \
+                "assertion failed: (%s)", __FILE__, __LINE__,             \
+                __PRETTY_FUNCTION__, #expr);                             \
+               ex = mono_get_exception_execution_engine (msg);           \
+               g_free (msg);                                             \
+                mono_raise_exception (ex);                                \
+       };                              }G_STMT_END
+
+#define mono_assert_not_reached()                G_STMT_START{           \
+     MonoException *ex;                                                   \
+     char *msg = g_strdup_printf ("file %s: line %d (%s): "               \
+     "should not be reached", __FILE__, __LINE__, __PRETTY_FUNCTION__);          \
+     ex = mono_get_exception_execution_engine (msg);                      \
+     g_free (msg);                                                        \
+     mono_raise_exception (ex);                                           \
+}G_STMT_END
+#else
+#define mono_assert(expr) g_assert(expr)
+#define mono_assert_not_reached() g_assert_not_reached() 
+#endif
+
+#define MONO_CHECK_ARG(arg, expr)              G_STMT_START{             \
      if (!(expr))                                                        \
        {                                                                 \
                MonoException *ex;                                        \
                 mono_raise_exception (ex);                                \
        };                              }G_STMT_END
 
-#define MONO_CHECK_ARG_NULL(arg)        G_STMT_START{                    \
+#define MONO_CHECK_ARG_NULL(arg)           G_STMT_START{                 \
      if (arg == NULL)                                                    \
        {                                                                 \
                MonoException *ex;                                        \
+                if (arg) {} /* check if the name exists */                \
                ex = mono_get_exception_argument_null (#arg);             \
                 mono_raise_exception (ex);                                \
        };                              }G_STMT_END
 
 typedef guchar MonoBoolean;
 
+typedef struct _MonoReflectionMethod MonoReflectionMethod;
+
 typedef struct {
-       MonoClass *klass;
+       MonoVTable *vtable;
        MonoThreadsSync *synchronisation;
 } MonoObject;
 
@@ -38,19 +67,25 @@ typedef struct {
 
 typedef struct {
        MonoObject obj;
+       /* bounds is NULL for szarrays */
        MonoArrayBounds *bounds;
-       /* used by single dimensional arrays to speed up bound checking */
+       /* total number of elements of the array */
        guint32 max_length; 
        /* we use double to ensure proper alignment on platforms that need it */
        double vector [MONO_ZERO_LEN_ARRAY];
 } MonoArray;
 
 typedef struct {
-       MonoObject obj;
-       MonoArray *c_str;
+       MonoObject object;
        gint32 length;
+       gunichar2 chars [MONO_ZERO_LEN_ARRAY];
 } MonoString;
 
+typedef struct {
+       MonoObject object;
+       MonoType  *type;
+} MonoReflectionType;
+
 typedef struct {
        MonoObject object;
        MonoObject *inner_ex;
@@ -72,20 +107,58 @@ typedef struct {
 } MonoArgumentException;
 
 typedef struct {
-       MonoObject object;
-       MonoObject *target_type;
-       MonoObject *target;
-       MonoString *method;
-       gpointer    method_ptr;
-} MonoDelegate;
+       MonoObject   object;
+       MonoObject  *async_state;
+       MonoObject  *handle;
+       MonoObject  *async_delegate;
+       gpointer     data;
+       MonoBoolean  sync_completed;
+       MonoBoolean  completed;
+       MonoBoolean  endinvoke_called;
+} MonoAsyncResult;
+
+typedef struct {
+       MonoObject   object;
+       gpointer     handle;
+       MonoBoolean  disposed;
+} MonoWaitHandle;
+
+typedef struct {
+       MonoObject  object;
+       MonoReflectionType *class_to_proxy;     
+} MonoRealProxy;
+
+typedef struct {
+       MonoObject     object;
+       MonoRealProxy *rp;      
+       MonoClass     *klass; 
+} MonoTransparentProxy;
+
+typedef struct {
+       MonoObject obj;
+       MonoReflectionMethod *method;
+       MonoArray  *args;               
+       MonoArray  *names;              
+       MonoArray  *arg_types;  
+       MonoObject *ctx;
+       MonoObject *rval;
+       MonoObject *exc;
+} MonoMethodMessage;
+
+typedef struct {
+       gulong new_object_count;
+       gulong initialized_class_count;
+       gulong used_class_count;
+       gulong class_vtable_size;
+       gulong class_static_data_size;
+} MonoStats;
 
-typedef void   (*MonoRuntimeObjectInit) (MonoObject *o);
-typedef gint32 (*MonoRuntimeExecMain)   (MonoMethod *method, MonoArray *args);
+typedef MonoObject* (*MonoInvokeFunc)        (MonoMethod *method, void *obj, void **params);
 
-extern MonoRuntimeObjectInit mono_runtime_object_init;
-extern MonoRuntimeExecMain mono_runtime_exec_main;
+#define mono_object_class(obj) (((MonoObject*)(obj))->vtable->klass)
+#define mono_object_domain(obj) (((MonoObject*)(obj))->vtable->domain)
 
-#define mono_array_length(array) ((array)->bounds->length)
+#define mono_array_length(array) ((array)->max_length)
 #define mono_array_addr(array,type,index) ( ((char*)(array)->vector) + sizeof (type) * (index) )
 #define mono_array_addr_with_size(array,size,index) ( ((char*)(array)->vector) + (size) * (index) )
 #define mono_array_get(array,type,index) ( *(type*)mono_array_addr ((array), type, (index)) ) 
@@ -95,28 +168,44 @@ extern MonoRuntimeExecMain mono_runtime_exec_main;
                *__p = (value); \
        } while (0)
 
-#define mono_string_chars(s) ((gushort*)(s)->c_str->vector)
+#define mono_string_chars(s) ((gunichar2*)(s)->chars)
+#define mono_string_length(s) ((s)->length)
+
+extern MonoStats mono_stats;
 
 void *
 mono_object_allocate        (size_t size);
 
 MonoObject *
-mono_object_new             (MonoClass *klass);
+mono_object_new             (MonoDomain *domain, MonoClass *klass);
+
+MonoObject *
+mono_object_new_specific    (MonoVTable *vtable);
 
 MonoObject *
-mono_object_new_from_token  (MonoImage *image, guint32 token);
+mono_object_new_from_token  (MonoDomain *domain, MonoImage *image, guint32 token);
 
 MonoArray*
-mono_array_new              (MonoClass *eclass, guint32 n);
+mono_array_new              (MonoDomain *domain, MonoClass *eclass, guint32 n);
 
 MonoArray*
-mono_array_new_full         (MonoClass *array_class, guint32 *lengths, guint32 *lower_bounds);
+mono_array_new_full         (MonoDomain *domain, MonoClass *array_class,
+                            guint32 *lengths, guint32 *lower_bounds);
+
+MonoArray *
+mono_array_new_specific     (MonoVTable *vtable, guint32 n);
+
+MonoArray*
+mono_array_clone            (MonoArray *array);
+
+MonoString*
+mono_string_new_utf16       (MonoDomain *domain, const guint16 *text, gint32 len);
 
 MonoString*
-mono_string_new_utf16       (const guint16 *text, gint32 len);
+mono_string_new_size           (MonoDomain *domain, gint32 len);
 
 MonoString*
-mono_ldstr                  (MonoImage *image, guint32 index);
+mono_ldstr                  (MonoDomain *domain, MonoImage *image, guint32 str_index);
 
 MonoString*
 mono_string_is_interned     (MonoString *str);
@@ -125,19 +214,25 @@ MonoString*
 mono_string_intern          (MonoString *str);
 
 MonoString*
-mono_string_new             (const char *text);
+mono_string_new             (MonoDomain *domain, const char *text);
+
+MonoString*
+mono_string_new_wrapper     (const char *text);
+
+MonoString*
+mono_string_new_len         (MonoDomain *domain, const char *text, guint length);
 
 char *
 mono_string_to_utf8         (MonoString *string_obj);
 
-char *
+gunichar2 *
 mono_string_to_utf16        (MonoString *string_obj);
 
 void       
 mono_object_free            (MonoObject *o);
 
 MonoObject *
-mono_value_box              (MonoClass *klass, gpointer val);
+mono_value_box              (MonoDomain *domain, MonoClass *klass, gpointer val);
                      
 MonoObject *
 mono_object_clone           (MonoObject *obj);
@@ -154,46 +249,41 @@ void
 mono_raise_exception        (MonoException *ex);
 
 void
-mono_install_runtime_object_init (MonoRuntimeObjectInit func);
-
-MonoObject*
-mono_get_exception_divide_by_zero      (void);
-
-MonoObject*
-mono_get_exception_security            (void);
+mono_runtime_object_init    (MonoObject *this);
 
-MonoObject*
-mono_get_exception_arithmetic          (void);
-
-MonoObject*
-mono_get_exception_overflow            (void);
+void
+mono_runtime_class_init     (MonoClass *klass);
 
-MonoObject*
-mono_get_exception_null_reference      (void);
+void        
+mono_install_runtime_invoke (MonoInvokeFunc func);
 
 MonoObject*
-mono_get_exception_execution_engine    (void);
+mono_runtime_invoke         (MonoMethod *method, void *obj, void **params);
 
 MonoObject*
-mono_get_exception_invalid_cast        (void);
+mono_runtime_invoke_array   (MonoMethod *method, void *obj, MonoArray *params);
 
-MonoObject*
-mono_get_exception_index_out_of_range  (void);
+int
+mono_runtime_exec_main      (MonoMethod *method, MonoArray *args);
 
-MonoObject*
-mono_get_exception_array_type_mismatch (void);
+MonoAsyncResult *
+mono_async_result_new       (MonoDomain *domain, HANDLE handle, 
+                            MonoObject *state, gpointer data);
 
-MonoObject*
-mono_get_exception_missing_method      (void);
+MonoWaitHandle *
+mono_wait_handle_new        (MonoDomain *domain, HANDLE handle);
 
-MonoException*
-mono_get_exception_argument_null       (const guchar *arg);
+void
+mono_message_init           (MonoDomain *domain, MonoMethodMessage *this, 
+                            MonoReflectionMethod *method, MonoArray *out_args);
 
-MonoException *
-mono_get_exception_argument            (const guchar *arg, const guchar *msg);
+MonoObject *
+mono_remoting_invoke        (MonoObject *real_proxy, MonoMethodMessage *msg, 
+                            MonoObject **exc, MonoArray **out_args);
 
-MonoException *
-mono_get_exception_io                  (const guchar *msg);
+MonoObject *
+mono_message_invoke         (MonoObject *target, MonoMethodMessage *msg, 
+                            MonoObject **exc, MonoArray **out_args);
 
 #endif