* roottypes.cs: Rename from tree.cs.
[mono.git] / mono / metadata / object.h
index 904a24dbc171c62003f1c71bcdda228d55443798..2fe5331df56e4903162bdb229336c715cd4b2e32 100644 (file)
@@ -2,93 +2,32 @@
 #define _MONO_CLI_OBJECT_H_
 
 #include <mono/metadata/class.h>
-#include <mono/metadata/threads-types.h>
-
-#if 1
-#ifdef __GNUC__
-#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 /* not GNUC */
-#define mono_assert(expr)                 G_STMT_START{                  \
-     if (!(expr))                                                        \
-       {                                                                 \
-               MonoException *ex;                                        \
-               char *msg = g_strdup_printf ("file %s: line %d: "         \
-               "assertion failed: (%s)", __FILE__, __LINE__,             \
-               #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): "                          \
-     "should not be reached", __FILE__, __LINE__);                       \
-     ex = mono_get_exception_execution_engine (msg);                     \
-     g_free (msg);                                                       \
-     mono_raise_exception (ex);                                                  \
-}G_STMT_END
-#endif
-#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;                                        \
-               char *msg = g_strdup_printf ("assertion `%s' failed",     \
-               #expr);                                                   \
-               if (arg) {} /* check if the name exists */                \
-               ex = mono_get_exception_argument (#arg, msg);             \
-               g_free (msg);                                             \
-               mono_raise_exception (ex);                                \
-       };                              }G_STMT_END
-
-#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
+G_BEGIN_DECLS
 
 typedef guchar MonoBoolean;
 
 typedef struct _MonoReflectionMethod MonoReflectionMethod;
+typedef struct _MonoReflectionAssembly MonoReflectionAssembly;
+typedef struct _MonoReflectionModule MonoReflectionModule;
+typedef struct _MonoReflectionField MonoReflectionField;
+typedef struct _MonoReflectionProperty MonoReflectionProperty;
+typedef struct _MonoReflectionEvent MonoReflectionEvent;
+typedef struct _MonoReflectionType MonoReflectionType;
 typedef struct _MonoDelegate MonoDelegate;
+typedef struct _MonoException MonoException;
+typedef struct _MonoThreadsSync MonoThreadsSync;
+typedef struct _MonoThread MonoThread;
+typedef struct _MonoDynamicAssembly MonoDynamicAssembly;
+typedef struct _MonoDynamicImage MonoDynamicImage;
+typedef struct _MonoReflectionMethodBody MonoReflectionMethodBody;
+typedef struct _MonoAppContext MonoAppContext;
 
 typedef struct {
        MonoVTable *vtable;
        MonoThreadsSync *synchronisation;
 } MonoObject;
 
