diff options
author | jfrijters <jfrijters> | 2011-08-06 23:51:17 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2011-08-06 23:51:17 +0400 |
commit | a82c5af2442f88d5741e9b24049cc45c6b338bcb (patch) | |
tree | c9abfbfd14a3d2f7cbfe7f64abaa36122a998b4d /runtime/openjdk/java.lang.invoke.cs | |
parent | 6e7b8693fd524ab6544f1b9fa4cb4d2981b8664f (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.cs | 14 |
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++) { |