2003-03-27 Zoltan Varga <vargaz@freemail.h>
[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         GHashTable *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 } MonoReflectionModule;
350
351 typedef struct {
352         MonoReflectionModule module;
353         MonoArray *types;
354         MonoArray *cattrs;
355         MonoArray *guid;
356         guint32    table_idx;
357         MonoReflectionAssemblyBuilder *assemblyb;
358         MonoArray *global_methods;
359         MonoArray *global_fields;
360 } MonoReflectionModuleBuilder;
361
362 typedef struct {
363         MonoReflectionType type;
364         MonoString *name;
365         MonoString *nspace;
366         MonoReflectionType *parent;
367         MonoReflectionType *nesting_type;
368         MonoArray *interfaces;
369         MonoArray *methods;
370         MonoArray *ctors;
371         MonoArray *properties;
372         MonoArray *fields;
373         MonoArray *events;
374         MonoArray *cattrs;
375         MonoArray *subtypes;
376         guint32 attrs;
377         guint32 table_idx;
378         MonoReflectionModuleBuilder *module;
379         gint32 class_size;
380         gint32 packing_size;
381 } MonoReflectionTypeBuilder;
382
383 typedef struct {
384         MonoObject  obj;
385         MonoString *name;
386         MonoString *codebase;
387         gint32 major, minor, build, revision;
388         /* FIXME: add missing stuff */
389 /*      CultureInfo cultureinfo;
390         AssemblyNameFlags flags;
391         AssemblyHashAlgorithm hashalg;
392         StrongNameKeyPair keypair;
393         AssemblyVersionCompatibility versioncompat;*/
394         MonoObject  *cultureInfo;
395         MonoObject  *flags;
396         MonoObject  *hashalg;
397         MonoObject  *keypair;
398         MonoArray   *publicKey;
399         MonoArray   *keyToken;
400         MonoObject  *versioncompat;
401 } MonoReflectionAssemblyName;
402
403 typedef struct {
404         MonoObject  obj;
405         MonoString *name;
406         MonoReflectionType *type;
407         MonoReflectionTypeBuilder *typeb;
408         MonoArray *cattrs;
409         MonoReflectionMethodBuilder *add_method;
410         MonoReflectionMethodBuilder *remove_method;
411         MonoReflectionMethodBuilder *raise_method;
412         MonoArray *other_methods;
413         guint32 attrs;
414         guint32 table_idx;
415 } MonoReflectionEventBuilder;
416
417 typedef struct {
418         MonoObject  obj;
419         MonoReflectionMethod *ctor;
420         MonoArray *data;
421 } MonoReflectionCustomAttr;
422
423 typedef struct MonoTypeNameParse MonoTypeNameParse;
424
425 struct MonoTypeNameParse {
426         char *name_space;
427         char *name;
428         MonoAssemblyName assembly;
429         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
430         GList *nested;
431 };
432
433 typedef struct {
434         MonoObject object;
435         MonoReflectionModuleBuilder *module;
436         MonoArray *arguments;
437         guint32 type;
438         MonoReflectionType *return_type;
439         guint32 call_conv;
440         guint32 unmanaged_call_conv;
441 } MonoReflectionSigHelper;
442
443 typedef struct {
444         MonoMethod *ctor;
445         guint32     data_size;
446         const guchar* data;
447 } MonoCustomAttrEntry;
448
449 typedef struct {
450         int num_attrs;
451         MonoImage *image;
452         MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
453 } MonoCustomAttrInfo;
454
455
456 char*         mono_type_get_name         (MonoType *type);
457 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
458 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
459 MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
460
461 void          mono_image_create_pefile (MonoReflectionAssemblyBuilder *assembly);
462 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
463 guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
464 guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
465 void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
466
467 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
468 MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
469 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
470 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
471 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
472 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
473 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
474 /* note: this one is slightly different: we keep the whole array of params in the cache */
475 MonoReflectionParameter** mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
476
477 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
478 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
479
480 MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
481 MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
482 MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
483 MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
484 MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
485 MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
486 MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
487 MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
488 MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
489
490 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
491
492 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
493
494 MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
495
496 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
497
498 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
499
500 gpointer
501 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
502
503 void
504 mono_image_build_metadata (MonoReflectionAssemblyBuilder *assemblyb);
505
506 #endif /* __METADATA_REFLECTION_H__ */
507