From: Aleksey Kliger Date: Wed, 27 Sep 2017 17:56:56 +0000 (-0400) Subject: [sre] Wrap mono_image_create_token with HANDLE_FUNCTION_{ENTER,RETURN} X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mono.git;a=commitdiff_plain;h=c8627b39d1751c1e93c29cf7b5b04fc7f5bb4014 [sre] Wrap mono_image_create_token with HANDLE_FUNCTION_{ENTER,RETURN} We will allocate a handle for the object that we will register. For now it's just an alias of the object passed in, but it could differ. --- diff --git a/mono/metadata/sre.c b/mono/metadata/sre.c index 3bcba2bf0cf..46e37d7af4b 100644 --- a/mono/metadata/sre.c +++ b/mono/metadata/sre.c @@ -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); }