file-io.c: Don't consider sockets as directory and avoid an endless loop. Fix bug...
[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         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 */
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         gint32 region_id;
377         MonoString *iso2name;
378         MonoString *iso3name;
379         MonoString *win3name;
380         MonoString *english_name;
381         MonoString *currency_symbol;
382         MonoString *iso_currency_symbol;
383         MonoString *currency_english_name;
384 } MonoRegionInfo;
385
386 typedef struct {
387         MonoObject obj;
388         MonoString *str;
389         gint32 options;
390         MonoArray *key;
391         gint32 lcid;
392 } MonoSortKey;
393
394 /* used to free a dynamic method */
395 typedef void        (*MonoFreeMethodFunc)        (MonoDomain *domain, MonoMethod *method);
396
397 /* Used to initialize the method pointers inside vtables */
398 typedef gboolean    (*MonoInitVTableFunc)    (MonoVTable *vtable);
399
400 /* remoting and async support */
401
402 MonoAsyncResult *
403 mono_async_result_new       (MonoDomain *domain, HANDLE handle, 
404                              MonoObject *state, gpointer data);
405
406 MonoWaitHandle *
407 mono_wait_handle_new        (MonoDomain *domain, HANDLE handle);
408
409 void
410 mono_message_init           (MonoDomain *domain, MonoMethodMessage *this_obj, 
411                              MonoReflectionMethod *method, MonoArray *out_args);
412
413 MonoObject *
414 mono_remoting_invoke        (MonoObject *real_proxy, MonoMethodMessage *msg, 
415                              MonoObject **exc, MonoArray **out_args);
416
417 MonoObject *
418 mono_message_invoke         (MonoObject *target, MonoMethodMessage *msg, 
419                              MonoObject **exc, MonoArray **out_args);
420
421 MonoMethodMessage *
422 mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *invoke, 
423                               MonoDelegate **cb, MonoObject **state);
424
425 void
426 mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoArray *out_args);
427
428 void
429 mono_delegate_ctor          (MonoObject *this_obj, MonoObject *target, gpointer addr);
430
431 void*
432 mono_class_get_allocation_ftn (MonoVTable *vtable, gboolean for_box, gboolean *pass_size_in_words);
433
434 void
435 mono_runtime_free_method    (MonoDomain *domain, MonoMethod *method);
436
437 /* runtime initialization functions */
438 typedef void (*MonoExceptionFunc) (MonoException *ex);
439
440 void
441 mono_install_handler        (MonoExceptionFunc func);
442
443 void        
444 mono_install_runtime_invoke (MonoInvokeFunc func);
445
446 void        
447 mono_install_compile_method (MonoCompileFunc func);
448
449 void
450 mono_install_free_method    (MonoFreeMethodFunc func);
451
452 void
453 mono_install_init_vtable    (MonoInitVTableFunc func);
454
455 void
456 mono_type_initialization_init (void);
457
458 guint32
459 mono_thread_get_tls_key    (void);
460
461 gint32
462 mono_thread_get_tls_offset (void);
463
464 guint32
465 mono_domain_get_tls_key    (void);
466
467 gint32
468 mono_domain_get_tls_offset (void);
469
470 /* Reflection and Reflection.Emit support */
471
472 /*
473  * The following structure must match the C# implementation in our corlib.
474  */
475
476 struct _MonoReflectionMethod {
477         MonoObject object;
478         MonoMethod *method;
479         MonoString *name;
480         MonoReflectionType *reftype;
481 };
482
483 typedef struct _MonoReflectionGenericMethod MonoReflectionGenericMethod;
484 struct _MonoReflectionGenericMethod {
485         MonoReflectionMethod method;
486 };
487
488 struct _MonoDelegate {
489         MonoObject object;
490         MonoObject *target_type;
491         MonoObject *target;
492         MonoString *method_name;
493         gpointer method_ptr;
494         gpointer delegate_trampoline;
495         MonoReflectionMethod *method_info;
496 };
497
498 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
499 struct _MonoMulticastDelegate {
500         MonoDelegate delegate;
501         MonoMulticastDelegate *prev;
502 };
503
504 struct _MonoReflectionField {
505         MonoObject object;
506         MonoClass *klass;
507         MonoClassField *field;
508         MonoString *name;
509         MonoReflectionType *type;
510         guint32 attrs;
511 };
512
513 struct _MonoReflectionProperty {
514         MonoObject object;
515         MonoClass *klass;
516         MonoProperty *property;
517 };
518
519 struct _MonoReflectionEvent {
520         MonoObject object;
521         MonoClass *klass;
522         MonoEvent *event;
523 };
524
525 typedef struct {
526         MonoObject object;
527         MonoReflectionType *ClassImpl;
528         MonoObject *DefaultValueImpl;
529         MonoObject *MemberImpl;
530         MonoString *NameImpl;
531         gint32 PositionImpl;
532         guint32 AttrsImpl;
533         MonoObject *MarshalAsImpl;
534 } MonoReflectionParameter;
535
536 struct _MonoReflectionMethodBody {
537         MonoObject object;
538         MonoArray *clauses;
539         MonoArray *locals;
540         MonoArray *il;
541         MonoBoolean init_locals;
542         guint32 local_var_sig_token;
543         guint32 max_stack;
544 };
545
546 struct _MonoReflectionAssembly {
547         MonoObject object;
548         MonoAssembly *assembly;
549         MonoObject *resolve_event_holder;
550         /* CAS related */
551         MonoObject *evidence;   /* Evidence */
552         MonoObject *minimum;    /* PermissionSet - for SecurityAction.RequestMinimum */
553         MonoObject *optional;   /* PermissionSet - for SecurityAction.RequestOptional */
554         MonoObject *refuse;     /* PermissionSet - for SecurityAction.RequestRefuse */
555         MonoObject *granted;    /* PermissionSet - for the resolved assembly granted permissions */
556         MonoObject *denied;     /* PermissionSet - for the resolved assembly denied permissions */
557         /* */
558         MonoBoolean from_byte_array;
559 };
560
561 typedef struct {
562         MonoReflectionType *utype;
563         MonoArray *values;
564         MonoArray *names;
565 } MonoEnumInfo;
566
567 typedef struct {
568         MonoReflectionType *parent;
569         MonoReflectionType *ret;
570         guint32 attrs;
571         guint32 implattrs;
572         guint32 callconv;
573 } MonoMethodInfo;
574
575 typedef struct {
576         MonoReflectionType *parent;
577         MonoString *name;
578         MonoReflectionMethod *get;
579         MonoReflectionMethod *set;
580         guint32 attrs;
581 } MonoPropertyInfo;
582
583 typedef struct {
584         MonoReflectionType *declaring_type;
585         MonoReflectionType *reflected_type;
586         MonoString *name;
587         MonoReflectionMethod *add_method;
588         MonoReflectionMethod *remove_method;
589         MonoReflectionMethod *raise_method;
590         guint32 attrs;
591         MonoArray *other_methods;
592 } MonoEventInfo;
593
594 typedef struct {
595         MonoString *name;
596         MonoString *name_space;
597         MonoReflectionType *etype;
598         MonoReflectionType *nested_in;
599         MonoReflectionAssembly *assembly;
600         guint32 rank;
601         MonoBoolean isprimitive;
602 } MonoTypeInfo;
603
604 typedef struct {
605         MonoObject *member;
606         gint32 code_pos;
607 } MonoReflectionILTokenInfo;
608
609 typedef struct {
610         MonoObject object;
611         MonoArray *code;
612         gint32 code_len;
613         gint32 max_stack;
614         gint32 cur_stack;
615         MonoArray *locals;
616         MonoArray *ex_handlers;
617         gint32 num_token_fixups;
618         MonoArray *token_fixups;
619 } MonoReflectionILGen;
620
621 typedef struct {
622         MonoArray *handlers;
623         gint32 start;
624         gint32 len;
625         gint32 label;
626 } MonoILExceptionInfo;
627
628 typedef struct {
629         MonoReflectionType *extype;
630         gint32 type;
631         gint32 start;
632         gint32 len;
633         gint32 filter_offset;
634 } MonoILExceptionBlock;
635
636 typedef struct {
637         MonoObject object;
638         MonoReflectionType *catch_type;
639         gint32 filter_offset;
640         gint32 flags;
641         gint32 try_offset;
642         gint32 try_length;
643         gint32 handler_offset;
644         gint32 handler_length;
645 } MonoReflectionExceptionHandlingClause;
646
647 typedef struct {
648         MonoObject object;
649         MonoReflectionType *local_type;
650         MonoBoolean is_pinned;
651         guint16 local_index;
652 } MonoReflectionLocalVariableInfo;
653
654 typedef struct {
655         /*
656          * Must have the same layout as MonoReflectionLocalVariableInfo, since
657          * LocalBuilder inherits from it under net 2.0.
658          */
659         MonoObject object;
660         MonoReflectionType *type;
661         MonoBoolean is_pinned;
662         guint16 local_index;
663         MonoString *name;
664 } MonoReflectionLocalBuilder;
665
666 typedef struct {
667         MonoObject object;
668         gint32 count;
669         gint32 type;
670         gint32 eltype;
671         MonoString *guid;
672         MonoString *mcookie;
673         MonoString *marshaltype;
674         MonoReflectionType *marshaltyperef;
675         gint32 param_num;
676         MonoBoolean has_size;
677 } MonoReflectionMarshal;
678
679 typedef struct {
680         MonoObject object;
681         MonoObject* methodb;
682         MonoString *name;
683         MonoArray *cattrs;
684         MonoReflectionMarshal *marshal_info;
685         guint32 attrs;
686         int position;
687         guint32 table_idx;
688         MonoObject *def_value;
689 } MonoReflectionParamBuilder;
690
691 typedef struct {
692         MonoObject object;
693         MonoMethod *mhandle;
694         MonoReflectionILGen *ilgen;
695         MonoArray *parameters;
696         guint32 attrs;
697         guint32 iattrs;
698         guint32 table_idx;
699         guint32 call_conv;
700         MonoObject *type;
701         MonoArray *pinfo;
702         MonoArray *cattrs;
703         MonoBoolean init_locals;
704         MonoArray *param_modreq;
705         MonoArray *param_modopt;
706         MonoArray *permissions;
707 } MonoReflectionCtorBuilder;
708
709 typedef struct {
710         MonoObject object;
711         MonoMethod *mhandle;
712         MonoReflectionType *rtype;
713         MonoArray *parameters;
714         guint32 attrs;
715         guint32 iattrs;
716         MonoString *name;
717         guint32 table_idx;
718         MonoArray *code;
719         MonoReflectionILGen *ilgen;
720         MonoObject *type;
721         MonoArray *pinfo;
722         MonoArray *cattrs;
723         MonoReflectionMethod *override_method;
724         MonoString *dll;
725         MonoString *dllentry;
726         guint32 charset;
727         guint32 extra_flags;
728         guint32 native_cc;
729         guint32 call_conv;
730         MonoBoolean init_locals;
731         MonoGenericContainer *generic_container;
732         MonoArray *generic_params;
733         MonoArray *return_modreq;
734         MonoArray *return_modopt;
735         MonoArray *param_modreq;
736         MonoArray *param_modopt;
737         MonoArray *permissions;
738 } MonoReflectionMethodBuilder;
739
740 typedef struct {
741         MonoObject object;
742         MonoMethod *mhandle;
743         MonoReflectionType *parent;
744         MonoReflectionType *ret;
745         MonoArray *parameters;
746         MonoString *name;
747         guint32 table_idx;
748         guint32 call_conv;
749 } MonoReflectionArrayMethod;
750
751 typedef struct {
752         MonoArray *data;
753         MonoString *name;
754         MonoString *filename;
755         guint32 attrs;
756         guint32 offset;
757 } MonoReflectionResource;
758
759 typedef struct {
760         guint32 res_type;
761         guint32 res_id;
762         guint32 lang_id;
763         MonoArray *res_data;
764 } MonoReflectionWin32Resource;
765
766 typedef struct {
767         guint32 action;
768         MonoString *pset;
769 } MonoReflectionPermissionSet;
770
771 typedef struct {
772         MonoReflectionAssembly assembly;
773         MonoDynamicAssembly *dynamic_assembly;
774         MonoReflectionMethod *entry_point;
775         MonoArray *modules;
776         MonoString *name;
777         MonoString *dir;
778         MonoArray *cattrs;
779         MonoArray *resources;
780         MonoArray *public_key;
781         MonoString *version;
782         MonoString *culture;
783         guint32 algid;
784         guint32 flags;
785         guint32 pekind;
786         MonoBoolean delay_sign;
787         guint32 access;
788         MonoArray *loaded_modules;
789         MonoArray *win32_resources;
790         /* CAS related */
791         MonoArray *permissions_minimum;
792         MonoArray *permissions_optional;
793         MonoArray *permissions_refused;
794         gint32 pe_kind;
795         gint32 machine;
796         MonoBoolean corlib_internal;
797 } MonoReflectionAssemblyBuilder;
798
799 typedef struct {
800         MonoObject object;
801         guint32 attrs;
802         MonoReflectionType *type;
803         MonoString *name;
804         MonoObject *def_value;
805         gint32 offset;
806         gint32 table_idx;
807         MonoReflectionType *typeb;
808         MonoArray *rva_data;
809         MonoArray *cattrs;
810         MonoReflectionMarshal *marshal_info;
811         MonoClassField *handle;
812         MonoArray *modreq;
813         MonoArray *modopt;
814 } MonoReflectionFieldBuilder;
815
816 typedef struct {
817         MonoObject object;
818         guint32 attrs;
819         MonoString *name;
820         MonoReflectionType *type;
821         MonoArray *parameters;
822         MonoArray *cattrs;
823         MonoObject *def_value;
824         MonoReflectionMethodBuilder *set_method;
825         MonoReflectionMethodBuilder *get_method;
826         gint32 table_idx;
827 } MonoReflectionPropertyBuilder;
828
829 struct _MonoReflectionModule {
830         MonoObject      obj;
831         MonoImage  *image;
832         MonoReflectionAssembly *assembly;
833         MonoString *fqname;
834         MonoString *name;
835         MonoString *scopename;
836         MonoBoolean is_resource;
837         guint32 token;
838 };
839
840 typedef struct {
841         MonoReflectionModule module;
842         MonoDynamicImage *dynamic_image;
843         gint32     num_types;
844         MonoArray *types;
845         MonoArray *cattrs;
846         MonoArray *guid;
847         guint32    table_idx;
848         MonoReflectionAssemblyBuilder *assemblyb;
849         MonoArray *global_methods;
850         MonoArray *global_fields;
851         gboolean is_main;
852         MonoArray *resources;
853 } MonoReflectionModuleBuilder;
854
855 typedef struct {
856         MonoReflectionType type;
857         MonoString *name;
858         MonoString *nspace;
859         MonoReflectionType *parent;
860         MonoReflectionType *nesting_type;
861         MonoArray *interfaces;
862         gint32     num_methods;
863         MonoArray *methods;
864         MonoArray *ctors;
865         MonoArray *properties;
866         gint32     num_fields;
867         MonoArray *fields;
868         MonoArray *events;
869         MonoArray *cattrs;
870         MonoArray *subtypes;
871         guint32 attrs;
872         guint32 table_idx;
873         MonoReflectionModuleBuilder *module;
874         gint32 class_size;
875         gint32 packing_size;
876         MonoGenericContainer *generic_container;
877         MonoArray *generic_params;
878         MonoArray *permissions;
879         MonoReflectionType *created;
880 } MonoReflectionTypeBuilder;
881
882 typedef struct {
883         MonoReflectionType type;
884         MonoReflectionTypeBuilder *tbuilder;
885         MonoReflectionMethodBuilder *mbuilder;
886         MonoString *name;
887         guint32 index;
888         MonoReflectionType *base_type;
889         MonoArray *iface_constraints;
890         MonoArray *cattrs;
891         guint32 attrs;
892 } MonoReflectionGenericParam;
893
894 typedef struct _MonoReflectionGenericClass MonoReflectionGenericClass;
895 struct _MonoReflectionGenericClass {
896         MonoReflectionType type;
897         MonoReflectionType *generic_type;
898         guint32 initialized;
899 };
900
901 typedef struct {
902         MonoObject  obj;
903         MonoString *name;
904         MonoString *codebase;
905         gint32 major, minor, build, revision;
906         MonoObject  *cultureInfo;
907         guint32     flags;
908         guint32     hashalg;
909         MonoObject  *keypair;
910         MonoArray   *publicKey;
911         MonoArray   *keyToken;
912         guint32     versioncompat;
913         MonoObject *version;
914 } MonoReflectionAssemblyName;
915
916 typedef struct {
917         MonoObject  obj;
918         MonoString *name;
919         MonoReflectionType *type;
920         MonoReflectionTypeBuilder *typeb;
921         MonoArray *cattrs;
922         MonoReflectionMethodBuilder *add_method;
923         MonoReflectionMethodBuilder *remove_method;
924         MonoReflectionMethodBuilder *raise_method;
925         MonoArray *other_methods;
926         guint32 attrs;
927         guint32 table_idx;
928 } MonoReflectionEventBuilder;
929
930 typedef struct {
931         MonoObject  obj;
932         MonoReflectionMethod *ctor;
933         MonoArray *data;
934 } MonoReflectionCustomAttr;
935
936 typedef struct {
937         MonoObject object;
938         gint32 call_conv;
939         gint32 charset;
940         MonoString *dll;
941         MonoString *entry_point;
942         MonoBoolean exact_spelling;
943         MonoBoolean preserve_sig;
944         MonoBoolean set_last_error;
945         MonoBoolean best_fit_mapping;
946         MonoBoolean throw_on_unmappable;
947 } MonoReflectionDllImportAttribute;
948
949 typedef struct {
950         MonoObject object;
951         gint32 call_conv;
952         gint32 charset;
953         MonoBoolean set_last_error;
954         MonoBoolean best_fit_mapping;
955         MonoBoolean throw_on_unmappable;
956 } MonoReflectionUnmanagedFunctionPointerAttribute;
957
958 typedef struct {
959         MonoObject object;
960         MonoMethod *mhandle;
961         MonoString *name;
962         MonoReflectionType *rtype;
963         MonoArray *parameters;
964         guint32 attrs;
965         guint32 call_conv;
966         MonoReflectionModule *module;
967         MonoBoolean skip_visibility;
968         MonoBoolean init_locals;
969         MonoReflectionILGen *ilgen;
970         gint32 nrefs;
971         MonoArray *refs;
972 } MonoReflectionDynamicMethod;  
973
974 typedef struct {
975         MonoObject object;
976         MonoReflectionModuleBuilder *module;
977         MonoArray *arguments;
978         guint32 type;
979         MonoReflectionType *return_type;
980         guint32 call_conv;
981         guint32 unmanaged_call_conv;
982 } MonoReflectionSigHelper;
983
984 enum {
985         RESOURCE_LOCATION_EMBEDDED = 1,
986         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
987         RESOURCE_LOCATION_IN_MANIFEST = 4
988 };
989
990 typedef struct {
991         MonoObject object;
992         MonoReflectionAssembly *assembly;
993         MonoString *filename;
994         guint32 location;
995 } MonoManifestResourceInfo;
996
997 /* Keep in sync with System.GenericParameterAttributes */
998 typedef enum {
999         GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT         = 0,
1000         GENERIC_PARAMETER_ATTRIBUTE_COVARIANT           = 1,
1001         GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT       = 2,
1002         GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK       = 3,
1003
1004         GENERIC_PARAMETER_ATTRIBUTE_NO_SPECIAL_CONSTRAINT       = 0,
1005         GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT   = 4,
1006         GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT       = 8,
1007         GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT      = 16,
1008         GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK    = 28
1009 } GenericParameterAttributes;
1010
1011 void          mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file);
1012 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
1013 MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
1014 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
1015 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec);
1016 guint32       mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types);
1017 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
1018
1019 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
1020
1021 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
1022
1023 void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
1024
1025 void        mono_reflection_create_generic_class  (MonoReflectionTypeBuilder *tb);
1026
1027 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
1028
1029 void        mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides);
1030
1031 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
1032
1033 void        mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
1034
1035 MonoType*
1036 mono_class_bind_generic_parameters (MonoType *type, int type_argc, MonoType **types);
1037 MonoType*
1038 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
1039 MonoReflectionMethod*
1040 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
1041 void
1042 mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
1043 MonoReflectionEvent *
1044 mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
1045
1046 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
1047
1048 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
1049
1050 MonoReflectionMarshal* mono_reflection_marshal_from_marshal_spec (MonoDomain *domain, MonoClass *klass, MonoMarshalSpec *spec);
1051
1052 gpointer
1053 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, MonoClass **handle_class);
1054
1055 gboolean
1056 mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass);
1057
1058 void
1059 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
1060
1061 int
1062 mono_get_constant_value_from_blob (MonoDomain* domain, MonoTypeEnum type, const char *blob, void *value);
1063
1064 void
1065 mono_release_type_locks (MonoThread *thread);
1066
1067 MonoArray*
1068 mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array);
1069
1070 void
1071 mono_array_full_copy (MonoArray *src, MonoArray *dest);
1072
1073 gpointer
1074 mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRealProxy *real_proxy);
1075
1076 MonoMethodSignature*
1077 mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context);
1078
1079 void
1080 mono_upgrade_remote_class (MonoDomain *domain, MonoObject *tproxy, MonoClass *klass);
1081
1082 gpointer
1083 mono_get_addr_from_ftnptr (gpointer descr);
1084
1085 void
1086 mono_nullable_init (guint8 *buf, MonoObject *value, MonoClass *klass);
1087
1088 MonoObject*
1089 mono_nullable_box (guint8 *buf, MonoClass *klass);
1090
1091 #endif /* __MONO_OBJECT_INTERNALS_H__ */
1092