2003-11-24 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 } 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         MonoArray *types;
384         MonoArray *cattrs;
385         MonoArray *guid;
386         guint32    table_idx;
387         MonoReflectionAssemblyBuilder *assemblyb;
388         MonoArray *global_methods;
389         MonoArray *global_fields;
390         gboolean is_main;
391 } MonoReflectionModuleBuilder;
392
393 typedef struct {
394         MonoReflectionType type;
395         MonoString *name;
396         MonoString *nspace;
397         MonoReflectionType *parent;
398         MonoReflectionType *nesting_type;
399         MonoArray *interfaces;
400         MonoArray *methods;
401         MonoArray *ctors;
402         MonoArray *properties;
403         MonoArray *fields;
404         MonoArray *events;
405         MonoArray *cattrs;
406         MonoArray *subtypes;
407         guint32 attrs;
408         guint32 table_idx;
409         MonoReflectionModuleBuilder *module;
410         gint32 class_size;
411         gint32 packing_size;
412         MonoArray *generic_params;
413 } MonoReflectionTypeBuilder;
414
415 typedef struct {
416         MonoObject obj;
417         MonoGenericParam *param;
418         MonoReflectionType *type;
419         MonoString *name;
420         guint32 flags;
421         MonoArray *constraints;
422 } MonoReflectionGenericParam;
423
424 typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
425 struct _MonoReflectionGenericInst {
426         MonoReflectionType type;
427         MonoClass *klass;
428         MonoReflectionGenericInst *parent;
429         MonoReflectionType *generic_type;
430         MonoArray *interfaces;
431         MonoArray *methods;
432         MonoArray *ctors;
433         MonoArray *fields;
434 };
435
436 typedef struct {
437         MonoReflectionMethod rmethod;
438         MonoReflectionMethod *declaring;
439         MonoReflectionGenericInst *declaring_type;
440         MonoReflectionGenericInst *reflected_type;
441         MonoGenericInst *ginst;
442 } MonoReflectionInflatedMethod;
443
444 typedef struct {
445         MonoReflectionField rfield;
446         MonoClassField *declaring;
447         MonoReflectionGenericInst *declaring_type;
448         MonoReflectionGenericInst *reflected_type;
449 } MonoReflectionInflatedField;
450
451 typedef struct {
452         MonoObject  obj;
453         MonoString *name;
454         MonoString *codebase;
455         gint32 major, minor, build, revision;
456         /* FIXME: add missing stuff */
457 /*      CultureInfo cultureinfo;
458         AssemblyNameFlags flags;
459         AssemblyHashAlgorithm hashalg;
460         StrongNameKeyPair keypair;
461         AssemblyVersionCompatibility versioncompat;*/
462         MonoObject  *cultureInfo;
463         guint32     flags;
464         guint32     hashalg;
465         MonoObject  *keypair;
466         MonoArray   *publicKey;
467         MonoArray   *keyToken;
468         MonoObject  *versioncompat;
469 } MonoReflectionAssemblyName;
470
471 typedef struct {
472         MonoObject  obj;
473         MonoString *name;
474         MonoReflectionType *type;
475         MonoReflectionTypeBuilder *typeb;
476         MonoArray *cattrs;
477         MonoReflectionMethodBuilder *add_method;
478         MonoReflectionMethodBuilder *remove_method;
479         MonoReflectionMethodBuilder *raise_method;
480         MonoArray *other_methods;
481         guint32 attrs;
482         guint32 table_idx;
483 } MonoReflectionEventBuilder;
484
485 typedef struct {
486         MonoObject  obj;
487         MonoReflectionMethod *ctor;
488         MonoArray *data;
489 } MonoReflectionCustomAttr;
490
491 typedef struct {
492         MonoObject object;
493         MonoMethod *mhandle;
494         MonoString *name;
495         MonoReflectionType *rtype;
496         MonoArray *parameters;
497         guint32 attrs;
498         guint32 call_conv;
499         MonoReflectionModule *module;
500         MonoBoolean skip_visibility;
501         MonoBoolean init_locals;
502         MonoReflectionILGen *ilgen;
503         gint32 nrefs;
504         MonoArray *refs;
505 } MonoReflectionDynamicMethod;  
506
507 typedef struct MonoTypeNameParse MonoTypeNameParse;
508
509 struct MonoTypeNameParse {
510         char *name_space;
511         char *name;
512         MonoAssemblyName assembly;
513         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
514         GList *nested;
515 };
516
517 typedef struct {
518         MonoObject object;
519         MonoReflectionModuleBuilder *module;
520         MonoArray *arguments;
521         guint32 type;
522         MonoReflectionType *return_type;
523         guint32 call_conv;
524         guint32 unmanaged_call_conv;
525 } MonoReflectionSigHelper;
526
527 typedef struct {
528         MonoMethod *ctor;
529         guint32     data_size;
530         const guchar* data;
531 } MonoCustomAttrEntry;
532
533 typedef struct {
534         int num_attrs;
535         MonoImage *image;
536         MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
537 } MonoCustomAttrInfo;
538
539 enum {
540         RESOURCE_LOCATION_EMBEDDED = 1,
541         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
542         RESOURCE_LOCATION_IN_MANIFEST = 4
543 };
544
545 typedef struct {
546         MonoObject object;
547         MonoReflectionAssembly *assembly;
548         MonoString *filename;
549         guint32 location;
550 } MonoManifestResourceInfo;
551
552 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
553 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
554 MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
555
556 void          mono_image_create_pefile (MonoReflectionModuleBuilder *module);
557 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
558 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
559 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj);
560 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
561
562 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
563 MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
564 MonoReflectionModule*   mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index);
565 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
566 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
567 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
568 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
569 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
570 /* note: this one is slightly different: we keep the whole array of params in the cache */
571 MonoArray* mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
572
573 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
574 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
575
576 MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
577 MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
578 MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
579 MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
580 MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
581 MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
582 MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
583 MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
584 MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
585 void                mono_custom_attrs_free          (MonoCustomAttrInfo *ainfo);
586
587 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
588
589 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
590
591 void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
592
593 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
594
595 void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
596
597 MonoReflectionType *mono_reflection_define_generic_parameter (MonoReflectionTypeBuilder *tb, MonoReflectionMethodBuilder *mb, guint32 index, MonoReflectionGenericParam *gparam);
598
599 MonoReflectionGenericInst*
600 mono_reflection_bind_generic_parameters (MonoReflectionType *type, MonoArray *types);
601 MonoReflectionInflatedMethod*
602 mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
603 MonoReflectionInflatedMethod*
604 mono_reflection_inflate_method_or_ctor (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
605 MonoReflectionInflatedField*
606 mono_reflection_inflate_field (MonoReflectionGenericInst *declaring_type, MonoReflectionGenericInst *reflected_type, MonoObject *obj);
607
608 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
609
610 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
611
612 gpointer
613 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
614
615 void
616 mono_image_build_metadata (MonoReflectionModuleBuilder *module);
617
618 #endif /* __METADATA_REFLECTION_H__ */
619