-typedef struct {
-       MonoObject obj;
-       MonoObject *identity;
-} MonoMarshalByRefObject;
-
 typedef struct {
        guint32 length;
        guint32 lower_bound;
@@ -110,263 +49,6 @@ typedef struct {
        gunichar2 chars [MONO_ZERO_LEN_ARRAY];
 } MonoString;
 
-typedef struct {
-       MonoObject object;
-       gint32 length;
-       MonoString *str;
-} MonoStringBuilder;
-
-typedef struct {
-       MonoObject object;
-       MonoType  *type;
-} MonoReflectionType;
-
-typedef struct {
-       MonoType *type;
-       gpointer  value;
-       MonoClass *klass;
-} MonoTypedRef;
-
-typedef struct {
-       gpointer args;
-} MonoArgumentHandle;
-
-typedef struct {
-       MonoMethodSignature *sig;
-       gpointer args;
-       gint32 next_arg;
-       gint32 num_args;
-} MonoArgIterator;
-
-typedef struct {
-       MonoObject object;
-       MonoArray  *trace_ips;
-       MonoObject *inner_ex;
-       MonoString *message;
-       MonoString *help_link;
-       MonoString *class_name;
-       MonoString *stack_trace;
-       MonoString *remote_stack_trace;
-       gint32      remote_stack_index;
-       gint32      hresult;
-       MonoString *source;
-} MonoException;
-
-typedef struct {
-       MonoException base;
-} MonoSystemException;
-
-typedef struct {
-       MonoSystemException base;
-       MonoString *param_name;
-} MonoArgumentException;
-
-typedef struct {
-       MonoSystemException base;
-       MonoString *msg;
-       MonoString *type_name;
-} MonoTypeLoadException;
-
-typedef struct {
-       MonoObject   object;
-       MonoObject  *async_state;
-       MonoObject  *handle;
-       MonoObject  *async_delegate;
-       gpointer     data;
-       MonoBoolean  sync_completed;
-       MonoBoolean  completed;
-       MonoBoolean  endinvoke_called;
-       MonoObject  *async_callback;
-} MonoAsyncResult;
-
-typedef struct {
-       MonoMarshalByRefObject object;
-       gpointer     handle;
-       MonoBoolean  disposed;
-} MonoWaitHandle;
-
-typedef struct {
-       MonoObject  object;
-       MonoReflectionType *class_to_proxy;     
-       MonoObject *context;
-       MonoObject *unwrapped_server;
-} MonoRealProxy;
-
-typedef struct {
-       MonoObject       object;
-       MonoRealProxy   *rp;    
-       MonoRemoteClass *remote_class;
-       MonoBoolean      custom_type_info;
-} MonoTransparentProxy;
-
-/* This is a copy of System.Runtime.Remoting.Messaging.CallType */
-typedef enum {
-       CallType_Sync = 0,
-       CallType_BeginInvoke = 1,
-       CallType_EndInvoke = 2,
-       CallType_OneWay = 3
-} MonoCallType;
-
-typedef struct {
-       MonoObject obj;
-       MonoReflectionMethod *method;
-       MonoArray  *args;               
-       MonoArray  *names;              
-       MonoArray  *arg_types;  
-       MonoObject *ctx;
-       MonoObject *rval;
-       MonoObject *exc;
-       MonoAsyncResult *async_result;
-       guint32     call_type;
-} MonoMethodMessage;
-
-typedef struct {
-       MonoObject obj;
-       gint32 il_offset;
-       gint32 native_offset;
-       MonoReflectionMethod *method;
-       MonoString *filename;
-       gint32 line;
-       gint32 column;
-} MonoStackFrame;
-
-typedef struct {
-       MonoObject  obj;
-       HANDLE      handle;
-       MonoObject *culture_info;
-       MonoObject *ui_culture_info;
-       MonoBoolean threadpool_thread;
-       gunichar2  *name;
-       guint32     name_len;
-       guint32     state;
-       MonoException *abort_exc;
-       MonoObject *abort_state;
-       guint32 tid;
-       HANDLE      start_notify;
-       gpointer stack_ptr;
-       gpointer *static_data;
-       gpointer jit_data;
-       gpointer lock_data;
-       GSList *appdomain_refs;
-       MonoBoolean interruption_requested;
-} MonoThread;
-
-typedef struct {
-       MonoString *name;
-       MonoReflectionType *type;
-       MonoObject *value;
-} MonoSerializationEntry;
-
-typedef struct {
-       guint32 state;
-       MonoObject *additional;
-} MonoStreamingContext;
-
-typedef struct {
-       MonoObject obj;
-       MonoBoolean readOnly;
-       MonoString *AMDesignator;
-       MonoString *PMDesignator;
-       MonoString *DateSeparator;
-       MonoString *TimeSeparator;
-       MonoString *ShortDatePattern;
-       MonoString *LongDatePattern;
-       MonoString *ShortTimePattern;
-       MonoString *LongTimePattern;
-       MonoString *MonthDayPattern;
-       MonoString *YearMonthPattern;
-       MonoString *FullDateTimePattern;
-       MonoString *RFC1123Pattern;
-       MonoString *SortableDateTimePattern;
-       MonoString *UniversalSortableDateTimePattern;
-       guint32 FirstDayOfWeek;
-       MonoObject *Calendar;
-       guint32 CalendarWeekRule;
-       MonoArray *AbbreviatedDayNames;
-       MonoArray *DayNames;
-       MonoArray *MonthNames;
-       MonoArray *AbbreviatedMonthNames;
-       MonoArray *ShortDatePatterns;
-       MonoArray *LongDatePatterns;
-       MonoArray *ShortTimePatterns;
-       MonoArray *LongTimePatterns;
-} MonoDateTimeFormatInfo;
-
-typedef struct 
-{
-       MonoObject obj;
-       MonoBoolean readOnly;
-       MonoString *decimalFormats;
-       MonoString *currencyFormats;
-       MonoString *percentFormats;
-       MonoString *digitPattern;
-       MonoString *zeroPattern;
-       gint32 currencyDecimalDigits;
-       MonoString *currencyDecimalSeparator;
-       MonoString *currencyGroupSeparator;
-       MonoArray *currencyGroupSizes;
-       gint32 currencyNegativePattern;
-       gint32 currencyPositivePattern;
-       MonoString *currencySymbol;
-       MonoString *naNSymbol;
-       MonoString *negativeInfinitySymbol;
-       MonoString *negativeSign;
-       guint32 numberDecimalDigits;
-       MonoString *numberDecimalSeparator;
-       MonoString *numberGroupSeparator;
-       MonoArray *numberGroupSizes;
-       gint32 numberNegativePattern;
-       gint32 percentDecimalDigits;
-       MonoString *percentDecimalSeparator;
-       MonoString *percentGroupSeparator;
-       MonoArray *percentGroupSizes;
-       gint32 percentNegativePattern;
-       gint32 percentPositivePattern;
-       MonoString *percentSymbol;
-       MonoString *perMilleSymbol;
-       MonoString *positiveInfinitySymbol;
-       MonoString *positiveSign;
-} MonoNumberFormatInfo;
-
-typedef struct {
-       MonoObject obj;
-       gint32 lcid;
-       MonoString *icu_name;
-       gpointer ICU_collator;
-} MonoCompareInfo;
-
-typedef struct {
-       MonoObject obj;
-       MonoBoolean is_read_only;
-       gint32 lcid;
-       gint32 parent_lcid;
-       gint32 specific_lcid;
-       gint32 datetime_index;
-       gint32 number_index;
-       MonoBoolean use_user_override;
-       MonoNumberFormatInfo *number_format;
-       MonoDateTimeFormatInfo *datetime_format;
-       MonoObject *textinfo;
-       MonoString *name;
-       MonoString *displayname;
-       MonoString *englishname;
-       MonoString *nativename;
-       MonoString *iso3lang;
-       MonoString *iso2lang;
-       MonoString *icu_name;
-       MonoString *win3lang;
-       MonoCompareInfo *compareinfo;
-       const gint32 *calendar_data;
-} MonoCultureInfo;
-
-typedef struct {
-       MonoObject obj;
-       MonoString *str;
-       gint32 options;
-       MonoArray *key;
-       gint32 lcid;
-} MonoSortKey;
-
 typedef MonoObject* (*MonoInvokeFunc)       (MonoMethod *method, void *obj, void **params, MonoObject **exc);
 typedef gpointer    (*MonoCompileFunc)      (MonoMethod *method);
 typedef void       (*MonoMainThreadFunc)    (gpointer user_data);
@@ -374,8 +56,13 @@ typedef void            (*MonoMainThreadFunc)    (gpointer user_data);
 #define mono_object_class(obj) (((MonoObject*)(obj))->vtable->klass)
 #define mono_object_domain(obj) (((MonoObject*)(obj))->vtable->domain)
 
+#define MONO_OBJECT_SETREF(obj,fieldname,value) do {   \
+               mono_gc_wbarrier_set_field ((MonoObject*)(obj), &((obj)->fieldname), (MonoObject*)value);       \
+               /*(obj)->fieldname = (value);*/ \
+       } while (0)
+
 #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(array,type,index) ((type*)(gpointer) mono_array_addr_with_size (array, 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)) ) 
 #define mono_array_set(array,type,index,value) \
