2003-05-19 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 } MonoReflectionField;
60
61 typedef struct {
62         MonoObject object;
63         MonoClass *klass;
64         MonoProperty *property;
65 } MonoReflectionProperty;
66
67 typedef struct {
68         MonoObject object;
69         MonoClass *klass;
70         MonoEvent *event;
71 } MonoReflectionEvent;
72
73 typedef struct {
74         MonoObject object;
75         MonoReflectionType *ClassImpl;
76         MonoObject *DefaultValueImpl;
77         MonoObject *MemberImpl;
78         MonoString *NameImpl;
79         gint32 PositionImpl;
80         guint32 AttrsImpl;
81 } MonoReflectionParameter;
82
83 typedef struct {
84         MonoObject object;
85         MonoAssembly *assembly;
86 } MonoReflectionAssembly;
87
88 typedef struct {
89         MonoReflectionType *utype;
90         MonoArray *values;
91         MonoArray *names;
92 } MonoEnumInfo;
93
94 typedef struct {
95         MonoReflectionType *parent;
96         MonoReflectionType *ret;
97         guint32 attrs;
98         guint32 implattrs;
99 } MonoMethodInfo;
100
101 typedef struct {
102         MonoReflectionType *parent;
103         MonoString *name;
104         MonoReflectionMethod *get;
105         MonoReflectionMethod *set;
106         guint32 attrs;
107 } MonoPropertyInfo;
108
109 typedef struct {
110         MonoReflectionType *parent;
111         MonoString *name;
112         MonoReflectionMethod *add_method;
113         MonoReflectionMethod *remove_method;
114         MonoReflectionMethod *raise_method;
115         guint32 attrs;
116 } MonoEventInfo;
117
118 typedef struct {
119         MonoReflectionType *parent;
120         MonoReflectionType *type;
121         MonoString *name;
122         guint32 attrs;
123 } MonoFieldInfo;
124
125 typedef struct {
126         MonoString *name;
127         MonoString *name_space;
128         MonoReflectionType *etype;
129         MonoReflectionType *nested_in;
130         MonoReflectionAssembly *assembly;
131         guint32 rank;
132         MonoBoolean isprimitive;
133 } MonoTypeInfo;
134
135 typedef struct {
136         MonoObject *member;
137         gint32 code_pos;
138 } MonoReflectionILTokenInfo;
139
140 typedef struct {
141         MonoObject object;
142         MonoArray *code;
143         MonoObject *mbuilder;
144         gint32 code_len;
145         gint32 max_stack;
146         gint32 cur_stack;
147         MonoArray *locals;
148         MonoArray *ex_handlers;
149         gint32 num_token_fixups;
150         MonoArray *token_fixups;
151 } MonoReflectionILGen;
152
153 typedef struct {
154         MonoArray *handlers;
155         gint32 start;
156         gint32 len;
157         gint32 label;
158 } MonoILExceptionInfo;
159
160 typedef struct {
161         MonoReflectionType *extype;
162         gint32 type;
163         gint32 start;
164         gint32 len;
165         gint32 filter_offset;
166 } MonoILExceptionBlock;
167
168 typedef struct {
169         MonoObject object;
170         MonoReflectionType *type;
171         MonoString *name;
172 } MonoReflectionLocalBuilder;
173
174 typedef struct {
175         MonoObject object;
176         gint32 count;
177         gint32 type;
178         gint32 eltype;
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 } MonoReflectionCtorBuilder;
206
207 typedef struct {
208         MonoObject object;
209         MonoMethod *mhandle;
210         MonoReflectionType *rtype;
211         MonoArray *parameters;
212         guint32 attrs;
213         guint32 iattrs;
214         MonoString *name;
215         guint32 table_idx;
216         MonoArray *code;
217         MonoReflectionILGen *ilgen;
218         MonoObject *type;
219         MonoArray *pinfo;
220         MonoArray *cattrs;
221         MonoReflectionMethod *override_method;
222         MonoString *dll;
223         MonoString *dllentry;
224         guint32 charset;
225         guint32 native_cc;
226         guint32 call_conv;
227         MonoBoolean init_locals;
228 } MonoReflectionMethodBuilder;
229
230 typedef struct {
231         MonoObject object;
232         MonoMethod *mhandle;
233         MonoReflectionType *parent;
234         MonoReflectionType *ret;
235         MonoArray *parameters;
236         MonoString *name;
237         guint32 table_idx;
238         guint32 call_conv;
239 } MonoReflectionArrayMethod;
240
241 enum {
242         MONO_SECTION_TEXT,
243         MONO_SECTION_RSRC,
244         MONO_SECTION_RELOC,
245         MONO_SECTION_MAX
246 };
247
248 typedef struct {
249         MonoAssembly assembly;
250         guint32 meta_size;
251         guint32 text_rva;
252         guint32 metadata_rva;
253         guint32 image_base;
254         guint32 cli_header_offset;
255         guint32 iat_offset;
256         guint32 idt_offset;
257         guint32 ilt_offset;
258         guint32 imp_names_offset;
259         struct {
260                 guint32 rva;
261                 guint32 size;
262                 guint32 offset;
263                 guint32 attrs;
264         } sections [MONO_SECTION_MAX];
265         GHashTable *typeref;
266         GHashTable *handleref;
267         MonoGHashTable *tokens;
268         MonoGHashTable *blob_cache;
269         GList *array_methods;
270         MonoGHashTable *token_fixups;
271         MonoGHashTable *method_to_table_idx;
272         MonoGHashTable *field_to_table_idx;
273         gboolean run;
274         gboolean save;
275         char *strong_name;
276         guint32 strong_name_size;
277         MonoDynamicStream pefile;
278         MonoDynamicStream sheap;
279         MonoDynamicStream code; /* used to store method headers and bytecode */
280         MonoDynamicStream resources; /* managed embedded resources */
281         MonoDynamicStream us;
282         MonoDynamicStream blob;
283         MonoDynamicStream tstream;
284         MonoDynamicStream guid;
285         MonoDynamicTable tables [64];
286 } MonoDynamicAssembly;
287
288 typedef struct {
289         MonoArray *data;
290         MonoString *name;
291         MonoString *filename;
292         guint32 attrs;
293 } MonoReflectionResource;
294
295 typedef struct {
296         MonoReflectionAssembly assembly;
297         MonoDynamicAssembly *dynamic_assembly;
298         MonoReflectionMethodBuilder *entry_point;
299         MonoArray *modules;
300         MonoString *name;
301         MonoString *dir;
302         MonoArray *cattrs;
303         MonoArray *resources;
304         MonoString *keyfile;
305         MonoString *version;
306         MonoString *culture;
307         guint32 algid;
308         guint32 flags;
309         guint32 pekind;
310         MonoBoolean delay_sign;
311         guint32 access;
312 } MonoReflectionAssemblyBuilder;
313
314 typedef struct {
315         MonoObject object;
316         guint32 attrs;
317         MonoReflectionType *type;
318         MonoString *name;
319         MonoObject *def_value;
320         gint32 offset;
321         gint32 table_idx;
322         MonoReflectionType *typeb;
323         MonoArray *rva_data;
324         MonoArray *cattrs;
325         MonoReflectionMarshal *marshal_info;
326         MonoClassField *handle;
327 } MonoReflectionFieldBuilder;
328
329 typedef struct {
330         MonoObject object;
331         guint32 attrs;
332         MonoString *name;
333         MonoReflectionType *type;
334         MonoArray *parameters;
335         MonoArray *cattrs;
336         MonoObject *def_value;
337         MonoReflectionMethodBuilder *set_method;
338         MonoReflectionMethodBuilder *get_method;
339         gint32 table_idx;
340 } MonoReflectionPropertyBuilder;
341
342 typedef struct {
343         MonoObject      obj;
344         MonoImage  *image;
345         MonoReflectionAssembly *assembly;
346         MonoString *fqname;
347         MonoString *name;
348         MonoString *scopename;
349         gboolean is_resource;
350 } MonoReflectionModule;
351
352 typedef struct {
353         MonoReflectionModule module;
354         MonoArray *types;
355         MonoArray *cattrs;
356         MonoArray *guid;
357         guint32    table_idx;
358         MonoReflectionAssemblyBuilder *assemblyb;
359         MonoArray *global_methods;
360         MonoArray *global_fields;
361 } MonoReflectionModuleBuilder;
362
363 typedef struct {
364         MonoReflectionType type;
365         MonoString *name;
366         MonoString *nspace;
367         MonoReflectionType *parent;
368         MonoReflectionType *nesting_type;
369         MonoArray *interfaces;
370         MonoArray *methods;
371         MonoArray *ctors;
372         MonoArray *properties;
373         MonoArray *fields;
374         MonoArray *events;
375         MonoArray *cattrs;
376         MonoArray *subtypes;
377         guint32 attrs;
378         guint32 table_idx;
379         MonoReflectionModuleBuilder *module;
380         gint32 class_size;
381         gint32 packing_size;
382 } MonoReflectionTypeBuilder;
383
384 typedef struct {
385         MonoObject  obj;
386         MonoString *name;
387         MonoString *codebase;
388         gint32 major, minor, build, revision;
389         /* FIXME: add missing stuff */
390 /*      CultureInfo cultureinfo;
391         AssemblyNameFlags flags;
392         AssemblyHashAlgorithm hashalg;
393         StrongNameKeyPair keypair;
394         AssemblyVersionCompatibility versioncompat;*/
395         MonoObject  *cultureInfo;
396         MonoObject  *flags;
397         MonoObject  *hashalg;
398         MonoObject  *keypair;
399         MonoArray   *publicKey;
400         MonoArray   *keyToken;
401         MonoObject  *versioncompat;
402 } MonoReflectionAssemblyName;
403
404 typedef struct {
405         MonoObject  obj;
406         MonoString *name;
407         MonoReflectionType *type;
408         MonoReflectionTypeBuilder *typeb;
409         MonoArray *cattrs;
410         MonoReflectionMethodBuilder *add_method;
411         MonoReflectionMethodBuilder *remove_method;
412         MonoReflectionMethodBuilder *raise_method;
413         MonoArray *other_methods;
414         guint32 attrs;
415         guint32 table_idx;
416 } MonoReflectionEventBuilder;
417
418 typedef struct {
419         MonoObject  obj;
420         MonoReflectionMethod *ctor;
421         MonoArray *data;
422 } MonoReflectionCustomAttr;
423
424 typedef struct MonoTypeNameParse MonoTypeNameParse;
425
426 struct MonoTypeNameParse {
427         char *name_space;
428         char *name;
429         MonoAssemblyName assembly;
430         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
431         GList *nested;
432 };
433
434 typedef struct {
435         MonoObject object;
436         MonoReflectionModuleBuilder *module;
437         MonoArray *arguments;
438         guint32 type;
439         MonoReflectionType *return_type;
440         guint32 call_conv;
441         guint32 unmanaged_call_conv;
442 } MonoReflectionSigHelper;
443
444 typedef struct {
445         MonoMethod *ctor;
446         guint32     data_size;
447         const guchar* data;
448 } MonoCustomAttrEntry;
449
450 typedef struct {
451         int num_attrs;
452         MonoImage *image;
453         MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
454 } MonoCustomAttrInfo;
455
456 enum {
457         RESOURCE_LOCATION_EMBEDDED = 1,
458         RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
459         RESOURCE_LOCATION_IN_MANIFEST = 4
460 };
461
462 typedef struct {
463         MonoObject object;
464         MonoReflectionAssembly *assembly;
465         MonoString *filename;
466         guint32 location;
467 } MonoManifestResourceInfo;
468
469 char*         mono_type_get_name         (MonoType *type);
470 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
471 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
472 MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
473
474 void          mono_image_create_pefile (MonoReflectionAssemblyBuilder *assembly);
475 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
476 guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
477 guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
478 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
479
480 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
481 MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
482 MonoReflectionModule*   mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index);
483 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
484 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
485 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
486 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
487 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
488 /* note: this one is slightly different: we keep the whole array of params in the cache */
489 MonoReflectionParameter** mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
490
491 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
492 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
493
494 MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
495 MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
496 MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
497 MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
498 MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
499 MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
500 MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
501 MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
502 MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
503 void                mono_custom_attrs_free          (MonoCustomAttrInfo *ainfo);
504
505 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
506
507 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
508
509 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
510
511 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
512
513 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
514
515 gpointer
516 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
517
518 void
519 mono_image_build_metadata (MonoReflectionAssemblyBuilder *assemblyb);
520
521 #endif /* __METADATA_REFLECTION_H__ */
522