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

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2011-08-06 23:51:17 +0400
committerjfrijters <jfrijters>2011-08-06 23:51:17 +0400
commita82c5af2442f88d5741e9b24049cc45c6b338bcb (patch)
treec9abfbfd14a3d2f7cbfe7f64abaa36122a998b4d /runtime/openjdk/java.lang.invoke.cs
parent6e7b8693fd524ab6544f1b9fa4cb4d2981b8664f (diff)
Fixed MethodHandle.invoke() caching. We were caching the instance, instead of just the type.
Diffstat (limited to 'runtime/openjdk/java.lang.invoke.cs')
-rw-r--r--runtime/openjdk/java.lang.invoke.cs14
1 files changed, 8 insertions, 6 deletions
diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs
index 6e80ae96..6f8a9e2e 100644
--- a/runtime/openjdk/java.lang.invoke.cs
+++ b/runtime/openjdk/java.lang.invoke.cs
@@ -528,7 +528,7 @@ static partial class MethodHandleUtil
Dump((Delegate)field.GetValue(d.Target), nest + 2);
}
field = d.Target.GetType().GetField("target");
- if (field != null)
+ if (field != null && field.GetValue(d.Target) != null)
{
Dump((Delegate)field.GetValue(d.Target), nest == 0 ? 1 : nest);
}
@@ -940,17 +940,19 @@ static class Java_java_lang_invoke_MethodHandleNatives
int index = m.getVMIndex();
if (index == Int32.MaxValue)
{
- Type targetDelegateType = MethodHandleUtil.CreateDelegateType(self.type().dropParameterTypes(0, 1));
+ bool invokeExact = m.getName() == "invokeExact";
+ Type targetDelegateType = MethodHandleUtil.CreateDelegateType(invokeExact ? self.type().dropParameterTypes(0, 1) : self.type());
MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("DirectMethodHandle." + m.getName(), self.type(), typeof(IKVM.Runtime.InvokeCache<>).MakeGenericType(targetDelegateType));
dm.Ldarg(0);
- if (m.getName() == "invoke")
+ if (invokeExact)
{
- dm.LoadValueAddress();
- dm.Call(ByteCodeHelperMethods.GetDelegateForInvoke.MakeGenericMethod(targetDelegateType));
+ dm.Call(ByteCodeHelperMethods.GetDelegateForInvokeExact.MakeGenericMethod(targetDelegateType));
}
else
{
- dm.Call(ByteCodeHelperMethods.GetDelegateForInvokeExact.MakeGenericMethod(targetDelegateType));
+ dm.LoadValueAddress();
+ dm.Call(ByteCodeHelperMethods.GetDelegateForInvoke.MakeGenericMethod(targetDelegateType));
+ dm.Ldarg(0);
}
for (int i = 1, count = self.type().parameterCount(); i < count; i++)
{