@@ -383,10 +70,21 @@ typedef void           (*MonoMainThreadFunc)    (gpointer user_data);
                type *__p = (type *) mono_array_addr ((array), type, (index));  \
                *__p = (value); \
        } while (0)
+#define mono_array_setref(array,index,value)   \
+       do {    \
+               gpointer *__p = (gpointer *) mono_array_addr ((array), gpointer, (index));      \
+               mono_gc_wbarrier_set_arrayref ((array), __p, (MonoObject*)(value));     \
+               /* *__p = (value);*/    \
+       } while (0)
+#define mono_array_memcpy_refs(dest,destidx,src,srcidx,count)  \
+       do {    \
+               gpointer *__p = (gpointer *) mono_array_addr ((dest), gpointer, (destidx));     \
+               mono_gc_wbarrier_arrayref_copy ((dest), __p, (count));  \
+               memmove (__p, mono_array_addr ((src), gpointer, (srcidx)), (count) * sizeof (gpointer));        \
+       } while (0)
 
 #define mono_string_chars(s) ((gunichar2*)(s)->chars)
 #define mono_string_length(s) ((s)->length)
-#define mono_stringbuilder_capacity(sb) ((sb)->str->length)
 
 MonoObject *
 mono_object_new                    (MonoDomain *domain, MonoClass *klass);
