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>2015-05-31 15:02:05 +0300
committerjfrijters <jfrijters>2015-05-31 15:02:05 +0300
commit4bcb33b1bbf4f99664eec3718b601d8f4b85916c (patch)
tree5f89e646440cf492b2635eb4f6b050f8c6b9c21d /runtime/openjdk/java.lang.invoke.cs
parent3cecb628c94c9b5d7a7e3476fcac80695b73ac17 (diff)
Better fix for clone/finalize invocation via MethodHandle.
Diffstat (limited to 'runtime/openjdk/java.lang.invoke.cs')
-rw-r--r--runtime/openjdk/java.lang.invoke.cs22
1 files changed, 16 insertions, 6 deletions
diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs
index 2f760ee4..b659e441 100644
--- a/runtime/openjdk/java.lang.invoke.cs
+++ b/runtime/openjdk/java.lang.invoke.cs
@@ -905,11 +905,6 @@ static partial class MethodHandleUtil
{
dm.EmitCastclass(tw.TypeAsBaseType);
}
- else if (mw.IsProtected && (mw.DeclaringType == CoreClasses.java.lang.Object.Wrapper || mw.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper))
- {
- // HACK we don't support calling clone or finalize on cli.System.Object and cli.System.Exception
- dm.EmitCastclass(tw.TypeAsBaseType);
- }
else if (tw != CoreClasses.cli.System.Object.Wrapper)
{
dm.EmitCheckcast(tw);
@@ -944,7 +939,22 @@ static partial class MethodHandleUtil
{
dm.LoadCallerID();
}
- if (doDispatch && !mw.IsStatic)
+ // special case for Object.clone() and Object.finalize()
+ if (mw.IsProtected
+ && (mw.DeclaringType == CoreClasses.java.lang.Object.Wrapper || mw.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper)
+ && (mw.Name == StringConstants.FINALIZE || mw.Name == StringConstants.CLONE))
+ {
+ if (doDispatch)
+ {
+ mw.EmitCallvirtReflect(dm.ilgen);
+ }
+ else
+ {
+ // we can re-use the implementations from cli.System.Object (even though the object may not in-fact extend cli.System.Object)
+ CoreClasses.cli.System.Object.Wrapper.GetMethodWrapper(mw.Name, mw.Signature, false).EmitCall(dm.ilgen);
+ }
+ }
+ else if (doDispatch && !mw.IsStatic)
{
dm.Callvirt(mw);
}