X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsre.c;h=46e37d7af4b153812979148fab948bdc27283d7f;hb=c8627b39d1751c1e93c29cf7b5b04fc7f5bb4014;hp=6fa1353b91f09e7a02f64a66907d056368a6d7b4;hpb=45d6da52ce69cbd24f5930e1cad88d425e706186;p=mono.git diff --git a/mono/metadata/sre.c b/mono/metadata/sre.c index 6fa1353b91f..46e37d7af4b 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) { @@ -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)); @@ -1193,20 +1197,25 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, /*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);