5bdbeef4ab9de3d59232c5831d8fcb06ee5b76b7
[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
9 typedef struct {
10         char *name;
11         char *data;
12         guint32 alloc_size; /* malloced bytes */
13         guint32 index;
14         guint32 offset; /* from start of metadata */
15 } MonoDynamicStream;
16
17 typedef struct {
18         guint32 rows;
19         guint32 row_size; /*  calculated later with column_sizes */
20         guint32 columns;
21         guint32 column_sizes [9]; 
22         guint32 *values; /* rows * columns */
23         guint32 next_idx;
24 } MonoDynamicTable;
25
26 typedef struct {
27         GHashTable *hash;
28         char *data;
29         guint32 index;
30         guint32 alloc_size;
31         guint32 offset; /* from start of metadata */
32 } MonoStringHeap;
33
34 /*
35  * The followinbg structure must match the C# implementation in our corlib.
36  */
37
38 typedef struct {
39         MonoObject object;
40         MonoType  *type;
41 } MonoReflectionType;
42
43 typedef struct {
44         MonoObject object;
45         MonoMethod *method;
46 } MonoReflectionMethod;
47
48 typedef struct {
49         MonoObject object;
50         MonoClass *klass;
51         MonoClassField *field;
52 } MonoReflectionField;
53
54 typedef struct {
55         MonoObject object;
56         MonoClass *klass;
57         MonoProperty *property;
58 } MonoReflectionProperty;
59
60 typedef struct {
61         MonoObject object;
62         MonoReflectionType *ClassImpl;
63         MonoObject *DefaultValueImpl;
64         MonoObject *MemberImpl;
65         MonoString *NameImpl;
66         gint32 PositionImpl;
67         guint32 AttrsImpl;
68 } MonoReflectionParameter;
69
70 typedef struct {
71         MonoReflectionType *utype;
72         MonoArray *values;
73         MonoArray *names;
74 } MonoEnumInfo;
75
76 typedef struct {
77         MonoReflectionType *parent;
78         MonoReflectionType *ret;
79         MonoString *name;
80         guint32 attrs;
81         guint32 implattrs;
82 } MonoMethodInfo;
83
84 typedef struct {
85         MonoReflectionType *parent;
86         MonoString *name;
87         MonoReflectionMethod *get;
88         MonoReflectionMethod *set;
89         guint32 attrs;
90 } MonoPropertyInfo;
91
92 typedef struct {
93         MonoReflectionType *parent;
94         MonoReflectionType *type;
95         MonoString *name;
96         guint32 attrs;
97 } MonoFieldInfo;
98
99 typedef struct {
100         MonoString *name;
101         MonoString *name_space;
102         MonoReflectionType *parent;
103         MonoReflectionType *etype;
104         MonoArray *interfaces;
105         MonoAssembly *assembly;
106         guint32 attrs;
107 } MonoTypeInfo;
108
109 typedef struct {
110         MonoObject object;
111         MonoArray *code;
112         MonoObject *mbuilder;
113         gint32 code_len;
114         gint32 max_stack;
115         gint32 cur_stack;
116         MonoArray *locals;
117 } MonoReflectionILGen;
118
119 typedef struct {
120         MonoObject object;
121         MonoReflectionType *type;
122         MonoString *name;
123 } MonoReflectionLocalBuilder;
124
125 typedef struct {
126         MonoObject object;
127         MonoReflectionILGen *ilgen;
128         MonoArray *parameters;
129         guint32 attrs;
130         guint32 iattrs;
131         guint32 table_idx;
132         guint32 call_conv;
133         MonoObject *type;
134 } MonoReflectionCtorBuilder;
135
136 typedef struct {
137         MonoObject object;
138         MonoMethod *mhandle;
139         MonoReflectionType *rtype;
140         MonoArray *parameters;
141         guint32 attrs;
142         guint32 iattrs;
143         MonoString *name;
144         guint32 table_idx;
145         MonoArray *code;
146         MonoReflectionILGen *ilgen;
147         MonoObject *type;
148         MonoArray *pinfo;
149         MonoString *dll;
150         MonoString *dllentry;
151         guint32 charset;
152         guint32 native_cc;
153         guint32 call_conv;
154 } MonoReflectionMethodBuilder;
155
156 typedef struct {
157         MonoAssembly assembly;
158         guint32 meta_size;
159         guint32 text_rva;
160         guint32 metadata_rva;
161         GHashTable *typeref;
162         MonoStringHeap sheap;
163         MonoDynamicStream code; /* used to store method headers and bytecode */
164         MonoDynamicStream us;
165         MonoDynamicStream blob;
166         MonoDynamicStream tstream;
167         MonoDynamicStream guid;
168         MonoDynamicTable tables [64];
169 } MonoDynamicAssembly;
170
171 typedef struct {
172         MonoObject object;
173         MonoAssembly *assembly;
174 } MonoReflectionAssembly;
175
176 typedef struct {
177         MonoReflectionAssembly assembly;
178         MonoDynamicAssembly *dynamic_assembly;
179         MonoReflectionMethodBuilder *entry_point;
180         MonoArray *modules;
181         MonoString *name;
182 } MonoReflectionAssemblyBuilder;
183
184 typedef struct {
185         MonoObject object;
186         guint32 attrs;
187         MonoReflectionType *type;
188         MonoString *name;
189         MonoObject *def_value;
190         gint32 offset;
191         gint32 table_idx;
192 } MonoReflectionFieldBuilder;
193
194 typedef struct {
195         MonoObject object;
196         guint32 attrs;
197         MonoString *name;
198         MonoReflectionType *type;
199         MonoArray *parameters;
200         MonoObject *def_value;
201         MonoReflectionMethodBuilder *set_method;
202         MonoReflectionMethodBuilder *get_method;
203         gint32 table_idx;
204 } MonoReflectionPropertyBuilder;
205
206 typedef struct {
207         MonoObject      obj;
208         MonoImage  *image;
209         MonoObject *assembly;
210         MonoString *fqname;
211         MonoString *name;
212         MonoString *scopename;
213 } MonoReflectionModule;
214
215 typedef struct {
216         MonoReflectionModule module;
217         MonoArray *types;
218         guint32    table_idx;
219 } MonoReflectionModuleBuilder;
220
221 typedef struct {
222         MonoReflectionType type;
223         MonoString *name;
224         MonoString *nspace;
225         MonoReflectionType *parent;
226         MonoArray *interfaces;
227         MonoArray *methods;
228         MonoArray *ctors;
229         MonoArray *properties;
230         MonoArray *fields;
231         guint32 attrs;
232         guint32 table_idx;
233         MonoReflectionModuleBuilder *module;
234 } MonoReflectionTypeBuilder;
235
236 int           mono_image_get_header (MonoReflectionAssemblyBuilder *assembly, char *buffer, int maxsize);
237 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
238 guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
239 guint32       mono_image_create_token  (MonoReflectionAssemblyBuilder *assembly, MonoObject *obj);
240
241 MonoReflectionAssembly* mono_assembly_get_object (MonoAssembly *assembly);
242 MonoReflectionType*     mono_type_get_object     (MonoType *type);
243 MonoReflectionMethod*   mono_method_get_object   (MonoMethod *method);
244 MonoReflectionField*    mono_field_get_object    (MonoClass *klass, MonoClassField *field);
245 MonoReflectionProperty* mono_property_get_object (MonoClass *klass, MonoProperty *property);
246 /* note: this one is slightly different: we keep the whole array of params in the cache */
247 MonoReflectionParameter** mono_param_get_objects  (MonoMethod *method);
248
249 #endif /* __METADATA_REFLECTION_H__ */
250