From 76cd0bf2c1d1589b0e92ed70767a44deca198f07 Mon Sep 17 00:00:00 2001 From: Marcos Henrich Date: Wed, 24 Jun 2015 11:23:54 +0100 Subject: [PATCH] [SRE] Improved token fixups processing. 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. --- .../corlib/System.Reflection.Emit/ILGenerator.cs | 2 +- .../corlib/System.Reflection.Emit/ModuleBuilder.cs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs b/mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs index a5ed328467b..ac4fda04472 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs +++ b/mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs @@ -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); } diff --git a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs index c2fd09ebc7f..26b89423c47 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs @@ -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; -- 2.25.1