* list :
[mono.git] / mono / metadata / reflection.h
index 8206165521fc6a6b1a5be56d6f246ce8605022ab..e01a2bbf81b2c3b2ac8e0edbff9fa0205072d127 100644 (file)
@@ -5,9 +5,10 @@
 #include <mono/metadata/metadata.h>
 #include <mono/metadata/class.h>
 #include <mono/metadata/object.h>
+#include <mono/utils/mono-hash.h>
 
 typedef struct {
-       char *name;
+       GHashTable *hash;
        char *data;
        guint32 alloc_size; /* malloced bytes */
        guint32 index;
@@ -23,27 +24,32 @@ typedef struct {
        guint32 next_idx;
 } MonoDynamicTable;
 
-typedef struct {
-       GHashTable *hash;
-       char *data;
-       guint32 index;
-       guint32 alloc_size;
-       guint32 offset; /* from start of metadata */
-} MonoStringHeap;
-
 /*
  * The followinbg structure must match the C# implementation in our corlib.
  */
 
-typedef struct {
+struct _MonoReflectionMethod {
        MonoObject object;
-       MonoType  *type;
-} MonoReflectionType;
+       MonoMethod *method;
+       MonoString *name;
+       MonoReflectionType *reftype;
+};
 
-typedef struct {
+struct _MonoDelegate {
        MonoObject object;
-       MonoMethod *method;
-} MonoReflectionMethod;
+       MonoObject *target_type;
+       MonoObject *target;
+       MonoString *method_name;
+       gpointer method_ptr;
+       gpointer delegate_trampoline;
+       MonoReflectionMethod *method_info;
+};
+
+typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
+struct _MonoMulticastDelegate {
+       MonoDelegate delegate;
+       MonoMulticastDelegate *prev;
+};
 
 typedef struct {
        MonoObject object;
@@ -57,6 +63,12 @@ typedef struct {
        MonoProperty *property;
 } MonoReflectionProperty;
 
+typedef struct {
+       MonoObject object;
+       MonoClass *klass;
+       MonoEvent *event;
+} MonoReflectionEvent;
+
 typedef struct {
        MonoObject object;
        MonoReflectionType *ClassImpl;
@@ -67,6 +79,11 @@ typedef struct {
        guint32 AttrsImpl;
 } MonoReflectionParameter;
 
+typedef struct {
+       MonoObject object;
+       MonoAssembly *assembly;
+} MonoReflectionAssembly;
+
 typedef struct {
        MonoReflectionType *utype;
        MonoArray *values;
@@ -76,7 +93,6 @@ typedef struct {
 typedef struct {
        MonoReflectionType *parent;
        MonoReflectionType *ret;
-       MonoString *name;
        guint32 attrs;
        guint32 implattrs;
 } MonoMethodInfo;
@@ -89,6 +105,15 @@ typedef struct {
        guint32 attrs;
 } MonoPropertyInfo;
 
+typedef struct {
+       MonoReflectionType *parent;
+       MonoString *name;
+       MonoReflectionMethod *add_method;
+       MonoReflectionMethod *remove_method;
+       MonoReflectionMethod *raise_method;
+       guint32 attrs;
+} MonoEventInfo;
+
 typedef struct {
        MonoReflectionType *parent;
        MonoReflectionType *type;
@@ -99,14 +124,18 @@ typedef struct {
 typedef struct {
        MonoString *name;
        MonoString *name_space;
-       MonoReflectionType *parent;
        MonoReflectionType *etype;
-       MonoArray *interfaces;
-       MonoAssembly *assembly;
-       guint32 attrs;
+       MonoReflectionType *nested_in;
+       MonoReflectionAssembly *assembly;
        guint32 rank;
+       MonoBoolean isprimitive;
 } MonoTypeInfo;
 
+typedef struct {
+       MonoObject *member;
+       gint32 code_pos;
+} MonoReflectionILTokenInfo;
+
 typedef struct {
        MonoObject object;
        MonoArray *code;
@@ -116,12 +145,15 @@ typedef struct {
        gint32 cur_stack;
        MonoArray *locals;
        MonoArray *ex_handlers;
+       gint32 num_token_fixups;
+       MonoArray *token_fixups;
 } MonoReflectionILGen;
 
 typedef struct {
        MonoArray *handlers;
        gint32 start;
        gint32 len;
+       gint32 label;
 } MonoILExceptionInfo;
 
 typedef struct {
@@ -138,10 +170,19 @@ typedef struct {
        MonoString *name;
 } MonoReflectionLocalBuilder;
 
+typedef struct {
+       MonoObject object;
+       gint32 count;
+       gint32 type;
+       gint32 eltype;
+} MonoReflectionMarshal;
+
 typedef struct {
        MonoObject object;
        MonoObject* methodb;
        MonoString *name;
+       MonoArray *cattrs;
+       MonoReflectionMarshal *marshal_info;
        guint32 attrs;
        int position;
        guint32 table_idx;
@@ -149,6 +190,7 @@ typedef struct {
 
 typedef struct {
        MonoObject object;
+       MonoMethod *mhandle;
        MonoReflectionILGen *ilgen;
        MonoArray *parameters;
        guint32 attrs;
@@ -157,6 +199,8 @@ typedef struct {
        guint32 call_conv;
        MonoObject *type;
        MonoArray *pinfo;
+       MonoArray *cattrs;
+       MonoBoolean init_locals;
 } MonoReflectionCtorBuilder;
 
 typedef struct {
@@ -172,22 +216,61 @@ typedef struct {
        MonoReflectionILGen *ilgen;
        MonoObject *type;
        MonoArray *pinfo;
+       MonoArray *cattrs;
        MonoReflectionMethod *override_method;
        MonoString *dll;
        MonoString *dllentry;
        guint32 charset;
        guint32 native_cc;
        guint32 call_conv;
+       MonoBoolean init_locals;
 } MonoReflectionMethodBuilder;
 
+typedef struct {
+       MonoObject object;
+       MonoMethod *mhandle;
+       MonoReflectionType *parent;
+       MonoReflectionType *ret;
+       MonoArray *parameters;
+       MonoString *name;
+       guint32 table_idx;
+       guint32 call_conv;
+} MonoReflectionArrayMethod;
+
+enum {
+       MONO_SECTION_TEXT,
+       MONO_SECTION_RSRC,
+       MONO_SECTION_RELOC,
+       MONO_SECTION_MAX
+};
+
 typedef struct {
        MonoAssembly assembly;
        guint32 meta_size;
        guint32 text_rva;
        guint32 metadata_rva;
+       guint32 image_base;
+       guint32 cli_header_offset;
+       guint32 iat_offset;
+       guint32 idt_offset;
+       guint32 ilt_offset;
+       guint32 imp_names_offset;
+       struct {
+               guint32 rva;
+               guint32 size;
+               guint32 offset;
+               guint32 attrs;
+       } sections [MONO_SECTION_MAX];
        GHashTable *typeref;
-       MonoStringHeap sheap;
+       GHashTable *handleref;
+       GList *array_methods;
+       MonoGHashTable *token_fixups;
+       char *strong_name;
+       guint32 strong_name_size;
+       MonoDynamicStream pefile;
+       MonoDynamicStream sheap;
        MonoDynamicStream code; /* used to store method headers and bytecode */
+       MonoDynamicStream resources; /* managed embedded resources */
        MonoDynamicStream us;
        MonoDynamicStream blob;
        MonoDynamicStream tstream;
@@ -196,9 +279,11 @@ typedef struct {
 } MonoDynamicAssembly;
 
 typedef struct {
-       MonoObject object;
-       MonoAssembly *assembly;
-} MonoReflectionAssembly;
+       MonoArray *data;
+       MonoString *name;
+       MonoString *filename;
+       guint32 attrs;
+} MonoReflectionResource;
 
 typedef struct {
        MonoReflectionAssembly assembly;
@@ -206,6 +291,16 @@ typedef struct {
        MonoReflectionMethodBuilder *entry_point;
        MonoArray *modules;
        MonoString *name;
+       MonoString *dir;
+       MonoArray *cattrs;
+       MonoArray *resources;
+       MonoString *keyfile;
+       MonoString *version;
+       MonoString *culture;
+       guint32 algid;
+       guint32 flags;
+       guint32 pekind;
+       MonoBoolean delay_sign;
 } MonoReflectionAssemblyBuilder;
 
 typedef struct {
@@ -218,6 +313,8 @@ typedef struct {
        gint32 table_idx;
        MonoReflectionType *typeb;
        MonoArray *rva_data;
+       MonoArray *cattrs;
+       MonoReflectionMarshal *marshal_info;
 } MonoReflectionFieldBuilder;
 
 typedef struct {
@@ -226,6 +323,7 @@ typedef struct {
        MonoString *name;
        MonoReflectionType *type;
        MonoArray *parameters;
+       MonoArray *cattrs;
        MonoObject *def_value;
        MonoReflectionMethodBuilder *set_method;
        MonoReflectionMethodBuilder *get_method;
@@ -235,7 +333,7 @@ typedef struct {
 typedef struct {
        MonoObject      obj;
        MonoImage  *image;
-       MonoObject *assembly;
+       MonoReflectionAssembly *assembly;
        MonoString *fqname;
        MonoString *name;
        MonoString *scopename;
@@ -244,7 +342,10 @@ typedef struct {
 typedef struct {
        MonoReflectionModule module;
        MonoArray *types;
+       MonoArray *cattrs;
+       MonoArray *guid;
        guint32    table_idx;
+       MonoReflectionAssemblyBuilder *assemblyb;
 } MonoReflectionModuleBuilder;
 
 typedef struct {
@@ -252,11 +353,14 @@ typedef struct {
        MonoString *name;
        MonoString *nspace;
        MonoReflectionType *parent;
+       MonoReflectionType *nesting_type;
        MonoArray *interfaces;
        MonoArray *methods;
        MonoArray *ctors;
        MonoArray *properties;
        MonoArray *fields;
+       MonoArray *events;
+       MonoArray *cattrs;
        MonoArray *subtypes;
        guint32 attrs;
        guint32 table_idx;
@@ -269,34 +373,91 @@ typedef struct {
        MonoObject  obj;
        MonoString *name;
        MonoString *codebase;
-       MonoObject *version;
+       gint32 major, minor, build, revision;
+       /* FIXME: add missing stuff */
+/*     CultureInfo cultureinfo;
+       AssemblyNameFlags flags;
+       AssemblyHashAlgorithm hashalg;
+       StrongNameKeyPair keypair;
+       AssemblyVersionCompatibility versioncompat;*/
+       MonoObject  *cultureInfo;
+       MonoObject  *flags;
+       MonoObject  *hashalg;
+       MonoObject  *keypair;
+       MonoObject  *versioncompat;
 } MonoReflectionAssemblyName;
 
 typedef struct {
-       char *nest_name_space;
-       char *nest_name;
+       MonoObject  obj;
+       MonoString *name;
+       MonoReflectionType *type;
+       MonoReflectionTypeBuilder *typeb;
+       MonoArray *cattrs;
+       MonoReflectionMethodBuilder *add_method;
+       MonoReflectionMethodBuilder *remove_method;
+       MonoReflectionMethodBuilder *raise_method;
+       MonoArray *other_methods;
+       guint32 attrs;
+       guint32 table_idx;
+} MonoReflectionEventBuilder;
+
+typedef struct {
+       MonoObject  obj;
+       MonoReflectionMethod *ctor;
+       MonoArray *data;
+} MonoReflectionCustomAttr;
+
+typedef struct MonoTypeNameParse MonoTypeNameParse;
+
+struct MonoTypeNameParse {
        char *name_space;
        char *name;
-       char *assembly;
-       int rank; /* we may need more info than this */
-       int isbyref;
-       int ispointer;
-} MonoTypeNameParse;
+       MonoAssemblyName assembly;
+       GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
+       GList *nested;
+};
 
+typedef struct {
+       MonoObject object;
+       MonoReflectionModuleBuilder *module;
+       MonoArray *arguments;
+       guint32 type;
+} MonoReflectionSigHelper;
+
+
+
+char*         mono_type_get_name         (MonoType *type);
 int           mono_reflection_parse_type (char *name, MonoTypeNameParse *info);
+MonoType*     mono_reflection_get_type   (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase);
+MonoType*     mono_reflection_type_from_name (char *name, MonoImage *image);
 
-int           mono_image_get_header (MonoReflectionAssemblyBuilder *assembly, char *buffer, int maxsize);
+void          mono_image_create_pefile (MonoReflectionAssemblyBuilder *assembly);
 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
 guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
-guint32       mono_image_create_token  (MonoReflectionAssemblyBuilder *assembly, MonoObject *obj);
+guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
 
 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
+MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
 MonoReflectionType*     mono_type_get_object     (MonoDomain *domain, MonoType *type);
-MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method);
+MonoReflectionMethod*   mono_method_get_object   (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
 MonoReflectionField*    mono_field_get_object    (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
 MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property);
+MonoReflectionEvent*    mono_event_get_object    (MonoDomain *domain, MonoClass *klass, MonoEvent *event);
 /* note: this one is slightly different: we keep the whole array of params in the cache */
 MonoReflectionParameter** mono_param_get_objects  (MonoDomain *domain, MonoMethod *method);
 
+MonoArray*  mono_reflection_get_custom_attrs (MonoObject *obj);
+MonoArray*  mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues);
+
+void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
+
+void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
+
+MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
+
+MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
+
+MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
+
 #endif /* __METADATA_REFLECTION_H__ */