[SRE] Improved token fixups processing.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Wed, 24 Jun 2015 10:23:54 +0000 (11:23 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Mon, 6 Jul 2015 15:24:36 +0000 (16:24 +0100)
The runtime requires a MemberInfo from the fixups.
A metadata token needs to be translated into a MemberInfo.
Nontheless Module.ResolveMember only works with loaded assemblies.

Local unbuilded members also needed to be resolved so a new method
ResolveOrGetRegisteredToken was added to retrieve from the runtime the
cached XXXBuilder for a token.

mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs
mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs

index a5ed328467bbb8d2a9b51ee71509dbb405920de8..ac4fda04472f0572052c8433509685a8e063af93 100644 (file)
@@ -1088,7 +1088,7 @@ namespace System.Reflection.Emit {
                                        var token = (int) BitConverter.ToUInt32 (il, pos);
                                        var tokenInfo = new ILTokenInfo () {
                                                code_pos = pos,
-                                               member = module.ResolveMember (token),
+                                               member = ((ModuleBuilder) module).ResolveOrGetRegisteredToken (token, null, null)
                                        };
                                        tokenInfos.Add (tokenInfo);
                                }
index c2fd09ebc7f0b7ccb9eae373012d101d7db86847..26b89423c471ac27d7aacd55dcecd5067c0ce88e 100644 (file)
@@ -902,6 +902,20 @@ namespace System.Reflection.Emit {
                                return m;
                }
 
+               internal MemberInfo ResolveOrGetRegisteredToken (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
+               {
+                       ResolveTokenError error;
+                       MemberInfo m = ResolveMemberToken (_impl, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error);
+                       if (m != null)
+                               return m;
+
+                       m = GetRegisteredToken (metadataToken) as MemberInfo;
+                       if (m == null)
+                               throw resolve_token_exception (metadataToken, error, "MemberInfo");
+                       else
+                               return m;
+               }
+
                public override MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) {
                        ResolveTokenError error;