@@ -450,12 +148,30 @@ mono_string_to_utf16          (MonoString *string_obj);
 MonoString *
 mono_string_from_utf16     (gunichar2 *data);
 
-void      
-mono_object_free           (MonoObject *o);
+gboolean
+mono_string_equal           (MonoString *s1, MonoString *s2);
+
+guint
+mono_string_hash            (MonoString *s);
+
+int
+mono_object_hash            (MonoObject* obj);
 
 MonoObject *
 mono_value_box             (MonoDomain *domain, MonoClass *klass, gpointer val);
 
+void
+mono_value_copy             (gpointer dest, gpointer src, MonoClass *klass);
+
+void
+mono_value_copy_array       (MonoArray *dest, int dest_idx, gpointer src, int count);
+
+MonoDomain*
+mono_object_get_domain      (MonoObject *obj);
+
+MonoClass*
+mono_object_get_class       (MonoObject *obj);
+
 gpointer
 mono_object_unbox          (MonoObject *obj);
 
@@ -471,10 +187,17 @@ mono_object_isinst_mbyref   (MonoObject *obj, MonoClass *klass);
 MonoObject *
 mono_object_castclass_mbyref (MonoObject *obj, MonoClass *klass);
 
-typedef void (*MonoExceptionFunc) (MonoException *ex);
+gboolean 
+mono_monitor_try_enter       (MonoObject *obj, guint32 ms);
 
-void
-mono_install_handler       (MonoExceptionFunc func);
+gboolean
+mono_monitor_enter           (MonoObject *obj);
+
+guint
+mono_object_get_size         (MonoObject *o);
+
+void 
+mono_monitor_exit            (MonoObject *obj);
 
 void
 mono_raise_exception       (MonoException *ex);
@@ -485,12 +208,6 @@ mono_runtime_object_init    (MonoObject *this_obj);
 void
 mono_runtime_class_init            (MonoVTable *vtable);
 
-void       
-mono_install_runtime_invoke (MonoInvokeFunc func);
-
-void       
-mono_install_compile_method (MonoCompileFunc func);
-
 MonoMethod*
 mono_object_get_virtual_method (MonoObject *obj, MonoMethod *method);
 
@@ -525,29 +242,6 @@ int
 mono_runtime_exec_main     (MonoMethod *method, MonoArray *args,
                             MonoObject **exc);
 
