2009-09-13 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / metadata / object-internals.h
1 #ifndef __MONO_OBJECT_INTERNALS_H__
2 #define __MONO_OBJECT_INTERNALS_H__
3
4 #include <mono/metadata/object.h>
5 #include <mono/metadata/threads.h>
6 #include <mono/metadata/reflection.h>
7 #include <mono/metadata/mempool.h>
8 #include <mono/metadata/class-internals.h>
9 #include <mono/io-layer/io-layer.h>
10 #include "mono/utils/mono-compiler.h"
11
12 /* 
13  * We should find a better place for this stuff. We can't put it in mono-compiler.h,
14  * since that is included by libgc.
15  */
16 #ifndef G_LIKELY
17 #define G_LIKELY(a) (a)
18 #define G_UNLIKELY(a) (a)
19 #endif
20
21 /*
22  * glib defines this macro and uses it in the definition of G_LIKELY, and thus,
23  * g_assert (). The macro expands to a complex piece of code, preventing some
24  * gcc versions like 4.3.0 from handling the __builtin_expect construct properly,
25  * causing the generation of the unlikely branch into the middle of the code.
26  */
27 #ifdef _G_BOOLEAN_EXPR
28 #undef _G_BOOLEAN_EXPR
29 #define _G_BOOLEAN_EXPR(expr) (gsize)(expr)
30 #endif
31
32 #if 1
33 #ifdef __GNUC__
34 #define mono_assert(expr)                  G_STMT_START{                  \
35      if (!(expr))                                                         \
36        {                                                                  \
37                 MonoException *ex;                                        \
38                 char *msg = g_strdup_printf ("file %s: line %d (%s): "    \
39                 "assertion failed: (%s)", __FILE__, __LINE__,             \
40                 __PRETTY_FUNCTION__, #expr);                              \
41                 ex = mono_get_exception_execution_engine (msg);           \
42                 g_free (msg);                                             \
43                 mono_raise_exception (ex);                                \
44        };                               }G_STMT_END
45
46 #define mono_assert_not_reached()                 G_STMT_START{           \
47      MonoException *ex;                                                   \
48      char *msg = g_strdup_printf ("file %s: line %d (%s): "               \
49      "should not be reached", __FILE__, __LINE__, __PRETTY_FUNCTION__);   \
50      ex = mono_get_exception_execution_engine (msg);                      \
51      g_free (msg);                                                        \
52      mono_raise_exception (ex);                                           \
53 }G_STMT_END
54 #else /* not GNUC */
55 #define mono_assert(expr)                  G_STMT_START{                  \
56      if (!(expr))                                                         \
57        {                                                                  \
58                 MonoException *ex;                                        \
59                 char *msg = g_strdup_printf ("file %s: line %d: "         \
60                 "assertion failed: (%s)", __FILE__, __LINE__,             \
61                 #expr);                                                   \
62                 ex = mono_get_exception_execution_engine (msg);           \
63                 g_free (msg);                                             \
64                 mono_raise_exception (ex);                                \
65        };                               }G_STMT_END
66
67 #define mono_assert_not_reached()                 G_STMT_START{           \
68      MonoException *ex;                                                   \
69      char *msg = g_strdup_printf ("file %s: line %d): "                   \
70      "should not be reached", __FILE__, __LINE__);                        \
71      ex = mono_get_exception_execution_engine (msg);                      \
72      g_free (msg);                                                        \
73      mono_raise_exception (ex);                                           \
74 }G_STMT_END
75 #endif
76 #else
77 #define mono_assert(expr) g_assert(expr)
78 #define mono_assert_not_reached() g_assert_not_reached() 
79 #endif
80
81 #define MONO_CHECK_ARG(arg, expr)               G_STMT_START{             \
82      if (!(expr))                                                         \
83        {                                                                  \
84                 MonoException *ex;                                        \
85                 char *msg = g_strdup_printf ("assertion `%s' failed",     \
86                 #expr);                                                   \
87                 if (arg) {} /* check if the name exists */                \
88                 ex = mono_get_exception_argument (#arg, msg);             \
89                 g_free (msg);                                             \
90                 mono_raise_exception (ex);                                \
91        };                               }G_STMT_END
92
93 #define MONO_CHECK_ARG_NULL(arg)            G_STMT_START{                 \
94      if (arg == NULL)                                                     \
95        {                                                                  \
96                 MonoException *ex;                                        \
97                 if (arg) {} /* check if the name exists */                \
98                 ex = mono_get_exception_argument_null (#arg);             \
99                 mono_raise_exception (ex);                                \
100        };                               }G_STMT_END
101
102 /* 16 == default capacity */
103 #define mono_stringbuilder_capacity(sb) ((sb)->str ? ((sb)->str->length) : 16)
104
105 /* 
106  * Macros which cache the results of lookups locally.
107  * These should be used instead of the original versions, if the __GNUC__
108  * restriction is acceptable.
109  */
110
111 #ifdef __GNUC__
112
113 /* namespace and name should be a constant */
114 #define mono_class_from_name_cached(image,namespace,name) ({ \
115                         static MonoClass *tmp_klass; \
116                         if (!tmp_klass) { \
117                                 tmp_klass = mono_class_from_name ((image), (namespace), (name)); \
118                                 g_assert (tmp_klass); \
119                         }; \
120                         tmp_klass; })
121 /* name should be a compile-time constant */
122 #define mono_class_get_field_from_name_cached(klass,name) ({ \
123                         static MonoClassField *tmp_field; \
124                         if (!tmp_field) { \
125                                 tmp_field = mono_class_get_field_from_name ((klass), (name)); \
126                                 g_assert (tmp_field); \
127                         }; \
128                         tmp_field; })
129 /* eclass should be a run-time constant */
130 #define mono_array_class_get_cached(eclass,rank) ({     \
131                         static MonoClass *tmp_klass; \
132                         if (!tmp_klass) { \
133                                 tmp_klass = mono_array_class_get ((eclass), (rank));    \
134                                 g_assert (tmp_klass); \
135                         }; \
136                         tmp_klass; })
137 /* eclass should be a run-time constant */
138 #define mono_array_new_cached(domain, eclass, size) mono_array_new_specific (mono_class_vtable ((domain), mono_array_class_get_cached ((eclass), 1)), (size))
139
140 #else
141
142 #define mono_class_from_name_cached(image,namespace,name) mono_class_from_name ((image), (namespace), (name))
143 #define mono_class_get_field_from_name_cached(klass,name) mono_class_get_field_from_name ((klass), (name))
144 #define mono_array_class_get_cached(eclass,rank) mono_array_class_get ((eclass), (rank))
145 #define mono_array_new_cached(domain, eclass, size) mono_array_new_specific (mono_class_vtable ((domain), mono_array_class_get_cached ((eclass), 1)), (size))
146
147 #endif
148
149 typedef struct {
150         MonoObject obj;
151         MonoObject *identity;
152 } MonoMarshalByRefObject;
153
154 /* This is a copy of System.AppDomain */
155 struct _MonoAppDomain {
156         MonoMarshalByRefObject mbr;
157         MonoDomain *data;
158 };
159
160 typedef struct {
161         MonoObject object;
162         gint32 length;
163         MonoString *str;
164         MonoString *cached_str;
165         gint32 max_capacity;
166 } MonoStringBuilder;
167
168 typedef struct {
169         MonoType *type;
170         gpointer  value;
171         MonoClass *klass;
172 } MonoTypedRef;
173
174 typedef struct {
175         gpointer args;
176 } MonoArgumentHandle;
177
178 typedef struct {
179         MonoMethodSignature *sig;
180         gpointer args;
181         gint32 next_arg;
182         gint32 num_args;
183 } MonoArgIterator;
184
185 struct _MonoException {
186         MonoObject object;
187         /* Stores the IPs and the generic sharing infos
188            (vtable/MRGCTX) of the frames. */
189         MonoArray  *trace_ips;
190         MonoObject *inner_ex;
191         MonoString *message;
192         MonoString *help_link;
193         MonoString *class_name;
194         MonoString *stack_trace;
195         MonoString *remote_stack_trace;
196         gint32      remote_stack_index;
197         gint32      hresult;
198         MonoString *source;
199         MonoObject *_data;
200 };
201
202 typedef struct {
203         MonoException base;
204 } MonoSystemException;
205
206 typedef struct {
207         MonoSystemException base;
208         MonoString *param_name;
209 } MonoArgumentException;
210
211 typedef struct {
212         MonoSystemException base;
213         MonoString *msg;
214         MonoString *type_name;
215 } MonoTypeLoadException;
216
217 typedef struct {
218         MonoObject   object;
219         MonoObject  *async_state;
220         MonoObject  *handle;
221         MonoObject  *async_delegate;
222         gpointer    *data;
223         MonoObject  *object_data;
224         MonoBoolean  sync_completed;
225         MonoBoolean  completed;
226         MonoBoolean  endinvoke_called;
227         MonoObject  *async_callback;
228         MonoObject  *execution_context;
229         MonoObject  *original_context;
230 } MonoAsyncResult;
231
232 typedef struct {
233         MonoMarshalByRefObject object;
234         gpointer     handle;
235         MonoBoolean  disposed;
236 } MonoWaitHandle;
237
238 /* This is a copy of System.Runtime.Remoting.Messaging.CallType */
239 typedef enum {
240         CallType_Sync = 0,
241         CallType_BeginInvoke = 1,
242         CallType_EndInvoke = 2,
243         CallType_OneWay = 3
244 } MonoCallType;
245
246 /* This corresponds to System.Type */
247 struct _MonoReflectionType {
248         MonoObject object;
249         MonoType  *type;
250 };
251
252 typedef struct {
253         MonoReflectionType type;
254         MonoObject *type_info;
255 } MonoReflectionMonoType;
256
257 typedef struct {
258         MonoObject  object;
259         MonoReflectionType *class_to_proxy;     
260         MonoObject *context;
261         MonoObject *unwrapped_server;
262         gint32      target_domain_id;
263         MonoString *target_uri;
264         MonoObject *object_identity;
265         MonoObject *obj_TP;
266         MonoObject *stub_data;
267 } MonoRealProxy;
268
269 typedef struct {
270         MonoMarshalByRefObject object;
271         gpointer iunknown;
272         GHashTable* itf_hash;
273 } MonoComObject;
274
275 typedef struct {
276         MonoRealProxy real_proxy;
277         MonoComObject *com_object;
278         gint32 ref_count;
279 } MonoComInteropProxy;
280
281 typedef struct {
282         MonoObject       object;
283         MonoRealProxy   *rp;    
284         MonoRemoteClass *remote_class;
285         MonoBoolean      custom_type_info;
286 } MonoTransparentProxy;
287
288 typedef struct {
289         MonoObject obj;
290         MonoReflectionMethod *method;
291         MonoArray  *args;               
292         MonoArray  *names;              
293         MonoArray  *arg_types;  
294         MonoObject *ctx;
295         MonoObject *rval;
296         MonoObject *exc;
297         MonoAsyncResult *async_result;
298         guint32     call_type;
299 } MonoMethodMessage;
300
301 typedef struct {
302         MonoObject obj;
303         gint32 il_offset;
304         gint32 native_offset;
305         MonoReflectionMethod *method;
306         MonoString *filename;
307         gint32 line;
308         gint32 column;
309         MonoString *internal_method_name;
310 } MonoStackFrame;
311
312 struct _MonoThread {
313         MonoObject  obj;
314         int         lock_thread_id; /* to be used as the pre-shifted thread id in thin locks */
315         HANDLE      handle;
316         MonoArray  *cached_culture_info;
317         gpointer    unused1;
318         MonoBoolean threadpool_thread;
319         gunichar2  *name;
320         guint32     name_len;
321         guint32     state;
322         MonoException *abort_exc;
323         int abort_state_handle;
324         guint64 tid;    /* This is accessed as a gsize in the code (so it can hold a 64bit pointer on systems that need it), but needs to reserve 64 bits of space on all machines as it corresponds to a field in managed code */
325         HANDLE      start_notify;
326         gpointer stack_ptr;
327         gpointer *static_data;
328         gpointer jit_data;
329         gpointer lock_data;
330         MonoAppContext *current_appcontext;
331         int stack_size;
332         MonoObject *start_obj;
333         GSList *appdomain_refs;
334         /* This is modified using atomic ops, so keep it a gint32 */
335         gint32 interruption_requested;
336         gpointer suspend_event;
337         gpointer suspended_event;
338         gpointer resume_event;
339         CRITICAL_SECTION *synch_cs;
340         guint8* serialized_culture_info;
341         guint32 serialized_culture_info_len;
342         guint8* serialized_ui_culture_info;
343         guint32 serialized_ui_culture_info_len;
344         MonoBoolean thread_dump_requested;
345         gpointer end_stack; /* This is only used when running in the debugger. */
346         MonoBoolean thread_interrupt_requested;
347         guint8  apartment_state;
348         gint32 critical_region_level;
349         guint32 small_id; /* A small, unique id, used for the hazard pointer table. */
350         MonoThreadManageCallback manage_callback;
351         MonoException *pending_exception;
352         MonoObject *ec_to_set;
353         /* 
354          * These fields are used to avoid having to increment corlib versions
355          * when a new field is added to the unmanaged MonoThread structure.
356          */
357         gpointer interrupt_on_stop;
358         gpointer unused3;
359         gpointer unused4;
360         gpointer unused5;
361         gpointer unused6;
362 };
363
364 typedef struct {
365         MonoString *name;
366         MonoReflectionType *type;
367         MonoObject *value;
368 } MonoSerializationEntry;
369
370 typedef struct {
371         guint32 state;
372         MonoObject *additional;
373 } MonoStreamingContext;
374
375 typedef struct {
376         MonoObject obj;
377         MonoBoolean readOnly;
378         MonoString *AMDesignator;
379         MonoString *PMDesignator;
380         MonoString *DateSeparator;
381         MonoString *TimeSeparator;
382         MonoString *ShortDatePattern;
383         MonoString *LongDatePattern;
384         MonoString *ShortTimePattern;
385         MonoString *LongTimePattern;
386         MonoString *MonthDayPattern;
387         MonoString *YearMonthPattern;
388         MonoString *FullDateTimePattern;
389         MonoString *RFC1123Pattern;
390         MonoString *SortableDateTimePattern;
391         MonoString *UniversalSortableDateTimePattern;
392         guint32 FirstDayOfWeek;
393         MonoObject *Calendar;
394         guint32 CalendarWeekRule;
395         MonoArray *AbbreviatedDayNames;
396         MonoArray *DayNames;
397         MonoArray *MonthNames;
398         MonoArray *AbbreviatedMonthNames;
399         MonoArray *ShortDatePatterns;
400         MonoArray *LongDatePatterns;
401         MonoArray *ShortTimePatterns;
402         MonoArray *LongTimePatterns;
403         MonoArray *MonthDayPatterns;
404         MonoArray *YearMonthPatterns;
405         MonoArray *shortDayNames;
406 } MonoDateTimeFormatInfo;
407
408 typedef struct 
409 {
410         MonoObject obj;
411         MonoBoolean readOnly;
412         MonoString *decimalFormats;
413         MonoString *currencyFormats;
414         MonoString *percentFormats;
415         MonoString *digitPattern;
416         MonoString *zeroPattern;
417         gint32 currencyDecimalDigits;
418         MonoString *currencyDecimalSeparator;
419         MonoString *currencyGroupSeparator;
420         MonoArray *currencyGroupSizes;
421         gint32 currencyNegativePattern;
422         gint32 currencyPositivePattern;
423         MonoString *currencySymbol;
424         MonoString *naNSymbol;
425         MonoString *negativeInfinitySymbol;
426         MonoString *negativeSign;
427         guint32 numberDecimalDigits;
428         MonoString *numberDecimalSeparator;
429         MonoString *numberGroupSeparator;
430         MonoArray *numberGroupSizes;
431         gint32 numberNegativePattern;
432         gint32 percentDecimalDigits;
433         MonoString *percentDecimalSeparator;
434         MonoString *percentGroupSeparator;
435         MonoArray *percentGroupSizes;
436         gint32 percentNegativePattern;
437         gint32 percentPositivePattern;
438         MonoString *percentSymbol;
439         MonoString *perMilleSymbol;
440         MonoString *positiveInfinitySymbol;
441         MonoString *positiveSign;
442 } MonoNumberFormatInfo;
443
444 typedef struct {
445         MonoObject obj;
446         gint32 lcid;
447         MonoString *icu_name;
448         gpointer ICU_collator;
449 } MonoCompareInfo;
450
451 typedef struct {
452         MonoObject obj;
453         MonoBoolean is_read_only;
454         gint32 lcid;
455         gint32 parent_lcid;
456         gint32 specific_lcid;
457         gint32 datetime_index;
458         gint32 number_index;
459         MonoBoolean use_user_override;
460         MonoNumberFormatInfo *number_format;
461         MonoDateTimeFormatInfo *datetime_format;
462         MonoObject *textinfo;
463         MonoString *name;
464         MonoString *displayname;
465         MonoString *englishname;
466         MonoString *nativename;
467         MonoString *iso3lang;
468         MonoString *iso2lang;
469         MonoString *icu_name;
470         MonoString *win3lang;
471         MonoString *territory;
472         MonoCompareInfo *compareinfo;
473         const gint32 *calendar_data;
474         const void* text_info_data;
475 } MonoCultureInfo;
476
477 typedef struct {
478         MonoObject obj;
479         gint32 region_id;
480         MonoString *iso2name;
481         MonoString *iso3name;
482         MonoString *win3name;
483         MonoString *english_name;
484         MonoString *currency_symbol;
485         MonoString *iso_currency_symbol;
486         MonoString *currency_english_name;
487 } MonoRegionInfo;
488
489 typedef struct {
490         MonoObject obj;
491         MonoString *str;
492         gint32 options;
493         MonoArray *key;
494         gint32 lcid;
495 } MonoSortKey;
496
497 typedef struct {
498         MonoObject object;
499         guint32 intType;
500 } MonoInterfaceTypeAttribute;
501
502 /* 
503  * Callbacks supplied by the runtime and called by the modules in metadata/
504  * This interface is easier to extend than adding a new function type +
505  * a new 'install' function for every callback.
506  */
507 typedef struct {
508         gpointer (*create_ftnptr) (MonoDomain *domain, gpointer addr);
509         gpointer (*get_addr_from_ftnptr) (gpointer descr);
510         char*    (*get_runtime_build_info) (void);
511 } MonoRuntimeCallbacks;
512
513 /* used to free a dynamic method */
514 typedef void        (*MonoFreeMethodFunc)        (MonoDomain *domain, MonoMethod *method);
515
516 /* Used to initialize the method pointers inside vtables */
517 typedef gboolean    (*MonoInitVTableFunc)    (MonoVTable *vtable);
518
519 void mono_set_pending_exception (MonoException *exc) MONO_INTERNAL;
520
521 /* remoting and async support */
522
523 MonoAsyncResult *
524 mono_async_result_new       (MonoDomain *domain, HANDLE handle, 
525                              MonoObject *state, gpointer data, MonoObject *object_data) MONO_INTERNAL;
526
527 MonoWaitHandle *
528 mono_wait_handle_new        (MonoDomain *domain, HANDLE handle) MONO_INTERNAL;
529
530 HANDLE
531 mono_wait_handle_get_handle (MonoWaitHandle *handle) MONO_INTERNAL;
532
533 void
534 mono_message_init           (MonoDomain *domain, MonoMethodMessage *this_obj, 
535                              MonoReflectionMethod *method, MonoArray *out_args) MONO_INTERNAL;
536
537 MonoObject *
538 mono_remoting_invoke        (MonoObject *real_proxy, MonoMethodMessage *msg, 
539                              MonoObject **exc, MonoArray **out_args) MONO_INTERNAL;
540
541 MonoObject *
542 mono_message_invoke         (MonoObject *target, MonoMethodMessage *msg, 
543                              MonoObject **exc, MonoArray **out_args) MONO_INTERNAL;
544
545 MonoMethodMessage *
546 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke, 
547                               MonoDelegate **cb, MonoObject **state) MONO_INTERNAL;
548
549 void
550 mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args) MONO_INTERNAL;
551
552 void
553 mono_delegate_ctor_with_method (MonoObject *this, MonoObject *target, gpointer addr, MonoMethod *method) MONO_INTERNAL;
554
555 void
556 mono_delegate_ctor          (MonoObject *this_obj, MonoObject *target, gpointer addr) MONO_INTERNAL;
557
558 void*
559 mono_class_get_allocation_ftn (MonoVTable *vtable, gboolean for_box, gboolean *pass_size_in_words) MONO_INTERNAL;
560
561 void
562 mono_runtime_free_method    (MonoDomain *domain, MonoMethod *method) MONO_INTERNAL;
563
564 /* runtime initialization functions */
565 typedef void (*MonoExceptionFunc) (MonoException *ex);
566
567 void
568 mono_install_handler        (MonoExceptionFunc func) MONO_INTERNAL;
569
570 void        
571 mono_install_runtime_invoke (MonoInvokeFunc func) MONO_INTERNAL;
572
573 void        
574 mono_install_compile_method (MonoCompileFunc func) MONO_INTERNAL;
575
576 void
577 mono_install_free_method    (MonoFreeMethodFunc func) MONO_INTERNAL;
578
579 void
580 mono_install_callbacks      (MonoRuntimeCallbacks *cbs) MONO_INTERNAL;
581
582 MonoRuntimeCallbacks*
583 mono_get_runtime_callbacks (void) MONO_INTERNAL;
584
585 void
586 mono_type_initialization_init (void) MONO_INTERNAL;
587
588 void
589 mono_type_initialization_cleanup (void) MONO_INTERNAL;
590
591 guint32
592 mono_thread_get_tls_key    (void) MONO_INTERNAL;
593
594 gint32
595 mono_thread_get_tls_offset (void) MONO_INTERNAL;
596
597 guint32
598 mono_domain_get_tls_key    (void) MONO_INTERNAL;
599
600 gint32
601 mono_domain_get_tls_offset (void) MONO_INTERNAL;
602
603 /* Reflection and Reflection.Emit support */
604
605 /*
606  * Handling System.Type objects:
607  *
608  *   Fields defined as System.Type in managed code should be defined as MonoObject* 
609  * in unmanaged structures, and the monotype_cast () function should be used for 
610  * casting them to MonoReflectionType* to avoid crashes/security issues when 
611  * encountering instances of user defined subclasses of System.Type.
612  */
613
614 #define IS_MONOTYPE(obj) (!(obj) || (((MonoObject*)(obj))->vtable->klass->image == mono_defaults.corlib && ((MonoReflectionType*)(obj))->type != NULL))
615
616 /* 
617  * Make sure the argument, which should be a System.Type is a System.MonoType object 
618  * or equivalent, and not an instance of 
619  * a user defined subclass of System.Type. This should be used in places were throwing
620  * an exception is safe.
621  */
622 #define CHECK_MONOTYPE(obj) do { \
623         if (!IS_MONOTYPE (obj)) \
624                 mono_raise_exception (mono_get_exception_not_supported ("User defined subclasses of System.Type are not yet supported")); \
625         } while (0)
626
627 /* This should be used for accessing members of Type[] arrays */
628 #define mono_type_array_get(arr,index) monotype_cast (mono_array_get ((arr), gpointer, (index)))
629
630 /*
631  * Cast an object to MonoReflectionType, making sure it is a System.MonoType or
632  * a subclass of it.
633  */
634 static inline MonoReflectionType*
635 monotype_cast (MonoObject *obj)
636 {
637         g_assert (IS_MONOTYPE (obj));
638
639         return (MonoReflectionType*)obj;
640 }
641
642 /*
643  * The following structure must match the C# implementation in our corlib.
644  */
645
646 struct _MonoReflectionMethod {
647         MonoObject object;
648         MonoMethod *method;
649         MonoString *name;
650         MonoReflectionType *reftype;
651 };
652
653 typedef struct _MonoReflectionGenericMethod MonoReflectionGenericMethod;
654 struct _MonoReflectionGenericMethod {
655         MonoReflectionMethod method;
656 };
657
658 struct _MonoDelegate {
659         MonoObject object;
660         /* The compiled code of the target method */
661         gpointer method_ptr;
662         /* The invoke code */
663         gpointer invoke_impl;
664         MonoObject *target;
665         MonoMethod *method;
666         gpointer delegate_trampoline;
667         /* 
668          * If non-NULL, this points to a memory location which stores the address of 
669          * the compiled code of the method, or NULL if it is not yet compiled.
670          */
671         guint8 **method_code;
672         MonoReflectionMethod *method_info;
673         MonoReflectionMethod *original_method_info;
674         MonoObject *data;
675 };
676
677 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
678 struct _MonoMulticastDelegate {
679         MonoDelegate delegate;
680         MonoMulticastDelegate *prev;
681 };
682
683 struct _MonoReflectionField {
684         MonoObject object;
685         MonoClass *klass;
686         MonoClassField *field;
687         MonoString *name;
688         MonoReflectionType *type;
689         guint32 attrs;
690 };
691
692 struct _MonoReflectionProperty {
693         MonoObject object;
694         MonoClass *klass;
695         MonoProperty *property;
696 };
697
698 /*This is System.EventInfo*/
699 struct _MonoReflectionEvent {
700         MonoObject object;
701         MonoObject *cached_add_event;
702 };
703
704 typedef struct {
705         MonoReflectionEvent object;
706         MonoClass *klass;
707         MonoEvent *event;
708 } MonoReflectionMonoEvent;
709
710 typedef struct {
711         MonoObject object;
712         MonoReflectionType *ClassImpl;
713         MonoObject *DefaultValueImpl;
714         MonoObject *MemberImpl;
715         MonoString *NameImpl;
716         gint32 PositionImpl;
717         guint32 AttrsImpl;
718         MonoObject *MarshalAsImpl;
719 } MonoReflectionParameter;
720
721 struct _MonoReflectionMethodBody {
722         MonoObject object;
723         MonoArray *clauses;
724         MonoArray *locals;
725         MonoArray *il;
726         MonoBoolean init_locals;
727         guint32 local_var_sig_token;
728         guint32 max_stack;
729 };
730
731 struct _MonoReflectionAssembly {
732         MonoObject object;
733         MonoAssembly *assembly;
734         MonoObject *resolve_event_holder;
735         /* CAS related */
736         MonoObject *evidence;   /* Evidence */
737         MonoObject *minimum;    /* PermissionSet - for SecurityAction.RequestMinimum */
738         MonoObject *optional;   /* PermissionSet - for SecurityAction.RequestOptional */
739         MonoObject *refuse;     /* PermissionSet - for SecurityAction.RequestRefuse */
740         MonoObject *granted;    /* PermissionSet - for the resolved assembly granted permissions */
741         MonoObject *denied;     /* PermissionSet - for the resolved assembly denied permissions */
742         /* */
743         MonoBoolean from_byte_array;
744         MonoString *name;
745 };
746
747 typedef struct {
748         MonoReflectionType *utype;
749         MonoArray *values;
750         MonoArray *names;
751 } MonoEnumInfo;
752
753 typedef struct {
754         MonoReflectionType *parent;
755         MonoReflectionType *ret;
756         guint32 attrs;
757         guint32 implattrs;
758         guint32 callconv;
759 } MonoMethodInfo;
760
761 typedef struct {
762         MonoReflectionType *parent;
763         MonoString *name;
764         MonoReflectionMethod *get;
765         MonoReflectionMethod *set;
766         guint32 attrs;
767 } MonoPropertyInfo;
768
769 typedef struct {
770         MonoReflectionType *declaring_type;
771         MonoReflectionType *reflected_type;
772         MonoString *name;
773         MonoReflectionMethod *add_method;
774         MonoReflectionMethod *remove_method;
775         MonoReflectionMethod *raise_method;
776         guint32 attrs;
777         MonoArray *other_methods;
778 } MonoEventInfo;
779
780 typedef struct {
781         MonoString *name;
782         MonoString *name_space;
783         MonoReflectionType *etype;
784         MonoReflectionType *nested_in;
785         MonoReflectionAssembly *assembly;
786         guint32 rank;
787         MonoBoolean isprimitive;
788 } MonoTypeInfo;
789
790 typedef struct {
791         MonoObject *member;
792         gint32 code_pos;
793 } MonoReflectionILTokenInfo;
794
795 typedef struct {
796         MonoObject object;
797         MonoArray *code;
798         gint32 code_len;
799         gint32 max_stack;
800         gint32 cur_stack;
801         MonoArray *locals;
802         MonoArray *ex_handlers;
803         gint32 num_token_fixups;
804         MonoArray *token_fixups;
805 } MonoReflectionILGen;
806
807 typedef struct {
808         MonoArray *handlers;
809         gint32 start;
810         gint32 len;
811         gint32 label;
812 } MonoILExceptionInfo;
813
814 typedef struct {
815         MonoObject *extype;
816         gint32 type;
817         gint32 start;
818         gint32 len;
819         gint32 filter_offset;
820 } MonoILExceptionBlock;
821
822 typedef struct {
823         MonoObject object;
824         MonoObject *catch_type;
825         gint32 filter_offset;
826         gint32 flags;
827         gint32 try_offset;
828         gint32 try_length;
829         gint32 handler_offset;
830         gint32 handler_length;
831 } MonoReflectionExceptionHandlingClause;
832
833 typedef struct {
834         MonoObject object;
835         MonoReflectionType *local_type;
836         MonoBoolean is_pinned;
837         guint16 local_index;
838 } MonoReflectionLocalVariableInfo;
839
840 typedef struct {
841         /*
842          * Must have the same layout as MonoReflectionLocalVariableInfo, since
843          * LocalBuilder inherits from it under net 2.0.
844          */
845         MonoObject object;
846         MonoObject *type;
847         MonoBoolean is_pinned;
848         guint16 local_index;
849         MonoString *name;
850 } MonoReflectionLocalBuilder;
851
852 typedef struct {
853         MonoObject object;
854         gint32 count;
855         gint32 type;
856         gint32 eltype;
857         MonoString *guid;
858         MonoString *mcookie;
859         MonoString *marshaltype;
860         MonoObject *marshaltyperef;
861         gint32 param_num;
862         MonoBoolean has_size;
863 } MonoReflectionMarshal;
864
865 typedef struct {
866         MonoObject object;
867         MonoObject* methodb;
868         MonoString *name;
869         MonoArray *cattrs;
870         MonoReflectionMarshal *marshal_info;
871         guint32 attrs;
872         int position;
873         guint32 table_idx;
874         MonoObject *def_value;
875 } MonoReflectionParamBuilder;
876
877 typedef struct {
878         MonoObject object;
879         MonoMethod *mhandle;
880         MonoReflectionILGen *ilgen;
881         MonoArray *parameters;
882         guint32 attrs;
883         guint32 iattrs;
884         guint32 table_idx;
885         guint32 call_conv;
886         MonoObject *type;
887         MonoArray *pinfo;
888         MonoArray *cattrs;
889         MonoBoolean init_locals;
890         MonoArray *param_modreq;
891         MonoArray *param_modopt;
892         MonoArray *permissions;
893 } MonoReflectionCtorBuilder;
894
895 typedef struct {
896         MonoObject object;
897         MonoMethod *mhandle;
898         MonoObject *rtype;
899         MonoArray *parameters;
900         guint32 attrs;
901         guint32 iattrs;
902         MonoString *name;
903         guint32 table_idx;
904         MonoArray *code;
905         MonoReflectionILGen *ilgen;
906         MonoObject *type;
907         MonoArray *pinfo;
908         MonoArray *cattrs;
909         MonoReflectionMethod *override_method;
910         MonoString *dll;
911         MonoString *dllentry;
912         guint32 charset;
913         guint32 extra_flags;
914         guint32 native_cc;
915         guint32 call_conv;
916         MonoBoolean init_locals;
917         MonoGenericContainer *generic_container;
918         MonoArray *generic_params;
919         MonoArray *return_modreq;
920         MonoArray *return_modopt;
921         MonoArray *param_modreq;
922         MonoArray *param_modopt;
923         MonoArray *permissions;
924 } MonoReflectionMethodBuilder;
925
926 typedef struct {
927         MonoObject object;
928         MonoMethod *mhandle;
929         MonoReflectionType *parent;
930         MonoReflectionType *ret;
931         MonoArray *parameters;
932         MonoString *name;
933         guint32 table_idx;
934         guint32 call_conv;
935 } MonoReflectionArrayMethod;
936
937 typedef struct {
938         MonoArray *data;
939         MonoString *name;
940         MonoString *filename;
941         guint32 attrs;
942         guint32 offset;
943         MonoObject *stream;
944 } MonoReflectionResource;
945
946 typedef struct {
947         guint32 res_type;
948         guint32 res_id;
949         guint32 lang_id;
950         MonoArray *res_data;
951 } MonoReflectionWin32Resource;
952
953 typedef struct {
954         guint32 action;
955         MonoString *pset;
956 } MonoReflectionPermissionSet;
957
958 typedef struct {
959         MonoReflectionAssembly assembly;
960         MonoDynamicAssembly *dynamic_assembly;
961         MonoReflectionMethod *entry_point;
962         MonoArray *modules;
963         MonoString *name;
964         MonoString *dir;
965         MonoArray *cattrs;
966         MonoArray *resources;
967         MonoArray *public_key;
968         MonoString *version;
969         MonoString *culture;
970         guint32 algid;
971         guint32 flags;
972         guint32 pekind;
973         MonoBoolean delay_sign;
974         guint32 access;
975         MonoArray *loaded_modules;
976         MonoArray *win32_resources;
977         /* CAS related */
978         MonoArray *permissions_minimum;
979         MonoArray *permissions_optional;
980         MonoArray *permissions_refused;
981         gint32 pe_kind;
982         gint32 machine;
983         MonoBoolean corlib_internal;
984         MonoArray *type_forwarders;
985         MonoArray *pktoken; /* as hexadecimal byte[] */
986 } MonoReflectionAssemblyBuilder;
987
988 typedef struct {
989         MonoObject object;
990         guint32 attrs;
991         MonoObject *type;
992         MonoString *name;
993         MonoObject *def_value;
994         gint32 offset;
995         gint32 table_idx;
996         MonoReflectionType *typeb;
997         MonoArray *rva_data;
998         MonoArray *cattrs;
999         MonoReflectionMarshal *marshal_info;
1000         MonoClassField *handle;
1001         MonoArray *modreq;
1002         MonoArray *modopt;
1003 } MonoReflectionFieldBuilder;
1004
1005 typedef struct {
1006         MonoObject object;
1007         guint32 attrs;
1008         MonoString *name;
1009         MonoObject *type;
1010         MonoArray *parameters;
1011         MonoArray *cattrs;
1012         MonoObject *def_value;
1013         MonoReflectionMethodBuilder *set_method;
1014         MonoReflectionMethodBuilder *get_method;
1015         gint32 table_idx;
1016 } MonoReflectionPropertyBuilder;
1017
1018 struct _MonoReflectionModule {
1019         MonoObject      obj;
1020         MonoImage  *image;
1021         MonoReflectionAssembly *assembly;
1022         MonoString *fqname;
1023         MonoString *name;
1024         MonoString *scopename;
1025         MonoBoolean is_resource;
1026         guint32 token;
1027 };
1028
1029 typedef struct {
1030         MonoReflectionModule module;
1031         MonoDynamicImage *dynamic_image;
1032         gint32     num_types;
1033         MonoArray *types;
1034         MonoArray *cattrs;
1035         MonoArray *guid;
1036         guint32    table_idx;
1037         MonoReflectionAssemblyBuilder *assemblyb;
1038         MonoArray *global_methods;
1039         MonoArray *global_fields;
1040         gboolean is_main;
1041         MonoArray *resources;
1042 } MonoReflectionModuleBuilder;
1043
1044 typedef struct {
1045         MonoReflectionType type;
1046         MonoString *name;
1047         MonoString *nspace;
1048         MonoObject *parent;
1049         MonoReflectionType *nesting_type;
1050         MonoArray *interfaces;
1051         gint32     num_methods;
1052         MonoArray *methods;
1053         MonoArray *ctors;
1054         MonoArray *properties;
1055         gint32     num_fields;
1056         MonoArray *fields;
1057         MonoArray *events;
1058         MonoArray *cattrs;
1059         MonoArray *subtypes;
1060         guint32 attrs;
1061         guint32 table_idx;
1062         MonoReflectionModuleBuilder *module;
1063         gint32 class_size;
1064         gint32 packing_size;
1065         MonoGenericContainer *generic_container;
1066         MonoArray *generic_params;
1067         MonoArray *permissions;
1068         MonoReflectionType *created;
1069 } MonoReflectionTypeBuilder;
1070
1071 typedef struct {
1072         MonoReflectionType type;
1073         MonoReflectionType *element_type;
1074         int rank;
1075 } MonoReflectionArrayType;
1076
1077 typedef struct {
1078         MonoReflectionType type;
1079         MonoReflectionType *element_type;
1080 } MonoReflectionDerivedType;
1081
1082 typedef struct {
1083         MonoReflectionType type;
1084         MonoReflectionTypeBuilder *tbuilder;
1085         MonoReflectionMethodBuilder *mbuilder;
1086         MonoString *name;
1087         guint32 index;
1088         MonoReflectionType *base_type;
1089         MonoArray *iface_constraints;
1090         MonoArray *cattrs;
1091         guint32 attrs;
1092 } MonoReflectionGenericParam;
1093
1094 typedef struct _MonoReflectionGenericClass MonoReflectionGenericClass;
1095 struct _MonoReflectionGenericClass {
1096         MonoReflectionType type;
1097         /* From System.MonoType */
1098         MonoObject *type_info;
1099         MonoReflectionTypeBuilder *generic_type;
1100         MonoArray *type_arguments;
1101         guint32 initialized;
1102 };
1103
1104 typedef struct {
1105         MonoObject  obj;
1106         MonoString *name;
1107         MonoString *codebase;
1108         gint32 major, minor, build, revision;
1109         MonoObject  *cultureInfo;
1110         guint32     flags;
1111         guint32     hashalg;
1112         MonoObject  *keypair;
1113         MonoArray   *publicKey;
1114         MonoArray   *keyToken;
1115         guint32     versioncompat;
1116         MonoObject *version;
1117         guint32     processor_architecture;
1118 } MonoReflectionAssemblyName;
1119
1120 typedef struct {
1121         MonoObject  obj;
1122         MonoString *name;
1123         MonoReflectionType *type;
1124         MonoReflectionTypeBuilder *typeb;
1125         MonoArray *cattrs;
1126         MonoReflectionMethodBuilder *add_method;
1127         MonoReflectionMethodBuilder *remove_method;
1128         MonoReflectionMethodBuilder *raise_method;
1129         MonoArray *other_methods;
1130         guint32 attrs;
1131         guint32 table_idx;
1132 } MonoReflectionEventBuilder;
1133
1134 typedef struct {
1135         MonoObject  obj;
1136         MonoReflectionMethod *ctor;
1137         MonoArray *data;
1138 } MonoReflectionCustomAttr;
1139
1140 typedef struct {
1141         MonoObject object;
1142         gint32 call_conv;
1143         gint32 charset;
1144         MonoString *dll;
1145         MonoString *entry_point;
1146         MonoBoolean exact_spelling;
1147         MonoBoolean preserve_sig;
1148         MonoBoolean set_last_error;
1149         MonoBoolean best_fit_mapping;
1150         MonoBoolean throw_on_unmappable;
1151 } MonoReflectionDllImportAttribute;
1152
1153 typedef struct {
1154         MonoObject object;
1155         gint32 call_conv;
1156         gint32 charset;
1157         MonoBoolean set_last_error;
1158         MonoBoolean best_fit_mapping;
1159         MonoBoolean throw_on_unmappable;
1160 } MonoReflectionUnmanagedFunctionPointerAttribute;
1161
1162 typedef struct {
1163         MonoObject object;
1164         MonoString *guid;
1165 } MonoReflectionGuidAttribute;
1166
1167 typedef struct {
1168         MonoObject object;
1169         MonoMethod *mhandle;
1170         MonoString *name;
1171         MonoReflectionType *rtype;
1172         MonoArray *parameters;
1173         guint32 attrs;
1174         guint32 call_conv;
1175         MonoReflectionModule *module;
1176         MonoBoolean skip_visibility;
1177         MonoBoolean init_locals;
1178         MonoReflectionILGen *ilgen;
1179         gint32 nrefs;
1180         MonoArray *refs;
1181         GSList *referenced_by;
1182         MonoReflectionType *owner;
1183 } MonoReflectionDynamicMethod;  
1184
1185 typedef struct {
1186         MonoObject object;
1187         MonoReflectionModuleBuilder *module;
1188         MonoArray *arguments;
1189         guint32 type;
1190         MonoReflectionType *return_type;
1191         guint32 call_conv;
1192         guint32 unmanaged_call_conv;
1193         MonoArray *modreqs;
1194         MonoArray *modopts;
1195 } MonoReflectionSigHelper;
1196
1197 typedef struct {
1198         MonoObject object;
1199         MonoReflectionGenericClass *inst;
1200         MonoReflectionFieldBuilder *fb;
1201 } MonoReflectionFieldOnTypeBuilderInst;
1202
1203 typedef struct {
1204         MonoObject object;
1205         MonoReflectionGenericClass *inst;
1206         MonoReflectionCtorBuilder *cb;
1207 } MonoReflectionCtorOnTypeBuilderInst;
1208
1209 typedef struct {
1210         MonoObject object;
1211         MonoReflectionGenericClass *inst;
1212         MonoReflectionMethodBuilder *mb;
1213         MonoArray *method_args;
1214         MonoReflectionMethodBuilder *generic_method_definition;
1215 } MonoReflectionMethodOnTypeBuilderInst;
1216
1217 typedef struct {
1218         MonoObject object;
1219         MonoBoolean visible;
1220 } MonoReflectionComVisibleAttribute;
1221
1222 enum {
1223         RESOURCE_LOCATION_EMBEDDED = 1,
1224         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
1225         RESOURCE_LOCATION_IN_MANIFEST = 4
1226 };
1227
1228 typedef struct {
1229         MonoObject object;
1230         MonoReflectionAssembly *assembly;
1231         MonoString *filename;
1232         guint32 location;
1233 } MonoManifestResourceInfo;
1234
1235 /* A boxed IntPtr */
1236 typedef struct {
1237         MonoObject object;
1238         gpointer m_value;
1239 } MonoIntPtr;
1240
1241 /* Keep in sync with System.GenericParameterAttributes */
1242 typedef enum {
1243         GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT         = 0,
1244         GENERIC_PARAMETER_ATTRIBUTE_COVARIANT           = 1,
1245         GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT       = 2,
1246         GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK       = 3,
1247
1248         GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT       = 0,
1249         GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT   = 4,
1250         GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT       = 8,
1251         GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT      = 16,
1252         GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK    = 28
1253 } GenericParameterAttributes;
1254
1255 void          mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file) MONO_INTERNAL;
1256 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly) MONO_INTERNAL;
1257 MonoReflectionModule * mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name) MONO_INTERNAL;
1258 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str) MONO_INTERNAL;
1259 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec, gboolean register_token) MONO_INTERNAL;
1260 guint32       mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types) MONO_INTERNAL;
1261 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module) MONO_INTERNAL;
1262 void          mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj) MONO_INTERNAL;
1263 void          mono_dynamic_image_free (MonoDynamicImage *image) MONO_INTERNAL;
1264 void          mono_image_set_wrappers_type (MonoReflectionModuleBuilder *mb, MonoReflectionType *type) MONO_INTERNAL;
1265
1266 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
1267
1268 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
1269
1270 void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
1271
1272 void        mono_reflection_create_generic_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
1273
1274 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb) MONO_INTERNAL;
1275
1276 void        mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides) MONO_INTERNAL;
1277
1278 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m) MONO_INTERNAL;
1279 void mono_reflection_destroy_dynamic_method (MonoReflectionDynamicMethod *mb) MONO_INTERNAL;
1280
1281 void        mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam) MONO_INTERNAL;
1282 void        mono_reflection_create_unmanaged_type (MonoReflectionType *type) MONO_INTERNAL;
1283
1284 MonoArray* mono_param_get_objects_internal  (MonoDomain *domain, MonoMethod *method, MonoClass *refclass) MONO_INTERNAL;
1285
1286 MonoClass*
1287 mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, gboolean is_dynamic) MONO_INTERNAL;
1288 MonoType*
1289 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types) MONO_INTERNAL;
1290 MonoReflectionMethod*
1291 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types) MONO_INTERNAL;
1292 void
1293 mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events) MONO_INTERNAL;
1294 MonoReflectionEvent *
1295 mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb) MONO_INTERNAL;
1296
1297 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig) MONO_INTERNAL;
1298
1299 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig) MONO_INTERNAL;
1300
1301 MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec) MONO_INTERNAL;
1302
1303 gpointer
1304 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean valid_token, MonoClass **handle_class, MonoGenericContext *context) MONO_INTERNAL;
1305
1306 gboolean
1307 mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass) MONO_INTERNAL;
1308
1309 gboolean
1310 mono_reflection_is_valid_dynamic_token (MonoDynamicImage *image, guint32 token) MONO_INTERNAL;
1311
1312 MonoType*
1313 mono_reflection_type_get_handle (MonoReflectionType *ref) MONO_INTERNAL;
1314
1315 void
1316 mono_image_build_metadata (MonoReflectionModuleBuilder *module) MONO_INTERNAL;
1317
1318 int
1319 mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value) MONO_INTERNAL;
1320
1321 void
1322 mono_release_type_locks (MonoThread *thread) MONO_INTERNAL;
1323
1324 char *
1325 mono_string_to_utf8_mp  (MonoMemPool *mp, MonoString *s) MONO_INTERNAL;
1326
1327 char *
1328 mono_string_to_utf8_image (MonoImage *image, MonoString *s) MONO_INTERNAL;
1329
1330
1331 MonoArray*
1332 mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array) MONO_INTERNAL;
1333
1334 void
1335 mono_array_full_copy (MonoArray *src, MonoArray *dest) MONO_INTERNAL;
1336
1337 gpointer
1338 mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy) MONO_INTERNAL;
1339
1340 void
1341 mono_upgrade_remote_class (MonoDomain *domain, MonoObject *tproxy, MonoClass *klass) MONO_INTERNAL;
1342
1343 gpointer
1344 mono_create_ftnptr (MonoDomain *domain, gpointer addr) MONO_INTERNAL;
1345
1346 gpointer
1347 mono_get_addr_from_ftnptr (gpointer descr) MONO_INTERNAL;
1348
1349 void
1350 mono_nullable_init (guint8 *buf, MonoObject *value, MonoClass *klass) MONO_INTERNAL;
1351
1352 MonoObject*
1353 mono_nullable_box (guint8 *buf, MonoClass *klass) MONO_INTERNAL;
1354
1355 #define MONO_IMT_SIZE 19
1356
1357 typedef union {
1358         int vtable_slot;
1359         gpointer target_code;
1360 } MonoImtItemValue;
1361
1362 typedef struct _MonoImtBuilderEntry {
1363         gpointer key;
1364         struct _MonoImtBuilderEntry *next;
1365         MonoImtItemValue value;
1366         int children;
1367         guint8 has_target_code : 1;
1368 } MonoImtBuilderEntry;
1369
1370 typedef struct _MonoIMTCheckItem MonoIMTCheckItem;
1371
1372 struct _MonoIMTCheckItem {
1373         gpointer          key;
1374         int               check_target_idx;
1375         MonoImtItemValue  value;
1376         guint8           *jmp_code;
1377         guint8           *code_target;
1378         guint8            is_equals;
1379         guint8            compare_done;
1380         guint8            chunk_size;
1381         guint8            short_branch;
1382         guint8            has_target_code;
1383 };
1384
1385 typedef gpointer (*MonoImtThunkBuilder) (MonoVTable *vtable, MonoDomain *domain,
1386                 MonoIMTCheckItem **imt_entries, int count, gpointer fail_trunk);
1387
1388 void
1389 mono_install_imt_thunk_builder (MonoImtThunkBuilder func) MONO_INTERNAL;
1390
1391 void
1392 mono_install_imt_trampoline (gpointer tramp) MONO_INTERNAL;
1393
1394 void
1395 mono_install_vtable_trampoline (gpointer tramp) MONO_INTERNAL;
1396
1397 void
1398 mono_vtable_build_imt_slot (MonoVTable* vtable, int imt_slot) MONO_INTERNAL;
1399
1400 guint32
1401 mono_method_get_imt_slot (MonoMethod *method) MONO_INTERNAL;
1402
1403 void
1404 mono_method_add_generic_virtual_invocation (MonoDomain *domain, MonoVTable *vtable,
1405                                                                                         gpointer *vtable_slot,
1406                                                                                         MonoMethod *method, gpointer code) MONO_INTERNAL;
1407
1408 gpointer
1409 mono_method_alloc_generic_virtual_thunk (MonoDomain *domain, int size) MONO_INTERNAL;
1410
1411 typedef enum {
1412         MONO_UNHANDLED_POLICY_LEGACY,
1413         MONO_UNHANDLED_POLICY_CURRENT
1414 } MonoRuntimeUnhandledExceptionPolicy;
1415
1416 MonoRuntimeUnhandledExceptionPolicy
1417 mono_runtime_unhandled_exception_policy_get (void) MONO_INTERNAL;
1418 void
1419 mono_runtime_unhandled_exception_policy_set (MonoRuntimeUnhandledExceptionPolicy policy) MONO_INTERNAL;
1420
1421 MonoVTable *
1422 mono_class_try_get_vtable (MonoDomain *domain, MonoClass *class) MONO_INTERNAL;
1423
1424 MonoException *
1425 mono_runtime_class_init_full (MonoVTable *vtable, gboolean raise_exception) MONO_INTERNAL;
1426
1427 void
1428 mono_method_clear_object (MonoDomain *domain, MonoMethod *method) MONO_INTERNAL;
1429
1430 void
1431 mono_class_compute_gc_descriptor (MonoClass *class) MONO_INTERNAL;
1432
1433 #endif /* __MONO_OBJECT_INTERNALS_H__ */
1434
1435