[SRE] Added ModuleBuilder.GetRegisteredToken icall
authorMarcos Henrich <marcos.henrich@xamarin.com>
Wed, 24 Jun 2015 10:18:14 +0000 (11:18 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Mon, 6 Jul 2015 15:24:35 +0000 (16:24 +0100)
ModuleBuilder.GetRegisteredToken returns a Builder previously registered
for a token.

This is required when the builded module has not been yet loaded into
memory but we still need to resolve the token into a builder.

mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs
mono/metadata/icall-def.h
mono/metadata/icall.c

index 339774578d3a2941e7d48252c7c7b2aeae0ad1e6..c2fd09ebc7f0b7ccb9eae373012d101d7db86847 100644 (file)
@@ -713,6 +713,12 @@ namespace System.Reflection.Emit {
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                internal extern void RegisterToken (object obj, int token);
 
+               /*
+                * Returns MemberInfo registered with the given token.
+                */
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               internal extern object GetRegisteredToken (int token);
+
                internal TokenGenerator GetTokenGenerator () {
                        if (token_gen == null)
                                token_gen = new ModuleBuilderTokenGenerator (this);
index fa84d340345cbee4822e2b9f35758e0f39c7b922..38cac7aa4f91a9a180feba2a30f3fdbd939b2f84 100644 (file)
@@ -512,7 +512,8 @@ ICALL(GPARB_1, "initialize", mono_reflection_initialize_generic_parameter)
 ICALL_TYPE(METHODB, "System.Reflection.Emit.MethodBuilder", METHODB_1)
 ICALL(METHODB_1, "MakeGenericMethod", mono_reflection_bind_generic_method_parameters)
 
-ICALL_TYPE(MODULEB, "System.Reflection.Emit.ModuleBuilder", MODULEB_8)
+ICALL_TYPE(MODULEB, "System.Reflection.Emit.ModuleBuilder", MODULEB_10)
+ICALL(MODULEB_10, "GetRegisteredToken", ves_icall_ModuleBuilder_GetRegisteredToken)
 ICALL(MODULEB_8, "RegisterToken", ves_icall_ModuleBuilder_RegisterToken)
 ICALL(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile)
 ICALL(MODULEB_2, "basic_init", mono_image_module_basic_init)
index 2aace4cbc4b0ace9ade61f3a74abf0dccb51724b..08c162f4d0b5e2c5fadc05c7d7edfaec7daed5d5 100644 (file)
@@ -1162,6 +1162,18 @@ ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObje
        mono_image_register_token (mb->dynamic_image, token, obj);
 }
 
+ICALL_EXPORT MonoObject*
+ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, guint32 token)
+{
+       gpointer obj;
+
+       mono_loader_lock ();
+       obj = mono_g_hash_table_lookup (mb->dynamic_image->tokens, GUINT_TO_POINTER (token));
+       mono_loader_unlock ();
+
+       return obj;
+}
+
 static gboolean
 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
 {