2004-05-25 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mono / metadata / reflection.h
index 938a69baf0dbc5fef4df50e2b4afe78d2be08e1f..d31deae81772b73955842cde8eb6c3a16d97c9d0 100644 (file)
@@ -16,6 +16,7 @@ typedef struct {
 } MonoDynamicStream;
 
 typedef struct {
+       guint32 alloc_rows;
        guint32 rows;
        guint32 row_size; /*  calculated later with column_sizes */
        guint32 columns;
@@ -32,9 +33,10 @@ struct _MonoReflectionMethod {
        MonoObject object;
        MonoMethod *method;
        MonoString *name;
+       MonoReflectionType *reftype;
 };
 
-typedef struct {
+struct _MonoDelegate {
        MonoObject object;
        MonoObject *target_type;
        MonoObject *target;
@@ -42,7 +44,7 @@ typedef struct {
        gpointer method_ptr;
        gpointer delegate_trampoline;
        MonoReflectionMethod *method_info;
-} MonoDelegate;
+};
 
 typedef struct _MonoMulticastDelegate MonoMulticastDelegate;
 struct _MonoMulticastDelegate {
@@ -54,6 +56,9 @@ typedef struct {
        MonoObject object;
        MonoClass *klass;
        MonoClassField *field;
+       MonoString *name;
+       MonoReflectionType *type;
+       guint32 attrs;
 } MonoReflectionField;
 
 typedef struct {
@@ -81,6 +86,7 @@ typedef struct {
 typedef struct {
        MonoObject object;
        MonoAssembly *assembly;
+       MonoObject *resolve_event_holder;
 } MonoReflectionAssembly;
 
 typedef struct {
@@ -94,6 +100,7 @@ typedef struct {
        MonoReflectionType *ret;
        guint32 attrs;
        guint32 implattrs;
+       guint32 callconv;
 } MonoMethodInfo;
 
 typedef struct {
@@ -105,7 +112,8 @@ typedef struct {
 } MonoPropertyInfo;
 
 typedef struct {
-       MonoReflectionType *parent;
+       MonoReflectionType *declaring_type;
+       MonoReflectionType *reflected_type;
        MonoString *name;
        MonoReflectionMethod *add_method;
        MonoReflectionMethod *remove_method;
@@ -113,22 +121,14 @@ typedef struct {
        guint32 attrs;
 } MonoEventInfo;
 
-typedef struct {
-       MonoReflectionType *parent;
-       MonoReflectionType *type;
-       MonoString *name;
-       guint32 attrs;
-} MonoFieldInfo;
-
 typedef struct {
        MonoString *name;
        MonoString *name_space;
-       MonoReflectionType *parent;
        MonoReflectionType *etype;
+       MonoReflectionType *nested_in;
        MonoReflectionAssembly *assembly;
-       guint32 attrs;
        guint32 rank;
-       MonoBoolean isbyref, ispointer, isprimitive;
+       MonoBoolean isprimitive;
 } MonoTypeInfo;
 
 typedef struct {
@@ -139,7 +139,6 @@ typedef struct {
 typedef struct {
        MonoObject object;
        MonoArray *code;
-       MonoObject *mbuilder;
        gint32 code_len;
        gint32 max_stack;
        gint32 cur_stack;
@@ -168,13 +167,26 @@ typedef struct {
        MonoObject object;
        MonoReflectionType *type;
        MonoString *name;
+       MonoBoolean is_pinned;
 } MonoReflectionLocalBuilder;
 
+typedef struct {
+       MonoObject object;
+       gint32 count;
+       gint32 type;
+       gint32 eltype;
+       MonoString *guid;
+       MonoString *mcookie;
+       MonoString *marshaltype;
+       MonoReflectionType *marshaltyperef;
+} MonoReflectionMarshal;
+
 typedef struct {
        MonoObject object;
        MonoObject* methodb;
        MonoString *name;
        MonoArray *cattrs;
+       MonoReflectionMarshal *marshal_info;
        guint32 attrs;
        int position;
        guint32 table_idx;
@@ -182,6 +194,7 @@ typedef struct {
 
 typedef struct {
        MonoObject object;
+       MonoMethod *mhandle;
        MonoReflectionILGen *ilgen;
        MonoArray *parameters;
        guint32 attrs;
@@ -192,6 +205,9 @@ typedef struct {
        MonoArray *pinfo;
        MonoArray *cattrs;
        MonoBoolean init_locals;
+       MonoArray *param_modreq;
+       MonoArray *param_modopt;
+       MonoArray *permissions;
 } MonoReflectionCtorBuilder;
 
 typedef struct {
@@ -215,33 +231,123 @@ typedef struct {
        guint32 native_cc;
        guint32 call_conv;
        MonoBoolean init_locals;
+       MonoArray *generic_params;
+       MonoArray *return_modreq;
+       MonoArray *return_modopt;
+       MonoArray *param_modreq;
+       MonoArray *param_modopt;
+       MonoArray *permissions;
 } 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;
+       gboolean run;
+       gboolean save;
+       char *strong_name;
+       guint32 strong_name_size;
+} MonoDynamicAssembly;
+
+typedef struct {
+       MonoImage image;
        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 *typespec;
        GHashTable *typeref;
        GHashTable *handleref;
+       MonoGHashTable *tokens;
+       MonoGHashTable *blob_cache;
+       GList *array_methods;
        MonoGHashTable *token_fixups;
+       MonoGHashTable *method_to_table_idx;
+       MonoGHashTable *field_to_table_idx;
+       MonoGHashTable *method_aux_hash;
+       gboolean run;
+       gboolean save;
+       char *strong_name;
+       guint32 strong_name_size;
+       char *win32_res;
+       guint32 win32_res_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;
        MonoDynamicStream guid;
        MonoDynamicTable tables [64];
-} MonoDynamicAssembly;
+} MonoDynamicImage;
+
+typedef struct {
+       MonoArray *data;
+       MonoString *name;
+       MonoString *filename;
+       guint32 attrs;
+       guint32 offset;
+} MonoReflectionResource;
+
+typedef struct {
+       guint32 res_type;
+       guint32 res_id;
+       guint32 lang_id;
+       MonoArray *res_data;
+} MonoReflectionWin32Resource;
+
+typedef struct {
+       guint32 action;
+       MonoString *pset;
+} MonoReflectionPermissionSet;
 
 typedef struct {
        MonoReflectionAssembly assembly;
        MonoDynamicAssembly *dynamic_assembly;
-       MonoReflectionMethodBuilder *entry_point;
+       MonoReflectionMethod *entry_point;
        MonoArray *modules;
        MonoString *name;
        MonoString *dir;
        MonoArray *cattrs;
+       MonoArray *resources;
+       MonoArray *public_key;
+       MonoString *version;
+       MonoString *culture;
+       guint32 algid;
+       guint32 flags;
+       guint32 pekind;
+       MonoBoolean delay_sign;
+       guint32 access;
+       MonoArray *loaded_modules;
+       MonoArray *win32_resources;
 } MonoReflectionAssemblyBuilder;
 
 typedef struct {
@@ -255,6 +361,10 @@ typedef struct {
        MonoReflectionType *typeb;
        MonoArray *rva_data;
        MonoArray *cattrs;
+       MonoReflectionMarshal *marshal_info;
+       MonoClassField *handle;
+       MonoArray *modreq;
+       MonoArray *modopt;
 } MonoReflectionFieldBuilder;
 
 typedef struct {
@@ -273,19 +383,26 @@ typedef struct {
 typedef struct {
        MonoObject      obj;
        MonoImage  *image;
-       MonoObject *assembly;
+       MonoReflectionAssembly *assembly;
        MonoString *fqname;
        MonoString *name;
        MonoString *scopename;
+       MonoBoolean is_resource;
 } MonoReflectionModule;
 
 typedef struct {
        MonoReflectionModule module;
+       MonoDynamicImage *dynamic_image;
+       gint32     num_types;
        MonoArray *types;
        MonoArray *cattrs;
        MonoArray *guid;
        guint32    table_idx;
        MonoReflectionAssemblyBuilder *assemblyb;
+       MonoArray *global_methods;
+       MonoArray *global_fields;
+       gboolean is_main;
+       MonoArray *resources;
 } MonoReflectionModuleBuilder;
 
 typedef struct {
@@ -293,10 +410,13 @@ typedef struct {
        MonoString *name;
        MonoString *nspace;
        MonoReflectionType *parent;
+       MonoReflectionType *nesting_type;
        MonoArray *interfaces;
+       gint32     num_methods;
        MonoArray *methods;
        MonoArray *ctors;
        MonoArray *properties;
+       gint32     num_fields;
        MonoArray *fields;
        MonoArray *events;
        MonoArray *cattrs;
@@ -306,14 +426,48 @@ typedef struct {
        MonoReflectionModuleBuilder *module;
        gint32 class_size;
        gint32 packing_size;
+       MonoArray *generic_params;
+       MonoArray *permissions;
 } MonoReflectionTypeBuilder;
 
+typedef struct {
+       MonoReflectionType type;
+       MonoReflectionTypeBuilder *tbuilder;
+       MonoReflectionMethodBuilder *mbuilder;
+       MonoString *name;
+       guint32 index;
+       MonoReflectionType *base_type;
+       MonoArray *iface_constraints;
+       MonoBoolean has_ctor_constraint;
+       MonoBoolean has_reference_type;
+       MonoBoolean has_value_type;
+} MonoReflectionGenericParam;
+
+typedef struct _MonoReflectionGenericInst MonoReflectionGenericInst;
+struct _MonoReflectionGenericInst {
+       MonoReflectionType type;
+       MonoReflectionType *generic_type;
+       guint32 initialized;
+};
+
 typedef struct {
        MonoObject  obj;
        MonoString *name;
        MonoString *codebase;
        gint32 major, minor, build, revision;
        /* FIXME: add missing stuff */
+/*     CultureInfo cultureinfo;
+       AssemblyNameFlags flags;
+       AssemblyHashAlgorithm hashalg;
+       StrongNameKeyPair keypair;
+       AssemblyVersionCompatibility versioncompat;*/
+       MonoObject  *cultureInfo;
+       guint32     flags;
+       guint32     hashalg;
+       MonoObject  *keypair;
+       MonoArray   *publicKey;
+       MonoArray   *keyToken;
+       MonoObject  *versioncompat;
 } MonoReflectionAssemblyName;
 
 typedef struct {
@@ -337,51 +491,143 @@ typedef struct {
 } MonoReflectionCustomAttr;
 
 typedef struct {
-       char *nest_name_space;
-       char *nest_name;
+       MonoObject object;
+       MonoMethod *mhandle;
+       MonoString *name;
+       MonoReflectionType *rtype;
+       MonoArray *parameters;
+       guint32 attrs;
+       guint32 call_conv;
+       MonoReflectionModule *module;
+       MonoBoolean skip_visibility;
+       MonoBoolean init_locals;
+       MonoReflectionILGen *ilgen;
+       gint32 nrefs;
+       MonoArray *refs;
+} MonoReflectionDynamicMethod; 
+
+typedef struct MonoTypeNameParse MonoTypeNameParse;
+
+struct MonoTypeNameParse {
        char *name_space;
        char *name;
-       char *assembly;
+       MonoAssemblyName assembly;
        GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */
-} MonoTypeNameParse;
+       GList *nested;
+};
 
 typedef struct {
        MonoObject object;
        MonoReflectionModuleBuilder *module;
        MonoArray *arguments;
        guint32 type;
+       MonoReflectionType *return_type;
+       guint32 call_conv;
+       guint32 unmanaged_call_conv;
 } MonoReflectionSigHelper;
 
+typedef struct {
+       MonoMethod *ctor;
+       guint32     data_size;
+       const guchar* data;
+} MonoCustomAttrEntry;
+
+typedef struct {
+       int num_attrs;
+       MonoImage *image;
+       MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY];
+} MonoCustomAttrInfo;
 
+/* 
+ * Information which isn't in the MonoMethod structure is stored here for
+ * dynamic methods.
+ */
+typedef struct {
+       char **param_names;
+       MonoMarshalSpec **param_marshall;
+       MonoCustomAttrInfo **param_cattr;
+} MonoReflectionMethodAux;
+
+enum {
+       RESOURCE_LOCATION_EMBEDDED = 1,
+       RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,
+       RESOURCE_LOCATION_IN_MANIFEST = 4
+};
+
+typedef struct {
+       MonoObject object;
+       MonoReflectionAssembly *assembly;
+       MonoString *filename;
+       guint32 location;
+} MonoManifestResourceInfo;
 
-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 (MonoReflectionModuleBuilder *module);
 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
-guint32       mono_image_insert_string (MonoReflectionAssemblyBuilder *assembly, MonoString *str);
-guint32       mono_image_create_token  (MonoDynamicAssembly *assembly, MonoObject *obj);
+MonoReflectionModule * mono_image_load_module (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
+guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
+guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj);
+void          mono_image_module_basic_init (MonoReflectionModuleBuilder *module);
 
 MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
+MonoReflectionModule*   mono_module_get_object   (MonoDomain *domain, MonoImage *image);
+MonoReflectionModule*   mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index);
 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_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);
 
+MonoArray*  mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo);
+MonoCustomAttrInfo* mono_custom_attrs_from_index    (MonoImage *image, guint32 idx);
+MonoCustomAttrInfo* mono_custom_attrs_from_method   (MonoMethod *method);
+MonoCustomAttrInfo* mono_custom_attrs_from_class    (MonoClass *klass);
+MonoCustomAttrInfo* mono_custom_attrs_from_assembly (MonoAssembly *assembly);
+MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
+MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
+MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
+MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, guint32 param);
+void                mono_custom_attrs_free          (MonoCustomAttrInfo *ainfo);
+
 void        mono_reflection_setup_internal_class  (MonoReflectionTypeBuilder *tb);
 
 void        mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb);
 
+void        mono_reflection_setup_generic_class   (MonoReflectionTypeBuilder *tb);
+
+MonoReflectionType* mono_reflection_create_runtime_class  (MonoReflectionTypeBuilder *tb);
+
+void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m);
+
+void        mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam);
+
+MonoType*
+mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types);
+MonoReflectionMethod*
+mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *method, MonoArray *types);
+void
+mono_reflection_generic_inst_initialize (MonoReflectionGenericInst *type, MonoArray *methods, MonoArray *ctors, MonoArray *fields, MonoArray *properties, MonoArray *events);
+MonoReflectionEvent *
+mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb);
+
+
 MonoArray  *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig);
 
 MonoArray  *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig);
 
+gpointer
+mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token);
+
+void
+mono_image_build_metadata (MonoReflectionModuleBuilder *module);
+
 #endif /* __METADATA_REFLECTION_H__ */