X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Freflection.h;h=28eae48678e7beafdba998f5788a8dd9d1f53192;hb=b50dc8d84850e0452a7a4d742ed0a0fa46fe491e;hp=35e86fc068d3e6f30f30a886454c2959d288cfe5;hpb=c5ee2c6e2087ed59f55f55096ed7d054b30ab4d9;p=mono.git diff --git a/mono/metadata/reflection.h b/mono/metadata/reflection.h index 35e86fc068d..28eae48678e 100644 --- a/mono/metadata/reflection.h +++ b/mono/metadata/reflection.h @@ -1,510 +1,9 @@ #ifndef __METADATA_REFLECTION_H__ #define __METADATA_REFLECTION_H__ -#include -#include -#include #include -#include -typedef struct { - GHashTable *hash; - char *data; - guint32 alloc_size; /* malloced bytes */ - guint32 index; - guint32 offset; /* from start of metadata */ -} MonoDynamicStream; - -typedef struct { - guint32 alloc_rows; - guint32 rows; - guint32 row_size; /* calculated later with column_sizes */ - guint32 columns; - guint32 column_sizes [9]; - guint32 *values; /* rows * columns */ - guint32 next_idx; -} MonoDynamicTable; - -/* - * The followinbg structure must match the C# implementation in our corlib. - */ - -struct _MonoReflectionMethod { - MonoObject object; - MonoMethod *method; - MonoString *name; - MonoReflectionType *reftype; -}; - -struct _MonoDelegate { - MonoObject object; - 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; - MonoClass *klass; - MonoClassField *field; - MonoString *name; - MonoReflectionType *type; - guint32 attrs; -} MonoReflectionField; - -typedef struct { - MonoObject object; - MonoClass *klass; - MonoProperty *property; -} MonoReflectionProperty; - -typedef struct { - MonoObject object; - MonoClass *klass; - MonoEvent *event; -} MonoReflectionEvent; - -typedef struct { - MonoObject object; - MonoReflectionType *ClassImpl; - MonoObject *DefaultValueImpl; - MonoObject *MemberImpl; - MonoString *NameImpl; - gint32 PositionImpl; - guint32 AttrsImpl; -} MonoReflectionParameter; - -typedef struct { - MonoObject object; - MonoAssembly *assembly; - MonoObject *resolve_event_holder; -} MonoReflectionAssembly; - -typedef struct { - MonoReflectionType *utype; - MonoArray *values; - MonoArray *names; -} MonoEnumInfo; - -typedef struct { - MonoReflectionType *parent; - MonoReflectionType *ret; - guint32 attrs; - guint32 implattrs; - guint32 callconv; -} MonoMethodInfo; - -typedef struct { - MonoReflectionType *parent; - MonoString *name; - MonoReflectionMethod *get; - MonoReflectionMethod *set; - guint32 attrs; -} MonoPropertyInfo; - -typedef struct { - MonoReflectionType *declaring_type; - MonoReflectionType *reflected_type; - MonoString *name; - MonoReflectionMethod *add_method; - MonoReflectionMethod *remove_method; - MonoReflectionMethod *raise_method; - guint32 attrs; -} MonoEventInfo; - -typedef struct { - MonoString *name; - MonoString *name_space; - MonoReflectionType *etype; - MonoReflectionType *nested_in; - MonoReflectionAssembly *assembly; - guint32 rank; - MonoBoolean isprimitive; -} MonoTypeInfo; - -typedef struct { - MonoObject *member; - gint32 code_pos; -} MonoReflectionILTokenInfo; - -typedef struct { - MonoObject object; - MonoArray *code; - gint32 code_len; - gint32 max_stack; - 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 { - MonoReflectionType *extype; - gint32 type; - gint32 start; - gint32 len; - gint32 filter_offset; -} MonoILExceptionBlock; - -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; -} MonoReflectionParamBuilder; - -typedef struct { - MonoObject object; - MonoMethod *mhandle; - MonoReflectionILGen *ilgen; - MonoArray *parameters; - guint32 attrs; - guint32 iattrs; - guint32 table_idx; - guint32 call_conv; - MonoObject *type; - MonoArray *pinfo; - MonoArray *cattrs; - MonoBoolean init_locals; - MonoArray *param_modreq; - MonoArray *param_modopt; - MonoArray *permissions; -} MonoReflectionCtorBuilder; - -typedef struct { - MonoObject object; - MonoMethod *mhandle; - MonoReflectionType *rtype; - MonoArray *parameters; - guint32 attrs; - guint32 iattrs; - MonoString *name; - guint32 table_idx; - MonoArray *code; - 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; - 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]; -} 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; - 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 { - MonoObject object; - guint32 attrs; - MonoReflectionType *type; - MonoString *name; - MonoObject *def_value; - gint32 offset; - gint32 table_idx; - MonoReflectionType *typeb; - MonoArray *rva_data; - MonoArray *cattrs; - MonoReflectionMarshal *marshal_info; - MonoClassField *handle; - MonoArray *modreq; - MonoArray *modopt; -} MonoReflectionFieldBuilder; - -typedef struct { - MonoObject object; - guint32 attrs; - MonoString *name; - MonoReflectionType *type; - MonoArray *parameters; - MonoArray *cattrs; - MonoObject *def_value; - MonoReflectionMethodBuilder *set_method; - MonoReflectionMethodBuilder *get_method; - gint32 table_idx; -} MonoReflectionPropertyBuilder; - -typedef struct { - MonoObject obj; - MonoImage *image; - 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 { - MonoReflectionType type; - 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; - MonoArray *subtypes; - guint32 attrs; - guint32 table_idx; - 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 { - 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 { - 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; +G_BEGIN_DECLS typedef struct MonoTypeNameParse MonoTypeNameParse; @@ -513,19 +12,10 @@ struct MonoTypeNameParse { char *name; MonoAssemblyName assembly; GList *modifiers; /* 0 -> byref, -1 -> pointer, > 0 -> array rank */ + GPtrArray *type_arguments; 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; @@ -534,6 +24,7 @@ typedef struct { typedef struct { int num_attrs; + int cached; MonoImage *image; MonoCustomAttrEntry attrs [MONO_ZERO_LEN_ARRAY]; } MonoCustomAttrInfo; @@ -546,31 +37,21 @@ typedef struct { char **param_names; MonoMarshalSpec **param_marshall; MonoCustomAttrInfo **param_cattr; + guint8** param_defaults; + guint32 *param_default_types; + char *dllentry, *dll; } 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; +typedef enum { + ResolveTokenError_OutOfRange, + ResolveTokenError_BadTable, + ResolveTokenError_Other +} MonoResolveTokenError; int mono_reflection_parse_type (char *name, MonoTypeNameParse *info); -MonoType* mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase); +MonoType* mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve); MonoType* mono_reflection_type_from_name (char *name, MonoImage *image); - -void mono_image_create_pefile (MonoReflectionModuleBuilder *module); -void mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly); -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); +guint32 mono_reflection_get_token (MonoObject *obj); MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly); MonoReflectionModule* mono_module_get_object (MonoDomain *domain, MonoImage *image); @@ -582,10 +63,14 @@ MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, MonoClass 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 */ MonoArray* mono_param_get_objects (MonoDomain *domain, MonoMethod *method); - +MonoReflectionMethodBody* mono_method_body_get_object (MonoDomain *domain, MonoMethod *method); +MonoObject* mono_get_dbnull_object (MonoDomain *domain); +MonoArray* mono_reflection_get_custom_attrs_by_type (MonoObject *obj, MonoClass *attr_klass); MonoArray* mono_reflection_get_custom_attrs (MonoObject *obj); +MonoArray* mono_reflection_get_custom_attrs_data (MonoObject *obj); MonoArray* mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *porpValues, MonoArray *fields, MonoArray* fieldValues); +MonoCustomAttrInfo* mono_reflection_get_custom_attrs_info (MonoObject *obj); 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); @@ -595,39 +80,62 @@ MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoPrope 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); +gboolean mono_custom_attrs_has_attr (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass); +MonoObject* mono_custom_attrs_get_attr (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass); 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); +#define MONO_DECLSEC_ACTION_MIN 0x1 +#define MONO_DECLSEC_ACTION_MAX 0x12 -void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam); +enum { + MONO_DECLSEC_FLAG_REQUEST = 0x00000001, + MONO_DECLSEC_FLAG_DEMAND = 0x00000002, + MONO_DECLSEC_FLAG_ASSERT = 0x00000004, + MONO_DECLSEC_FLAG_DENY = 0x00000008, + MONO_DECLSEC_FLAG_PERMITONLY = 0x00000010, + MONO_DECLSEC_FLAG_LINKDEMAND = 0x00000020, + MONO_DECLSEC_FLAG_INHERITANCEDEMAND = 0x00000040, + MONO_DECLSEC_FLAG_REQUEST_MINIMUM = 0x00000080, + MONO_DECLSEC_FLAG_REQUEST_OPTIONAL = 0x00000100, + MONO_DECLSEC_FLAG_REQUEST_REFUSE = 0x00000200, + MONO_DECLSEC_FLAG_PREJIT_GRANT = 0x00000400, + MONO_DECLSEC_FLAG_PREJIT_DENY = 0x00000800, + MONO_DECLSEC_FLAG_NONCAS_DEMAND = 0x00001000, + MONO_DECLSEC_FLAG_NONCAS_LINKDEMAND = 0x00002000, + MONO_DECLSEC_FLAG_NONCAS_INHERITANCEDEMAND = 0x00004000, + MONO_DECLSEC_FLAG_LINKDEMAND_CHOICE = 0x00008000, + MONO_DECLSEC_FLAG_INHERITANCEDEMAND_CHOICE = 0x00010000, + MONO_DECLSEC_FLAG_DEMAND_CHOICE = 0x00020000 +}; -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); +guint32 mono_declsec_flags_from_method (MonoMethod *method); +guint32 mono_declsec_flags_from_class (MonoClass *klass); +guint32 mono_declsec_flags_from_assembly (MonoAssembly *assembly); +/* this structure MUST be kept in synch with RuntimeDeclSecurityEntry + * located in /mcs/class/corlib/System.Security/SecurityFrame.cs */ +typedef struct { + char *blob; /* pointer to metadata blob */ + guint32 size; /* size of the metadata blob */ + guint32 index; +} MonoDeclSecurityEntry; -MonoArray *mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig); +typedef struct { + MonoDeclSecurityEntry demand; + MonoDeclSecurityEntry noncasdemand; + MonoDeclSecurityEntry demandchoice; +} MonoDeclSecurityActions; -MonoArray *mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig); +MonoBoolean mono_declsec_get_demands (MonoMethod *callee, MonoDeclSecurityActions* demands); +MonoBoolean mono_declsec_get_linkdemands (MonoMethod *callee, MonoDeclSecurityActions* klass, MonoDeclSecurityActions* cmethod); +MonoBoolean mono_declsec_get_inheritdemands_class (MonoClass *klass, MonoDeclSecurityActions* demands); +MonoBoolean mono_declsec_get_inheritdemands_method (MonoMethod *callee, MonoDeclSecurityActions* demands); -gpointer -mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token); +MonoBoolean mono_declsec_get_method_action (MonoMethod *method, guint32 action, MonoDeclSecurityEntry *entry); +MonoBoolean mono_declsec_get_class_action (MonoClass *klass, guint32 action, MonoDeclSecurityEntry *entry); +MonoBoolean mono_declsec_get_assembly_action (MonoAssembly *assembly, guint32 action, MonoDeclSecurityEntry *entry); -void -mono_image_build_metadata (MonoReflectionModuleBuilder *module); +G_END_DECLS #endif /* __METADATA_REFLECTION_H__ */ -