diff options
author | Michal Strehovsky <michals@microsoft.com> | 2017-08-03 20:55:59 +0300 |
---|---|---|
committer | Michal Strehovsky <michals@microsoft.com> | 2017-08-03 20:55:59 +0300 |
commit | f0db711d55dc4a9d9ee897296dc9198fe6bf9068 (patch) | |
tree | 1bb1fcaeb9b80ffba54d30b32d67d01818c07226 /src/System.Private.Reflection.Execution | |
parent | a41b8210f18805c9fd01ee1109a4504e31b3277d (diff) |
Fix MissingRuntimeArtifactException for generic methods
Also decode the correct instruction pointer when generic shenanigans are involved.
[tfs-changeset: 1669069]
Diffstat (limited to 'src/System.Private.Reflection.Execution')
2 files changed, 9 insertions, 4 deletions
diff --git a/src/System.Private.Reflection.Execution/src/Internal/Reflection/Execution/ExecutionEnvironmentImplementation.MappingTables.cs b/src/System.Private.Reflection.Execution/src/Internal/Reflection/Execution/ExecutionEnvironmentImplementation.MappingTables.cs index 025db1e8b..e269bf6b5 100644 --- a/src/System.Private.Reflection.Execution/src/Internal/Reflection/Execution/ExecutionEnvironmentImplementation.MappingTables.cs +++ b/src/System.Private.Reflection.Execution/src/Internal/Reflection/Execution/ExecutionEnvironmentImplementation.MappingTables.cs @@ -931,10 +931,8 @@ namespace Internal.Reflection.Execution #pragma warning restore 0420 } - internal unsafe bool TryGetMethodForOriginalLdFtnResult(IntPtr originalLdFtnResult, ref RuntimeTypeHandle declaringTypeHandle, out QMethodDefinition methodHandle, out RuntimeTypeHandle[] genericMethodTypeArgumentHandles) + internal unsafe void GetFunctionPointerAndInstantiationArgumentForOriginalLdFtnResult(IntPtr originalLdFtnResult, out IntPtr canonOriginalLdFtnResult, out IntPtr instantiationArgument) { - IntPtr canonOriginalLdFtnResult; - IntPtr instantiationArgument; if (FunctionPointerOps.IsGenericMethodPointer(originalLdFtnResult)) { GenericMethodDescriptor* realTargetData = FunctionPointerOps.ConvertToGenericDescriptor(originalLdFtnResult); @@ -965,6 +963,11 @@ namespace Internal.Reflection.Execution } } } + } + + internal bool TryGetMethodForOriginalLdFtnResult(IntPtr originalLdFtnResult, ref RuntimeTypeHandle declaringTypeHandle, out QMethodDefinition methodHandle, out RuntimeTypeHandle[] genericMethodTypeArgumentHandles) + { + GetFunctionPointerAndInstantiationArgumentForOriginalLdFtnResult(originalLdFtnResult, out IntPtr canonOriginalLdFtnResult, out IntPtr instantiationArgument); // Search TemplateMethodMap if ((instantiationArgument != IntPtr.Zero) && TryGetMethodForOriginalLdFtnResult_GenericMethodWithInstantiationArgument(instantiationArgument, ref declaringTypeHandle, out methodHandle, out genericMethodTypeArgumentHandles)) diff --git a/src/System.Private.Reflection.Execution/src/Internal/Reflection/Extensions/NonPortable/DelegateMethodInfoRetriever.cs b/src/System.Private.Reflection.Execution/src/Internal/Reflection/Extensions/NonPortable/DelegateMethodInfoRetriever.cs index 7f38bb01c..ed1255ed9 100644 --- a/src/System.Private.Reflection.Execution/src/Internal/Reflection/Extensions/NonPortable/DelegateMethodInfoRetriever.cs +++ b/src/System.Private.Reflection.Execution/src/Internal/Reflection/Extensions/NonPortable/DelegateMethodInfoRetriever.cs @@ -70,7 +70,9 @@ namespace Internal.Reflection.Extensions.NonPortable { if (!ReflectionExecution.ExecutionEnvironment.TryGetMethodForOriginalLdFtnResult(originalLdFtnResult, ref typeOfFirstParameterIfInstanceDelegate, out methodHandle, out genericMethodTypeArgumentHandles)) { - string methodDisplayString = RuntimeAugments.TryGetMethodDisplayStringFromIp(originalLdFtnResult); + ReflectionExecution.ExecutionEnvironment.GetFunctionPointerAndInstantiationArgumentForOriginalLdFtnResult(originalLdFtnResult, out IntPtr ip, out IntPtr _); + + string methodDisplayString = RuntimeAugments.TryGetMethodDisplayStringFromIp(ip); if (methodDisplayString == null) throw new MissingRuntimeArtifactException(SR.DelegateGetMethodInfo_NoDynamic); else |