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