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>2013-02-24 19:19:46 +0400
committerjfrijters <jfrijters>2013-02-24 19:19:46 +0400
commitb1b5fee0342725a1fe7cc28f138292448922916a (patch)
tree1f497fac833dad5e2ef930846aa1183a0f57efc0 /runtime/openjdk/java.lang.invoke.cs
parentf8c1c294f53241a4155457e29a8946ce7c0143fd (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.cs24
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