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