diff options
author | jfrijters <jfrijters> | 2015-05-31 15:10:51 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2015-05-31 15:10:51 +0300 |
commit | 4769dd900a42ec3f38de5bb9b76ff07bc1d4d8de (patch) | |
tree | 16a08251c1edb9b246ad3008a82f533c8a07f7bd | |
parent | 4bcb33b1bbf4f99664eec3718b601d8f4b85916c (diff) |
Added MethodWrapper.IsFinalizeOrClone property to centralize the logic to detect these two special cased methods.
-rw-r--r-- | runtime/MemberWrapper.cs | 10 | ||||
-rw-r--r-- | runtime/compiler.cs | 2 | ||||
-rw-r--r-- | runtime/openjdk/java.lang.invoke.cs | 6 |
3 files changed, 13 insertions, 5 deletions
diff --git a/runtime/MemberWrapper.cs b/runtime/MemberWrapper.cs index 53c1d66a..27e4bdc8 100644 --- a/runtime/MemberWrapper.cs +++ b/runtime/MemberWrapper.cs @@ -861,6 +861,16 @@ namespace IKVM.Internal && !IsConstructor; } } + + internal bool IsFinalizeOrClone + { + get + { + return IsProtected + && (DeclaringType == CoreClasses.java.lang.Object.Wrapper || DeclaringType == CoreClasses.java.lang.Throwable.Wrapper) + && (Name == StringConstants.CLONE || Name == StringConstants.FINALIZE); + } + } } // placeholder for <clinit> method that exist in ClassFile but not in TypeWrapper diff --git a/runtime/compiler.cs b/runtime/compiler.cs index 574f5ce0..69bf1f5c 100644 --- a/runtime/compiler.cs +++ b/runtime/compiler.cs @@ -1499,7 +1499,7 @@ sealed class Compiler nonleaf = true; // HACK this code is duplicated in java.lang.invoke.cs - if(method.IsProtected && (method.DeclaringType == CoreClasses.java.lang.Object.Wrapper || method.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper)) + if(method.IsFinalizeOrClone) { // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable // to a more specific base type. diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs index b659e441..e038a809 100644 --- a/runtime/openjdk/java.lang.invoke.cs +++ b/runtime/openjdk/java.lang.invoke.cs @@ -419,7 +419,7 @@ static class Java_java_lang_invoke_MethodHandleNatives return MethodHandleUtil.DynamicMethodBuilder.CreateDynamicOnly(mw, type); } // HACK this code is duplicated in compiler.cs - if (mw.IsProtected && (mw.DeclaringType == CoreClasses.java.lang.Object.Wrapper || mw.DeclaringType == CoreClasses.java.lang.Throwable.Wrapper)) + if (mw.IsFinalizeOrClone) { TypeWrapper thisType = TypeWrapper.FromClass(caller); // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable @@ -940,9 +940,7 @@ static partial class MethodHandleUtil dm.LoadCallerID(); } // 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 (mw.IsFinalizeOrClone) { if (doDispatch) { |