[sre] Use coop handles for ModuleBuilder.GetRegisteredToken
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 3 May 2017 16:04:42 +0000 (12:04 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 10 May 2017 15:14:00 +0000 (11:14 -0400)
- Fix typo in REFLECTION_EMIT_INIT/REFLECTION_EMIT_SAVE in
  mono_dynamic_image_register_token
- Add mono_dynamic_image_get_registered_token ()
- N.B. locking change - ves_icall_ModuleBuilder_GetRegisteredToken used to take
  the loader lock.  Now it calls mono_dynamic_image_get_registered_token which
  just takes the image lock.

mono/metadata/dynamic-image-internals.h
mono/metadata/dynamic-image.c
mono/metadata/icall-def.h
mono/metadata/object-internals.h
mono/metadata/sre.c

index 8578c24824a376c3b4b54c0991b43adfe9823f22..344d2d6e978efe3467ab9a88b8da6f4e79875812 100644 (file)
@@ -33,6 +33,9 @@ mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, Mo
 gboolean
 mono_dynamic_image_is_valid_token (MonoDynamicImage *image, guint32 token);
 
+MonoObjectHandle
+mono_dynamic_image_get_registered_token (MonoDynamicImage *dynimage, guint32 token, MonoError *error);
+
 MonoDynamicImage*
 mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, char *module_name);
 
index 440f8094f02ca531f46e0cd60fca494a21974f52..b846347126cb0bf39f5baea7359c3544099cf384 100644 (file)
@@ -185,7 +185,7 @@ dynamic_image_unlock (MonoDynamicImage *image)
        mono_image_unlock ((MonoImage*)image);
 }
 
-#ifndef DISABLE_REFLECTION_INIT
+#ifndef DISABLE_REFLECTION_EMIT
 /*
  * mono_dynamic_image_register_token:
  *
@@ -222,6 +222,22 @@ lookup_dyn_token (MonoDynamicImage *assembly, guint32 token)
        return obj;
 }
 
+#ifndef DISABLE_REFLECTION_EMIT
+MonoObjectHandle
+mono_dynamic_image_get_registered_token (MonoDynamicImage *dynimage, guint32 token, MonoError *error)
+{
+       error_init (error);
+       return MONO_HANDLE_NEW (MonoObject, lookup_dyn_token (dynimage, token));
+}
+#else /* DISABLE_REFLECTION_EMIT */
+MonoObjectHandle
+mono_dynamic_image_get_registered_token (MonoDynamicImage *dynimage, guint32 token, MonoError *error)
+{
+       g_assert_not_reached ();
+       return NULL_HANDLE;
+}
+#endif
+
 /**
  * 
  * mono_dynamic_image_is_valid_token:
index 19a6ef5590c78db3a28e856ac02ea0eade25c320..a50dc9c6481a3015ff3f3d23c6e31a82b7bb8b55 100644 (file)
@@ -549,7 +549,7 @@ ICALL_TYPE(ENUMB, "System.Reflection.Emit.EnumBuilder", ENUMB_1)
 HANDLES(ICALL(ENUMB_1, "setup_enum_type", ves_icall_EnumBuilder_setup_enum_type))
 
 ICALL_TYPE(MODULEB, "System.Reflection.Emit.ModuleBuilder", MODULEB_10)
-ICALL(MODULEB_10, "GetRegisteredToken", ves_icall_ModuleBuilder_GetRegisteredToken)
+HANDLES(ICALL(MODULEB_10, "GetRegisteredToken", ves_icall_ModuleBuilder_GetRegisteredToken))
 HANDLES(ICALL(MODULEB_8, "RegisterToken", ves_icall_ModuleBuilder_RegisterToken))
 ICALL(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile)
 HANDLES(ICALL(MODULEB_2, "basic_init", ves_icall_ModuleBuilder_basic_init))
index 56abbaf703f780e56dff2bdc9df33d90e82f670f..0c9450f50e18c6bb0cbfde88a2ed0164c3dfea22 100644 (file)
@@ -1880,8 +1880,8 @@ ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb);
 void
 ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, guint32 token, MonoError *error);
 
-MonoObject*
-ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, guint32 token);
+MonoObjectHandle
+ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilderHandle mb, guint32 token, MonoError *error);
 
 void
 ves_icall_AssemblyBuilder_basic_init (MonoReflectionAssemblyBuilder *assemblyb);
index a371a637f5411440c46b6251856dd627688b96c9..e93e716a1dc0a47c8f8c64305976461636bb2474 100644 (file)
@@ -4317,16 +4317,12 @@ ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilderHandle mb, Mon
        mono_dynamic_image_register_token (MONO_HANDLE_GETVAL (mb, dynamic_image), token, obj);
 }
 
-MonoObject*
-ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, guint32 token)
+MonoObjectHandle
+ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilderHandle mb, guint32 token, MonoError *error)
 {
-       MonoObject *obj;
-
-       mono_loader_lock ();
-       obj = (MonoObject *)mono_g_hash_table_lookup (mb->dynamic_image->tokens, GUINT_TO_POINTER (token));
-       mono_loader_unlock ();
-
-       return obj;
+       error_init (error);
+       MonoDynamicImage *dynamic_image = MONO_HANDLE_GETVAL (mb, dynamic_image);
+       return mono_dynamic_image_get_registered_token (dynamic_image, token, error);
 }
 
 #ifndef DISABLE_REFLECTION_EMIT