-MonoAsyncResult *
-mono_async_result_new      (MonoDomain *domain, HANDLE handle, 
-                            MonoObject *state, gpointer data);
-
-MonoWaitHandle *
-mono_wait_handle_new       (MonoDomain *domain, HANDLE handle);
-
-void
-mono_message_init          (MonoDomain *domain, MonoMethodMessage *this_obj, 
-                            MonoReflectionMethod *method, MonoArray *out_args);
-
-MonoObject *
-mono_remoting_invoke       (MonoObject *real_proxy, MonoMethodMessage *msg, 
-                            MonoObject **exc, MonoArray **out_args);
-
-MonoObject *
-mono_message_invoke        (MonoObject *target, MonoMethodMessage *msg, 
-                            MonoObject **exc, MonoArray **out_args);
-
-MonoMethodMessage *
-mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke, 
-                             MonoDelegate **cb, MonoObject **state);
-
 gpointer
 mono_load_remote_field (MonoObject *this_obj, MonoClass *klass, MonoClassField *field, gpointer *res);
 
@@ -560,27 +254,18 @@ mono_store_remote_field (MonoObject *this_obj, MonoClass *klass, MonoClassField
 void
 mono_store_remote_field_new (MonoObject *this_obj, MonoClass *klass, MonoClassField *field, MonoObject *arg);
 
-void
-mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
-
 void
 mono_unhandled_exception    (MonoObject *exc);
 
 void
 mono_print_unhandled_exception (MonoObject *exc);
 
-void
-mono_delegate_ctor         (MonoObject *this_obj, MonoObject *target, gpointer addr);
-
 gpointer 
 mono_compile_method       (MonoMethod *method);
 
 MonoRemoteClass*
 mono_remote_class (MonoDomain *domain, MonoString *class_name, MonoClass *proxy_class);
 
-void
-mono_upgrade_remote_class (MonoDomain *domain, MonoRemoteClass *remote_class, MonoClass *klass);
-
 /* accessors for fields and properties */
 void
 mono_field_set_value (MonoObject *obj, MonoClassField *field, void *value);
@@ -603,8 +288,33 @@ mono_property_set_value (MonoProperty *prop, void *obj, void **params, MonoObjec
 MonoObject*
 mono_property_get_value (MonoProperty *prop, void *obj, void **params, MonoObject **exc);
 
-void
-mono_type_initialization_init (void);
+/* GC handles support 
+ *
+ * A handle can be created to refer to a managed object and either prevent it
+ * from being garbage collected or moved or to be able to know if it has been 
+ * collected or not (weak references).
+ * mono_gchandle_new () is used to prevent an object from being garbage collected
+ * until mono_gchandle_free() is called. Use a TRUE value for the pinned argument to
+ * prevent the object from being moved (this should be avoided as much as possible 
+ * and this should be used only for shorts periods of time or performance will suffer).
+ * To create a weakref use mono_gchandle_new_weakref (): track_resurrection should
+ * usually be false (see the GC docs for more details).
+ * mono_gchandle_get_target () can be used to get the object referenced by both kinds
+ * of handle: for a weakref handle, if an object has been collected, it will return NULL.
+ */
+guint32      mono_gchandle_new         (MonoObject *obj, gboolean pinned);
+guint32      mono_gchandle_new_weakref (MonoObject *obj, gboolean track_resurrection);
+MonoObject*  mono_gchandle_get_target  (guint32 gchandle);
+void         mono_gchandle_free        (guint32 gchandle);
+
+/* GC write barriers support */
+void mono_gc_wbarrier_set_field     (MonoObject *obj, gpointer field_ptr, MonoObject* value);
+void mono_gc_wbarrier_set_arrayref  (MonoArray *arr, gpointer slot_ptr, MonoObject* value);
+void mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int count);
+void mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value);
+void mono_gc_wbarrier_value_copy    (gpointer dest, gpointer src, int count, MonoClass *klass);
+
+G_END_DECLS
 
 #endif