diff options
author | jfrijters <jfrijters> | 2013-02-24 19:19:46 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2013-02-24 19:19:46 +0400 |
commit | b1b5fee0342725a1fe7cc28f138292448922916a (patch) | |
tree | 1f497fac833dad5e2ef930846aa1183a0f57efc0 /runtime/openjdk/java.lang.invoke.cs | |
parent | f8c1c294f53241a4155457e29a8946ce7c0143fd (diff) |
Bug fix. MethodHandle to Object.clone/finalize should be special cased.
Diffstat (limited to 'runtime/openjdk/java.lang.invoke.cs')
-rw-r--r-- | runtime/openjdk/java.lang.invoke.cs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs index d8e2be78..6cfef41f 100644 --- a/runtime/openjdk/java.lang.invoke.cs +++ b/runtime/openjdk/java.lang.invoke.cs @@ -1,5 +1,5 @@ /* - Copyright (C) 2011 Jeroen Frijters + Copyright (C) 2011-2013 Jeroen Frijters This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -82,7 +82,6 @@ static class Java_java_lang_invoke_CallSite static class Java_java_lang_invoke_DirectMethodHandle { - // TODO what is lookupClass for? public static object createDelegate(MethodType type, MemberName m, bool doDispatch, jlClass lookupClass) { #if FIRST_PASS @@ -136,6 +135,27 @@ static class Java_java_lang_invoke_DirectMethodHandle dm.Ret(); return dm.CreateDelegate(); } + // 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)) + { + TypeWrapper thisType = TypeWrapper.FromClass(lookupClass); + TypeWrapper cli_System_Object = ClassLoaderWrapper.LoadClassCritical("cli.System.Object"); + TypeWrapper cli_System_Exception = ClassLoaderWrapper.LoadClassCritical("cli.System.Exception"); + // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable + // to a more specific base type. + if (thisType.IsAssignableTo(cli_System_Object)) + { + mw = cli_System_Object.GetMethodWrapper(mw.Name, mw.Signature, true); + } + else if (thisType.IsAssignableTo(cli_System_Exception)) + { + mw = cli_System_Exception.GetMethodWrapper(mw.Name, mw.Signature, true); + } + else if (thisType.IsAssignableTo(CoreClasses.java.lang.Throwable.Wrapper)) + { + mw = CoreClasses.java.lang.Throwable.Wrapper.GetMethodWrapper(mw.Name, mw.Signature, true); + } + } mw.ResolveMethod(); MethodInfo mi = mw.GetMethod() as MethodInfo; if (mi != null |