X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsre.c;h=b899c830e7898d960ad8418a4afb49c70ef2b882;hb=651161fa9d2fc5e1cacdbf58e244f759e879f317;hp=6fa1353b91f09e7a02f64a66907d056368a6d7b4;hpb=45d6da52ce69cbd24f5930e1cad88d425e706186;p=mono.git diff --git a/mono/metadata/sre.c b/mono/metadata/sre.c index 6fa1353b91f..b899c830e78 100644 --- a/mono/metadata/sre.c +++ b/mono/metadata/sre.c @@ -376,7 +376,7 @@ mono_save_custom_attrs (MonoImage *image, void *obj, MonoArray *cattrs) } #else -//For some WTF reason, users of this function are DISABLE_REFLECTION_EMIT +//FIXME some code compiled under DISABLE_REFLECTION_EMIT depends on this function, we should be more aggressively disabling things static void mono_save_custom_attrs (MonoImage *image, void *obj, MonoArray *cattrs) { @@ -746,7 +746,7 @@ is_field_on_inst (MonoClassField *field) #ifndef DISABLE_REFLECTION_EMIT static guint32 -mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObjectHandle f, MonoClassField *field) +mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoClassField *field) { MonoType *type; guint32 token; @@ -754,7 +754,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObjectHandle f, M g_assert (field); g_assert (field->parent); - token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, MONO_HANDLE_RAW (f))); + token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, field)); if (token) return token; @@ -767,7 +767,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObjectHandle f, M token = mono_image_get_memberref_token (assembly, &field->parent->byval_arg, mono_field_get_name (field), mono_dynimage_encode_fieldref_signature (assembly, field->parent->image, type)); - mono_g_hash_table_insert (assembly->handleref_managed, MONO_HANDLE_RAW (f), GUINT_TO_POINTER(token)); + g_hash_table_insert (assembly->handleref, field, GUINT_TO_POINTER(token)); return token; } @@ -1121,17 +1121,20 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, gboolean create_open_instance, gboolean register_token, MonoError *error) { + HANDLE_FUNCTION_ENTER (); guint32 token = 0; error_init (error); MonoClass *klass = mono_handle_class (obj); + MonoObjectHandle register_obj = MONO_HANDLE_NEW (MonoObject, NULL); + MONO_HANDLE_ASSIGN (register_obj, obj); /* Check for user defined reflection objects */ /* TypeDelegator is the only corlib type which doesn't look like a MonoReflectionType */ if (klass->image != mono_defaults.corlib || (strcmp (klass->name, "TypeDelegator") == 0)) { mono_error_set_not_supported (error, "User defined subclasses of System.Type are not yet supported"); - return 0; + goto leave; } /* This function is called from ModuleBuilder:getToken multiple times for the same objects */ @@ -1139,7 +1142,8 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, if (strcmp (klass->name, "RuntimeType") == 0) { MonoType *type = mono_reflection_type_handle_mono_type (MONO_HANDLE_CAST (MonoReflectionType, obj), error); - return_val_if_nok (error, 0); + if (!is_ok (error)) + goto leave; MonoClass *mc = mono_class_from_mono_type (type); token = mono_metadata_token_from_dor ( mono_dynimage_encode_typedef_or_ref_full (assembly, type, !mono_class_is_gtd (mc) || create_open_instance)); @@ -1188,25 +1192,30 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, token = MONO_TOKEN_FIELD_DEF | field_table_idx; how_collide = MONO_DYN_IMAGE_TOK_NEW; } else { - token = mono_image_get_fieldref_token (assembly, obj, field); + token = mono_image_get_fieldref_token (assembly, field); } /*g_print ("got token 0x%08x for %s\n", token, f->field->name);*/ } else if (strcmp (klass->name, "MonoArrayMethod") == 0) { MonoReflectionArrayMethodHandle m = MONO_HANDLE_CAST (MonoReflectionArrayMethod, obj); - token = mono_image_get_array_token (assembly, m, error); - return_val_if_nok (error, 0); + guint32 array_token = mono_image_get_array_token (assembly, m, error); + if (!is_ok (error)) + goto leave; + token = array_token; } else if (strcmp (klass->name, "SignatureHelper") == 0) { MonoReflectionSigHelperHandle s = MONO_HANDLE_CAST (MonoReflectionSigHelper, obj); - token = MONO_TOKEN_SIGNATURE | mono_image_get_sighelper_token (assembly, s, error); - return_val_if_nok (error, 0); + guint32 sig_token = MONO_TOKEN_SIGNATURE | mono_image_get_sighelper_token (assembly, s, error); + if (!is_ok (error)) + goto leave; + token = sig_token; } else { g_error ("requested token for %s\n", klass->name); } if (register_token) - mono_dynamic_image_register_token (assembly, token, obj, how_collide); + mono_dynamic_image_register_token (assembly, token, register_obj, how_collide); - return token; +leave: + HANDLE_FUNCTION_RETURN_VAL (token); } @@ -4384,7 +4393,7 @@ ves_icall_AssemblyBuilder_basic_init (MonoReflectionAssemblyBuilder *assemblyb) } void -ves_icall_AssemblyBuilder_UpdateNativeCustomAttributes (MonoReflectionAssemblyBuilderHandle assemblyb) +ves_icall_AssemblyBuilder_UpdateNativeCustomAttributes (MonoReflectionAssemblyBuilderHandle assemblyb, MonoError *error) { MonoArrayHandle cattrs = MONO_HANDLE_NEW_GET (MonoArray, assemblyb, cattrs);