diff options
author | jfrijters <jfrijters> | 2015-05-31 15:02:05 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2015-05-31 15:02:05 +0300 |
commit | 4bcb33b1bbf4f99664eec3718b601d8f4b85916c (patch) | |
tree | 5f89e646440cf492b2635eb4f6b050f8c6b9c21d /runtime/openjdk/java.lang.invoke.cs | |
parent | 3cecb628c94c9b5d7a7e3476fcac80695b73ac17 (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.cs | 22 |
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); } |