added proxy support
[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 rows;
20         guint32 row_size; /*  calculated later with column_sizes */
21         guint32 columns;
22         guint32 column_sizes [9]; 
23         guint32 *values; /* rows * columns */
24         guint32 next_idx;
25 } MonoDynamicTable;
26
27 /*
28  * The followinbg structure must match the C# implementation in our corlib.
29  */
30
31 typedef struct {
32         MonoObject object;
33         MonoType  *type;
34 } MonoReflectionType;
35
36 typedef struct {
37         MonoObject object;
38         MonoMethod *method;
39 } MonoReflectionMethod;
40
41 typedef struct {
42         MonoObject obj;
43         MonoReflectionMethod *method;
44         MonoArray  *args;               
45         MonoArray  *names;              
46         MonoArray  *arg_types;  
47         MonoObject *ctx;
48         MonoObject *rval;
49         MonoObject *exc;
50 } MonoMethodMessage;
51
52 typedef struct {
53         MonoObject object;
54         MonoObject *target_type;
55         MonoObject *target;
56         MonoString *method_name;
57         gpointer method_ptr;
58         MonoReflectionMethod *method_info;
59 } MonoDelegate;
60
61 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
62 struct _MonoMulticastDelegate {
63         MonoDelegate delegate;
64         MonoMulticastDelegate *prev;
65 };
66
67 typedef struct {
68         MonoObject object;
69         MonoClass *klass;
70         MonoClassField *field;
71 } MonoReflectionField;
72
73 typedef struct {
74         MonoObject object;
75         MonoClass *klass;
76         MonoProperty *property;
77 } MonoReflectionProperty;
78
79 typedef struct {
80         MonoObject object;
81         MonoClass *klass;
82         MonoEvent *event;
83 } MonoReflectionEvent;
84
85 typedef struct {
86         MonoObject object;
87         MonoReflectionType *ClassImpl;
88         MonoObject *DefaultValueImpl;
89         MonoObject *MemberImpl;
90         MonoString *NameImpl;
91         gint32 PositionImpl;
92         guint32 AttrsImpl;
93 } MonoReflectionParameter;
94
95 typedef struct {
96         MonoReflectionType *utype;
97         MonoArray *values;
98         MonoArray *names;
99 } MonoEnumInfo;
100
101 typedef struct {
102         MonoReflectionType *parent;
103         MonoReflectionType *ret;
104         MonoString *name;
105         guint32 attrs;
106         guint32 implattrs;
107 } MonoMethodInfo;
108
109 typedef struct {
110         MonoReflectionType *parent;
111         MonoString *name;
112         MonoReflectionMethod *get;
113         MonoReflectionMethod *set;
114         guint32 attrs;
115 } MonoPropertyInfo;
116
117 typedef struct {
118         MonoReflectionType *parent;
119         MonoReflectionType *type;
120         MonoString *name;
121         guint32 attrs;
122 } MonoFieldInfo;
123
124 typedef struct {
125         MonoString *name;
126         MonoString *name_space;
127         MonoReflectionType *parent;
128         MonoReflectionType *etype;
129         MonoAssembly *assembly;
130         guint32 attrs;
131         guint32 rank;
132         MonoBoolean isbyref, ispointer, 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         MonoObject* methodb;
177         MonoString *name;
178         MonoArray *cattrs;
179         guint32 attrs;
180         int position;
181         guint32 table_idx;
182 } MonoReflectionParamBuilder;
183
184 typedef struct {
185         MonoObject object;
186         MonoReflectionILGen *ilgen;
187         MonoArray *parameters;
188         guint32 attrs;
189         guint32 iattrs;
190         guint32 table_idx;
191         guint32 call_conv;
192         MonoObject *type;
193         MonoArray *pinfo;
194         MonoArray *cattrs;
195 } MonoReflectionCtorBuilder;
196
197 typedef struct {
198         MonoObject object;
199         MonoMethod *mhandle;
200         MonoReflectionType *rtype;
201         MonoArray *parameters;
202         guint32 attrs;
203         guint32 iattrs;
204         MonoString *name;
205         guint32 table_idx;
206         MonoArray *code;
207         MonoReflectionILGen *ilgen;
208         MonoObject *type;
209         MonoArray *pinfo;
210         MonoArray *cattrs;
211         MonoReflectionMethod *override_method;
212         MonoString *dll;
213         MonoString *dllentry;
214         guint32 charset;
215         guint32 native_cc;
216         guint32 call_conv;
217 } MonoReflectionMethodBuilder;
218
219 typedef struct {
220         MonoAssembly assembly;
221         guint32 meta_size;
222         guint32 text_rva;
223         guint32 metadata_rva;
224         GHashTable *typeref;
225         MonoGHashTable *token_fixups;
226         MonoDynamicStream sheap;
227         MonoDynamicStream code; /* used to store method headers and bytecode */
228         MonoDynamicStream us;
229         MonoDynamicStream blob;
230         MonoDynamicStream tstream;
231         MonoDynamicStream guid;
232         MonoDynamicTable tables [64];
233 } MonoDynamicAssembly;
234
235 typedef struct {
236         MonoObject object;
237         MonoAssembly *assembly;
238 } MonoReflectionAssembly;
239
240 typedef struct {
241         MonoReflectionAssembly assembly;
242         MonoDynamicAssembly *dynamic_assembly;
243         MonoReflectionMethodBuilder *entry_point;
244         MonoArray *modules;
245         MonoString *name;
246         MonoArray *cattrs;
247 } MonoReflectionAssemblyBuilder;
248
249 typedef struct {
250         MonoObject object;
251         guint32 attrs;
252         MonoReflectionType *type;
253         MonoString *name;
254         MonoObject *def_value;
255         gint32 offset;
256         gint32 table_idx;
257         MonoReflectionType *typeb;
258         MonoArray *rva_data;
259         MonoArray *cattrs;
260 } MonoReflectionFieldBuilder;
261
262 typedef struct {
263         MonoObject object;
264         guint32 attrs;
265         MonoString *name;
266         MonoReflectionType *type;
267         MonoArray *parameters;
268         MonoArray *cattrs;
269         MonoObject *def_value;
270         MonoReflectionMethodBuilder *set_method;
271         MonoReflectionMethodBuilder *get_method;
272         gint32 table_idx;
273 } MonoReflectionPropertyBuilder;
274
275 typedef struct {
276         MonoObject      obj;
277         MonoImage  *image;
278         MonoObject *assembly;
279         MonoString *fqname;
280         MonoString *name;
281         MonoString *scopename;
282 } MonoReflectionModule;
283
284 typedef struct {
285         MonoReflectionModule module;
286         MonoArray *types;
287         MonoArray *cattrs;
288         guint32    table_idx;
289         MonoReflectionAssemblyBuilder *assemblyb;
290 } MonoReflectionModuleBuilder;
291
292 typedef struct {
293         MonoReflectionType type;
294         MonoString *name;
295         MonoString *nspace;
296         MonoReflectionType *parent;
297         MonoArray *interfaces;
298         MonoArray *methods;
299         MonoArray *ctors;
300         MonoArray *properties;
301         MonoArray *fields;
302         MonoArray *events;
303         MonoArray *cattrs;
304         MonoArray *subtypes;
305         guint32 attrs;
306         guint32 table_idx;
307         MonoReflectionModuleBuilder *module;
308         gint32 class_size;
309         gint32 packing_size;
310 } MonoReflectionTypeBuilder;
311
312 typedef struct {
313         MonoObject  obj;
314         MonoString *name;
315         MonoString *codebase;
316         MonoObject *version;
317 } MonoReflectionAssemblyName;
318
319 typedef struct {
320         MonoObject  obj;
321         MonoString *name;
322         MonoReflectionType *type;
323         MonoReflectionTypeBuilder *typeb;
324         MonoArray *cattrs;
325         MonoReflectionMethodBuilder *add_method;
326         MonoReflectionMethodBuilder *remove_method;
327         MonoReflectionMethodBuilder *raise_method;
328         MonoArray *other_methods;
329         guint32 attrs;
330         guint32 table_idx;
331 } MonoReflectionEventBuilder;
332
333 typedef struct {
334         MonoObject  obj;
335         MonoReflectionMethod *ctor;
336         MonoArray *data;
337 } MonoReflectionCustomAttr;
338
339 typedef struct {
340         char *nest_name_space;
341         char *nest_name;
342         char *name_space;
343         char *name;
344         char *assembly;
345         GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
346 } MonoTypeNameParse;
347
348 typedef struct {
349         MonoObject object;
350         MonoReflectionModuleBuilder *module;
351         MonoArray *arguments;
352         guint32 type;
353 } MonoReflectionSigHelper;
354
355
356
357 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
358 MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
359
360 int           mono_image_get_header (MonoReflectionAssemblyBuilder *assembly, char *buffer, int maxsize);
361 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
362 guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
363 guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
364
365 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
366 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
367 MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method);
368 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
369 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
370 MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
371 /* note: this one is slightly different: we keep the whole array of params in the cache */
372 MonoReflectionParameter** mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
373
374
375 typedef MonoObject* (*MonoInvokeFunc) (MonoMethod *method, void *obj, void **params);
376
377 extern MonoInvokeFunc mono_default_runtime_invoke;
378
379 void        mono_install_runtime_invoke (MonoInvokeFunc func);
380 MonoObject* mono_runtime_invoke         (MonoMethod *method, void *obj, void **params);
381 MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
382 MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
383
384 void        mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb);
385
386 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
387
388 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
389
390 #endif /* __METADATA_REFLECTION_H__ */
391