Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Strehovsky <michals@microsoft.com>2017-08-03 20:55:59 +0300
committerMichal Strehovsky <michals@microsoft.com>2017-08-03 20:55:59 +0300
commitf0db711d55dc4a9d9ee897296dc9198fe6bf9068 (patch)
tree1bb1fcaeb9b80ffba54d30b32d67d01818c07226 /src/System.Private.Reflection.Execution
parenta41b8210f18805c9fd01ee1109a4504e31b3277d (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')
-rw-r--r--src/System.Private.Reflection.Execution/src/Internal/Reflection/Execution/ExecutionEnvironmentImplementation.MappingTables.cs9
-rw-r--r--src/System.Private.Reflection.Execution/src/Internal/Reflection/Extensions/NonPortable/DelegateMethodInfoRetriever.cs4
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