2003-12-20 Zoltan Varga <vargaz@freemail.hu>
[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         MonoArray *permissions;
208 } MonoReflectionCtorBuilder;
209
210 typedef struct {
211         MonoObject object;
212         MonoMethod *mhandle;
213         MonoReflectionType *rtype;
214         MonoArray *parameters;
215         guint32 attrs;
216         guint32 iattrs;
217         MonoString *name;
218         guint32 table_idx;
219         MonoArray *code;
220         MonoReflectionILGen *ilgen;
221         MonoObject *type;
222         MonoArray *pinfo;
223         MonoArray *cattrs;
224         MonoReflectionMethod *override_method;
225         MonoString *dll;
226         MonoString *dllentry;
227         guint32 charset;
228         guint32 native_cc;
229         guint32 call_conv;
230         MonoBoolean init_locals;
231         MonoArray *generic_params;
232         MonoArray *return_modreq;
233         MonoArray *return_modopt;
234         MonoArray *param_modreq;
235         MonoArray *param_modopt;
236         MonoArray *permissions;
237 } MonoReflectionMethodBuilder;
238
239 typedef struct {
240         MonoObject object;
241         MonoMethod *mhandle;
242         MonoReflectionType *parent;
243         MonoReflectionType *ret;
244         MonoArray *parameters;
245         MonoString *name;
246         guint32 table_idx;
247         guint32 call_conv;
248 } MonoReflectionArrayMethod;
249
250 /* 
251  * Information which isn't in the MonoMethod structure is stored here for
252  * dynamic methods.
253  */
254 typedef struct {
255         char **param_names;
256         MonoMarshalSpec **param_marshall;
257 } MonoReflectionMethodAux;
258
259 enum {
260         MONO_SECTION_TEXT,
261         MONO_SECTION_RSRC,
262         MONO_SECTION_RELOC,
263         MONO_SECTION_MAX
264 };
265
266 typedef struct {
267         MonoAssembly assembly;
268         gboolean run;
269         gboolean save;
270         char *strong_name;
271         guint32 strong_name_size;
272 } MonoDynamicAssembly;
273
274 typedef struct {
275         MonoImage image;
276         guint32 meta_size;
277         guint32 text_rva;
278         guint32 metadata_rva;
279         guint32 image_base;
280         guint32 cli_header_offset;
281         guint32 iat_offset;
282         guint32 idt_offset;
283         guint32 ilt_offset;
284         guint32 imp_names_offset;
285         struct {
286                 guint32 rva;
287                 guint32 size;
288                 guint32 offset;
289                 guint32 attrs;
290         } sections [MONO_SECTION_MAX];
291         GHashTable *typeref;
292         GHashTable *handleref;
293         MonoGHashTable *tokens;
294         MonoGHashTable *blob_cache;
295         GList *array_methods;
296         MonoGHashTable *token_fixups;
297         MonoGHashTable *method_to_table_idx;
298         MonoGHashTable *field_to_table_idx;
299         MonoGHashTable *method_aux_hash;
300         gboolean run;
301         gboolean save;
302         char *strong_name;
303         guint32 strong_name_size;
304         MonoDynamicStream pefile;
305         MonoDynamicStream sheap;
306         MonoDynamicStream code; /* used to store method headers and bytecode */
307         MonoDynamicStream resources; /* managed embedded resources */
308         MonoDynamicStream us;
309         MonoDynamicStream blob;
310         MonoDynamicStream tstream;
311         MonoDynamicStream guid;
312         MonoDynamicTable tables [64];
313 } MonoDynamicImage;
314
315 typedef struct {
316         MonoArray *data;
317         MonoString *name;
318         MonoString *filename;
319         guint32 attrs;
320         guint32 offset;
321 } MonoReflectionResource;
322
323 typedef struct {
324         guint32 action;
325         MonoString *pset;
326 } MonoReflectionPermissionSet;
327
328 typedef struct {
329         MonoReflectionAssembly assembly;
330         MonoDynamicAssembly *dynamic_assembly;
331         MonoReflectionMethodBuilder *entry_point;
332         MonoArray *modules;
333         MonoString *name;
334         MonoString *dir;
335         MonoArray *cattrs;
336         MonoArray *resources;
337         MonoArray *public_key;
338         MonoString *version;
339         MonoString *culture;
340         guint32 algid;
341         guint32 flags;
342         guint32 pekind;
343         MonoBoolean delay_sign;
344         guint32 access;
345         MonoArray *loaded_modules;
346 } MonoReflectionAssemblyBuilder;
347
348 typedef struct {
349         MonoObject object;
350         guint32 attrs;
351         MonoReflectionType *type;
352         MonoString *name;
353         MonoObject *def_value;
354         gint32 offset;
355         gint32 table_idx;
356         MonoReflectionType *typeb;
357         MonoArray *rva_data;
358         MonoArray *cattrs;
359         MonoReflectionMarshal *marshal_info;
360         MonoClassField *handle;
361         MonoArray *modreq;
362         MonoArray *modopt;
363 } MonoReflectionFieldBuilder;
364
365 typedef struct {
366         MonoObject object;
367         guint32 attrs;
368         MonoString *name;
369         MonoReflectionType *type;
370         MonoArray *parameters;
371         MonoArray *cattrs;
372         MonoObject *def_value;
373         MonoReflectionMethodBuilder *set_method;
374         MonoReflectionMethodBuilder *get_method;
375         gint32 table_idx;
376 } MonoReflectionPropertyBuilder;
377
378 typedef struct {
379         MonoObject      obj;
380         MonoImage  *image;
381         MonoReflectionAssembly *assembly;
382         MonoString *fqname;
383         MonoString *name;
384         MonoString *scopename;
385         MonoBoolean is_resource;
386 } MonoReflectionModule;
387
388 typedef struct {
389         MonoReflectionModule module;
390         MonoDynamicImage *dynamic_image;
391         gint32     num_types;
392         MonoArray *types;
393         MonoArray *cattrs;
394         MonoArray *guid;
395         guint32    table_idx;
396         MonoReflectionAssemblyBuilder *assemblyb;
397         MonoArray *global_methods;
398         MonoArray *global_fields;
399         gboolean is_main;
400         MonoArray *resources;
401 } MonoReflectionModuleBuilder;
402
403 typedef struct {
404         MonoReflectionType type;
405         MonoString *name;
406         MonoString *nspace;
407         MonoReflectionType *parent;
408         MonoReflectionType *nesting_type;
409         MonoArray *interfaces;
410         gint32     num_methods;
411         MonoArray *methods;
412         MonoArray *ctors;
413         MonoArray *properties;
414         gint32     num_fields;
415         MonoArray *fields;
416         MonoArray *events;
417         MonoArray *cattrs;
418         MonoArray *subtypes;
419         guint32 attrs;
420         guint32 table_idx;
421         MonoReflectionModuleBuilder *module;
422         gint32 class_size;
423         gint32 packing_size;
424         MonoArray *generic_params;
425 } MonoReflectionTypeBuilder;
426
427 typedef struct {
428         MonoReflectionType type;
429         MonoObject *refobj;
430         guint32 index;
431         MonoString *name;
432         guint32 flags;
433         MonoArray *constraints;
434         guint32 initialized;
435 } MonoReflectionGenericParam;
436
437 typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
438 struct _MonoReflectionGenericInst {
439         MonoReflectionType type;
440         MonoClass *klass;
441         MonoReflectionGenericInst *parent;
442         MonoReflectionType *generic_type;
443         MonoArray *interfaces;
444         MonoArray *methods;
445         MonoArray *ctors;
446         MonoArray *fields;
447 };
448
449 typedef struct {
450         MonoReflectionMethod rmethod;
451         MonoReflectionMethod *declaring;
452         MonoReflectionGenericInst *declaring_type;
453         MonoReflectionGenericInst *reflected_type;
454         MonoGenericInst *ginst;
455 } MonoReflectionInflatedMethod;
456
457 typedef struct {
458         MonoReflectionField rfield;
459         MonoClassField *declaring;
460         MonoReflectionGenericInst *declaring_type;
461         MonoReflectionGenericInst *reflected_type;
462 } MonoReflectionInflatedField;
463
464 typedef struct {
465         MonoObject  obj;
466         MonoString *name;
467         MonoString *codebase;
468         gint32 major, minor, build, revision;
469         /* FIXME: add missing stuff */
470 /*      CultureInfo cultureinfo;
471         AssemblyNameFlags flags;
472         AssemblyHashAlgorithm hashalg;
473         StrongNameKeyPair keypair;
474         AssemblyVersionCompatibility versioncompat;*/
475         MonoObject  *cultureInfo;
476         guint32     flags;
477         guint32     hashalg;
478         MonoObject  *keypair;
479         MonoArray   *publicKey;
480         MonoArray   *keyToken;
481         MonoObject  *versioncompat;
482 } MonoReflectionAssemblyName;
483
484 typedef struct {
485         MonoObject  obj;
486         MonoString *name;
487         MonoReflectionType *type;
488         MonoReflectionTypeBuilder *typeb;
489         MonoArray *cattrs;
490         MonoReflectionMethodBuilder *add_method;
491         MonoReflectionMethodBuilder *remove_method;
492         MonoReflectionMethodBuilder *raise_method;
493         MonoArray *other_methods;
494         guint32 attrs;
495         guint32 table_idx;
496 } MonoReflectionEventBuilder;
497
498 typedef struct {
499         MonoObject  obj;
500         MonoReflectionMethod *ctor;
501         MonoArray *data;
502 } MonoReflectionCustomAttr;
503
504 typedef struct {
505         MonoObject object;
506         MonoMethod *mhandle;
507         MonoString *name;
508         MonoReflectionType *rtype;
509         MonoArray *parameters;
510         guint32 attrs;
511         guint32 call_conv;
512         MonoReflectionModule *module;
513         MonoBoolean skip_visibility;
514         MonoBoolean init_locals;
515         MonoReflectionILGen *ilgen;
516         gint32 nrefs;
517         MonoArray *refs;
518 } MonoReflectionDynamicMethod;  
519
520 typedef struct MonoTypeNameParse MonoTypeNameParse;
521
522 struct MonoTypeNameParse {
523         char *name_space;
524         char *name;
525         MonoAssemblyName assembly;
526         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
527         GList *nested;
528 };
529
530 typedef struct {
531         MonoObject object;
532         MonoReflectionModuleBuilder *module;
533         MonoArray *arguments;
534         guint32 type;
535         MonoReflectionType *return_type;
536         guint32 call_conv;
537         guint32 unmanaged_call_conv;
538 } MonoReflectionSigHelper;
539
540 typedef struct {
541         MonoMethod *ctor;
542         guint32     data_size;
543         const guchar* data;
544 } MonoCustomAttrEntry;
545
546 typedef struct {
547         int num_attrs;
548         MonoImage *image;
549         MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
550 } MonoCustomAttrInfo;
551
552 enum {
553         RESOURCE_LOCATION_EMBEDDED = 1,
554         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
555         RESOURCE_LOCATION_IN_MANIFEST = 4
556 };
557
558 typedef struct {
559         MonoObject object;
560         MonoReflectionAssembly *assembly;
561         MonoString *filename;
562         guint32 location;
563 } MonoManifestResourceInfo;
564
565 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
566 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
567 MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
568
569 void          mono_image_create_pefile (MonoReflectionModuleBuilder *module);
570 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
571 MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
572 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
573 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj);
574 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
575
576 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
577 MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
578 MonoReflectionModule*   mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index);
579 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
580 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
581 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
582 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
583 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
584 /* note: this one is slightly different: we keep the whole array of params in the cache */
585 MonoArray* mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
586
587 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
588 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
589
590 MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
591 MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
592 MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
593 MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
594 MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
595 MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
596 MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
597 MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
598 MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
599 void                mono_custom_attrs_free          (MonoCustomAttrInfo *ainfo);
600
601 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
602
603 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
604
605 void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
606
607 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
608
609 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
610
611 MonoReflectionGenericParam *mono_reflection_define_generic_parameter (MonoReflectionTypeBuilder *tb, MonoReflectionMethodBuilder *mb, MonoString *name, guint32 index);
612 void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
613
614 MonoReflectionGenericInst*
615 mono_reflection_bind_generic_parameters (MonoReflectionType *type, MonoArray *types);
616 MonoReflectionInflatedMethod*
617 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
618 MonoReflectionInflatedMethod*
619 mono_reflection_inflate_method_or_ctor (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
620 MonoReflectionInflatedField*
621 mono_reflection_inflate_field (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
622
623 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
624
625 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
626
627 gpointer
628 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
629
630 void
631 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
632
633 #endif /* __METADATA_REFLECTION_H__ */
634