2003-12-10 Bernie Solomon <bernard@ugsolutions.com>
[mono.git] / mono / metadata / reflection.h
1 #ifndef __METADATA_REFLECTION_H__
2 #define __METADATA_REFLECTION_H__
3
4 #include <mono/metadata/image.h>
5 #include <mono/metadata/metadata.h>
6 #include <mono/metadata/class.h>
7 #include <mono/metadata/object.h>
8 #include <mono/utils/mono-hash.h>
9
10 typedef struct {
11         GHashTable *hash;
12         char *data;
13         guint32 alloc_size; /* malloced bytes */
14         guint32 index;
15         guint32 offset; /* from start of metadata */
16 } MonoDynamicStream;
17
18 typedef struct {
19         guint32 alloc_rows;
20         guint32 rows;
21         guint32 row_size; /*  calculated later with column_sizes */
22         guint32 columns;
23         guint32 column_sizes [9]; 
24         guint32 *values; /* rows * columns */
25         guint32 next_idx;
26 } MonoDynamicTable;
27
28 /*
29  * The followinbg structure must match the C# implementation in our corlib.
30  */
31
32 struct _MonoReflectionMethod {
33         MonoObject object;
34         MonoMethod *method;
35         MonoString *name;
36         MonoReflectionType *reftype;
37 };
38
39 struct _MonoDelegate {
40         MonoObject object;
41         MonoObject *target_type;
42         MonoObject *target;
43         MonoString *method_name;
44         gpointer method_ptr;
45         gpointer delegate_trampoline;
46         MonoReflectionMethod *method_info;
47 };
48
49 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
50 struct _MonoMulticastDelegate {
51         MonoDelegate delegate;
52         MonoMulticastDelegate *prev;
53 };
54
55 typedef struct {
56         MonoObject object;
57         MonoClass *klass;
58         MonoClassField *field;
59         MonoString *name;
60         MonoReflectionType *type;
61         guint32 attrs;
62 } MonoReflectionField;
63
64 typedef struct {
65         MonoObject object;
66         MonoClass *klass;
67         MonoProperty *property;
68 } MonoReflectionProperty;
69
70 typedef struct {
71         MonoObject object;
72         MonoClass *klass;
73         MonoEvent *event;
74 } MonoReflectionEvent;
75
76 typedef struct {
77         MonoObject object;
78         MonoReflectionType *ClassImpl;
79         MonoObject *DefaultValueImpl;
80         MonoObject *MemberImpl;
81         MonoString *NameImpl;
82         gint32 PositionImpl;
83         guint32 AttrsImpl;
84 } MonoReflectionParameter;
85
86 typedef struct {
87         MonoObject object;
88         MonoAssembly *assembly;
89 } MonoReflectionAssembly;
90
91 typedef struct {
92         MonoReflectionType *utype;
93         MonoArray *values;
94         MonoArray *names;
95 } MonoEnumInfo;
96
97 typedef struct {
98         MonoReflectionType *parent;
99         MonoReflectionType *ret;
100         guint32 attrs;
101         guint32 implattrs;
102         guint32 callconv;
103 } MonoMethodInfo;
104
105 typedef struct {
106         MonoReflectionType *parent;
107         MonoString *name;
108         MonoReflectionMethod *get;
109         MonoReflectionMethod *set;
110         guint32 attrs;
111 } MonoPropertyInfo;
112
113 typedef struct {
114         MonoReflectionType *parent;
115         MonoString *name;
116         MonoReflectionMethod *add_method;
117         MonoReflectionMethod *remove_method;
118         MonoReflectionMethod *raise_method;
119         guint32 attrs;
120 } MonoEventInfo;
121
122 typedef struct {
123         MonoString *name;
124         MonoString *name_space;
125         MonoReflectionType *etype;
126         MonoReflectionType *nested_in;
127         MonoReflectionAssembly *assembly;
128         guint32 rank;
129         MonoBoolean isprimitive;
130 } MonoTypeInfo;
131
132 typedef struct {
133         MonoObject *member;
134         gint32 code_pos;
135 } MonoReflectionILTokenInfo;
136
137 typedef struct {
138         MonoObject object;
139         MonoArray *code;
140         gint32 code_len;
141         gint32 max_stack;
142         gint32 cur_stack;
143         MonoArray *locals;
144         MonoArray *ex_handlers;
145         gint32 num_token_fixups;
146         MonoArray *token_fixups;
147 } MonoReflectionILGen;
148
149 typedef struct {
150         MonoArray *handlers;
151         gint32 start;
152         gint32 len;
153         gint32 label;
154 } MonoILExceptionInfo;
155
156 typedef struct {
157         MonoReflectionType *extype;
158         gint32 type;
159         gint32 start;
160         gint32 len;
161         gint32 filter_offset;
162 } MonoILExceptionBlock;
163
164 typedef struct {
165         MonoObject object;
166         MonoReflectionType *type;
167         MonoString *name;
168 } MonoReflectionLocalBuilder;
169
170 typedef struct {
171         MonoObject object;
172         gint32 count;
173         gint32 type;
174         gint32 eltype;
175         MonoString *guid;
176         MonoString *mcookie;
177         MonoString *marshaltype;
178         MonoReflectionType *marshaltyperef;
179 } MonoReflectionMarshal;
180
181 typedef struct {
182         MonoObject object;
183         MonoObject* methodb;
184         MonoString *name;
185         MonoArray *cattrs;
186         MonoReflectionMarshal *marshal_info;
187         guint32 attrs;
188         int position;
189         guint32 table_idx;
190 } MonoReflectionParamBuilder;
191
192 typedef struct {
193         MonoObject object;
194         MonoMethod *mhandle;
195         MonoReflectionILGen *ilgen;
196         MonoArray *parameters;
197         guint32 attrs;
198         guint32 iattrs;
199         guint32 table_idx;
200         guint32 call_conv;
201         MonoObject *type;
202         MonoArray *pinfo;
203         MonoArray *cattrs;
204         MonoBoolean init_locals;
205         MonoArray *param_modreq;
206         MonoArray *param_modopt;
207 } MonoReflectionCtorBuilder;
208
209 typedef struct {
210         MonoObject object;
211         MonoMethod *mhandle;
212         MonoReflectionType *rtype;
213         MonoArray *parameters;
214         guint32 attrs;
215         guint32 iattrs;
216         MonoString *name;
217         guint32 table_idx;
218         MonoArray *code;
219         MonoReflectionILGen *ilgen;
220         MonoObject *type;
221         MonoArray *pinfo;
222         MonoArray *cattrs;
223         MonoReflectionMethod *override_method;
224         MonoString *dll;
225         MonoString *dllentry;
226         guint32 charset;
227         guint32 native_cc;
228         guint32 call_conv;
229         MonoBoolean init_locals;
230         MonoArray *generic_params;
231         MonoArray *return_modreq;
232         MonoArray *return_modopt;
233         MonoArray *param_modreq;
234         MonoArray *param_modopt;
235 } MonoReflectionMethodBuilder;
236
237 typedef struct {
238         MonoObject object;
239         MonoMethod *mhandle;
240         MonoReflectionType *parent;
241         MonoReflectionType *ret;
242         MonoArray *parameters;
243         MonoString *name;
244         guint32 table_idx;
245         guint32 call_conv;
246 } MonoReflectionArrayMethod;
247
248 /* 
249  * Information which isn't in the MonoMethod structure is stored here for
250  * dynamic methods.
251  */
252 typedef struct {
253         char **param_names;
254         MonoMarshalSpec **param_marshall;
255 } MonoReflectionMethodAux;
256
257 enum {
258         MONO_SECTION_TEXT,
259         MONO_SECTION_RSRC,
260         MONO_SECTION_RELOC,
261         MONO_SECTION_MAX
262 };
263
264 typedef struct {
265         MonoAssembly assembly;
266         gboolean run;
267         gboolean save;
268         char *strong_name;
269         guint32 strong_name_size;
270 } MonoDynamicAssembly;
271
272 typedef struct {
273         MonoImage image;
274         guint32 meta_size;
275         guint32 text_rva;
276         guint32 metadata_rva;
277         guint32 image_base;
278         guint32 cli_header_offset;
279         guint32 iat_offset;
280         guint32 idt_offset;
281         guint32 ilt_offset;
282         guint32 imp_names_offset;
283         struct {
284                 guint32 rva;
285                 guint32 size;
286                 guint32 offset;
287                 guint32 attrs;
288         } sections [MONO_SECTION_MAX];
289         GHashTable *typeref;
290         GHashTable *handleref;
291         MonoGHashTable *tokens;
292         MonoGHashTable *blob_cache;
293         GList *array_methods;
294         MonoGHashTable *token_fixups;
295         MonoGHashTable *method_to_table_idx;
296         MonoGHashTable *field_to_table_idx;
297         MonoGHashTable *method_aux_hash;
298         gboolean run;
299         gboolean save;
300         char *strong_name;
301         guint32 strong_name_size;
302         MonoDynamicStream pefile;
303         MonoDynamicStream sheap;
304         MonoDynamicStream code; /* used to store method headers and bytecode */
305         MonoDynamicStream resources; /* managed embedded resources */
306         MonoDynamicStream us;
307         MonoDynamicStream blob;
308         MonoDynamicStream tstream;
309         MonoDynamicStream guid;
310         MonoDynamicTable tables [64];
311 } MonoDynamicImage;
312
313 typedef struct {
314         MonoArray *data;
315         MonoString *name;
316         MonoString *filename;
317         guint32 attrs;
318 } MonoReflectionResource;
319
320 typedef struct {
321         MonoReflectionAssembly assembly;
322         MonoDynamicAssembly *dynamic_assembly;
323         MonoReflectionMethodBuilder *entry_point;
324         MonoArray *modules;
325         MonoString *name;
326         MonoString *dir;
327         MonoArray *cattrs;
328         MonoArray *resources;
329         MonoArray *public_key;
330         MonoString *version;
331         MonoString *culture;
332         guint32 algid;
333         guint32 flags;
334         guint32 pekind;
335         MonoBoolean delay_sign;
336         guint32 access;
337         gpointer main_module;
338 } MonoReflectionAssemblyBuilder;
339
340 typedef struct {
341         MonoObject object;
342         guint32 attrs;
343         MonoReflectionType *type;
344         MonoString *name;
345         MonoObject *def_value;
346         gint32 offset;
347         gint32 table_idx;
348         MonoReflectionType *typeb;
349         MonoArray *rva_data;
350         MonoArray *cattrs;
351         MonoReflectionMarshal *marshal_info;
352         MonoClassField *handle;
353         MonoArray *modreq;
354         MonoArray *modopt;
355 } MonoReflectionFieldBuilder;
356
357 typedef struct {
358         MonoObject object;
359         guint32 attrs;
360         MonoString *name;
361         MonoReflectionType *type;
362         MonoArray *parameters;
363         MonoArray *cattrs;
364         MonoObject *def_value;
365         MonoReflectionMethodBuilder *set_method;
366         MonoReflectionMethodBuilder *get_method;
367         gint32 table_idx;
368 } MonoReflectionPropertyBuilder;
369
370 typedef struct {
371         MonoObject      obj;
372         MonoImage  *image;
373         MonoReflectionAssembly *assembly;
374         MonoString *fqname;
375         MonoString *name;
376         MonoString *scopename;
377         MonoBoolean is_resource;
378 } MonoReflectionModule;
379
380 typedef struct {
381         MonoReflectionModule module;
382         MonoDynamicImage *dynamic_image;
383         gint32     num_types;
384         MonoArray *types;
385         MonoArray *cattrs;
386         MonoArray *guid;
387         guint32    table_idx;
388         MonoReflectionAssemblyBuilder *assemblyb;
389         MonoArray *global_methods;
390         MonoArray *global_fields;
391         gboolean is_main;
392 } MonoReflectionModuleBuilder;
393
394 typedef struct {
395         MonoReflectionType type;
396         MonoString *name;
397         MonoString *nspace;
398         MonoReflectionType *parent;
399         MonoReflectionType *nesting_type;
400         MonoArray *interfaces;
401         gint32     num_methods;
402         MonoArray *methods;
403         MonoArray *ctors;
404         MonoArray *properties;
405         gint32     num_fields;
406         MonoArray *fields;
407         MonoArray *events;
408         MonoArray *cattrs;
409         MonoArray *subtypes;
410         guint32 attrs;
411         guint32 table_idx;
412         MonoReflectionModuleBuilder *module;
413         gint32 class_size;
414         gint32 packing_size;
415         MonoArray *generic_params;
416 } MonoReflectionTypeBuilder;
417
418 typedef struct {
419         MonoReflectionType type;
420         MonoObject *refobj;
421         guint32 index;
422         MonoString *name;
423         guint32 flags;
424         MonoArray *constraints;
425         guint32 initialized;
426 } MonoReflectionGenericParam;
427
428 typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
429 struct _MonoReflectionGenericInst {
430         MonoReflectionType type;
431         MonoClass *klass;
432         MonoReflectionGenericInst *parent;
433         MonoReflectionType *generic_type;
434         MonoArray *interfaces;
435         MonoArray *methods;
436         MonoArray *ctors;
437         MonoArray *fields;
438 };
439
440 typedef struct {
441         MonoReflectionMethod rmethod;
442         MonoReflectionMethod *declaring;
443         MonoReflectionGenericInst *declaring_type;
444         MonoReflectionGenericInst *reflected_type;
445         MonoGenericInst *ginst;
446 } MonoReflectionInflatedMethod;
447
448 typedef struct {
449         MonoReflectionField rfield;
450         MonoClassField *declaring;
451         MonoReflectionGenericInst *declaring_type;
452         MonoReflectionGenericInst *reflected_type;
453 } MonoReflectionInflatedField;
454
455 typedef struct {
456         MonoObject  obj;
457         MonoString *name;
458         MonoString *codebase;
459         gint32 major, minor, build, revision;
460         /* FIXME: add missing stuff */
461 /*      CultureInfo cultureinfo;
462         AssemblyNameFlags flags;
463         AssemblyHashAlgorithm hashalg;
464         StrongNameKeyPair keypair;
465         AssemblyVersionCompatibility versioncompat;*/
466         MonoObject  *cultureInfo;
467         guint32     flags;
468         guint32     hashalg;
469         MonoObject  *keypair;
470         MonoArray   *publicKey;
471         MonoArray   *keyToken;
472         MonoObject  *versioncompat;
473 } MonoReflectionAssemblyName;
474
475 typedef struct {
476         MonoObject  obj;
477         MonoString *name;
478         MonoReflectionType *type;
479         MonoReflectionTypeBuilder *typeb;
480         MonoArray *cattrs;
481         MonoReflectionMethodBuilder *add_method;
482         MonoReflectionMethodBuilder *remove_method;
483         MonoReflectionMethodBuilder *raise_method;
484         MonoArray *other_methods;
485         guint32 attrs;
486         guint32 table_idx;
487 } MonoReflectionEventBuilder;
488
489 typedef struct {
490         MonoObject  obj;
491         MonoReflectionMethod *ctor;
492         MonoArray *data;
493 } MonoReflectionCustomAttr;
494
495 typedef struct {
496         MonoObject object;
497         MonoMethod *mhandle;
498         MonoString *name;
499         MonoReflectionType *rtype;
500         MonoArray *parameters;
501         guint32 attrs;
502         guint32 call_conv;
503         MonoReflectionModule *module;
504         MonoBoolean skip_visibility;
505         MonoBoolean init_locals;
506         MonoReflectionILGen *ilgen;
507         gint32 nrefs;
508         MonoArray *refs;
509 } MonoReflectionDynamicMethod;  
510
511 typedef struct MonoTypeNameParse MonoTypeNameParse;
512
513 struct MonoTypeNameParse {
514         char *name_space;
515         char *name;
516         MonoAssemblyName assembly;
517         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
518         GList *nested;
519 };
520
521 typedef struct {
522         MonoObject object;
523         MonoReflectionModuleBuilder *module;
524         MonoArray *arguments;
525         guint32 type;
526         MonoReflectionType *return_type;
527         guint32 call_conv;
528         guint32 unmanaged_call_conv;
529 } MonoReflectionSigHelper;
530
531 typedef struct {
532         MonoMethod *ctor;
533         guint32     data_size;
534         const guchar* data;
535 } MonoCustomAttrEntry;
536
537 typedef struct {
538         int num_attrs;
539         MonoImage *image;
540         MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
541 } MonoCustomAttrInfo;
542
543 enum {
544         RESOURCE_LOCATION_EMBEDDED = 1,
545         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
546         RESOURCE_LOCATION_IN_MANIFEST = 4
547 };
548
549 typedef struct {
550         MonoObject object;
551         MonoReflectionAssembly *assembly;
552         MonoString *filename;
553         guint32 location;
554 } MonoManifestResourceInfo;
555
556 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
557 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
558 MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
559
560 void          mono_image_create_pefile (MonoReflectionModuleBuilder *module);
561 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
562 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
563 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj);
564 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
565
566 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
567 MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
568 MonoReflectionModule*   mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index);
569 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
570 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
571 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
572 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
573 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
574 /* note: this one is slightly different: we keep the whole array of params in the cache */
575 MonoArray* mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
576
577 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
578 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
579
580 MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
581 MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
582 MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
583 MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
584 MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
585 MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
586 MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
587 MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
588 MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
589 void                mono_custom_attrs_free          (MonoCustomAttrInfo *ainfo);
590
591 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
592
593 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
594
595 void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
596
597 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
598
599 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
600
601 MonoReflectionGenericParam *mono_reflection_define_generic_parameter (MonoReflectionTypeBuilder *tb, MonoReflectionMethodBuilder *mb, MonoString *name, guint32 index);
602 void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
603
604 MonoReflectionGenericInst*
605 mono_reflection_bind_generic_parameters (MonoReflectionType *type, MonoArray *types);
606 MonoReflectionInflatedMethod*
607 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
608 MonoReflectionInflatedMethod*
609 mono_reflection_inflate_method_or_ctor (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
610 MonoReflectionInflatedField*
611 mono_reflection_inflate_field (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
612
613 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
614
615 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
616
617 gpointer
618 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
619
620 void
621 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
622
623 #endif /* __METADATA_REFLECTION_H__ */
624