[vmkit-commits] [vmkit] r145387 - in /vmkit/trunk/lib/j3/ClassLib/OpenJDK: JavaUpcalls.cpp JavaUpcalls.h OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Mon Nov 28 23:15:35 PST 2011
Author: wdietz2
Date: Tue Nov 29 01:15:35 2011
New Revision: 145387
URL: http://llvm.org/viewvc/llvm-project?rev=145387&view=rev
Log:
Skip Method.invoke() when returning CallerClass, fixes failing access control
With this change mauve's ReflectAccess, Method.invoke, and others now pass
OpenJDK-only.
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=145387&r1=145386&r2=145387&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Tue Nov 29 01:15:35 2011
@@ -83,6 +83,7 @@
JavaMethod* Classpath::InitDirectByteBuffer;
Class* Classpath::newClassLoader;
Class* Classpath::cloneableClass;
+JavaMethod* Classpath::ReflectInvokeMethod;
JavaField* Classpath::boolValue;
@@ -730,6 +731,10 @@
cloneableClass = UPCALL_CLASS(loader, "java/lang/Cloneable");
+ ReflectInvokeMethod =
+ UPCALL_METHOD(loader, "java/lang/reflect/Method", "invoke",
+ "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", ACC_VIRTUAL);
+
newThread =
UPCALL_CLASS(loader, "java/lang/Thread");
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h?rev=145387&r1=145386&r2=145387&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h Tue Nov 29 01:15:35 2011
@@ -100,6 +100,7 @@
ISOLATE_STATIC JavaField* vmdataClassLoader;
ISOLATE_STATIC UserClass* cloneableClass;
ISOLATE_STATIC UserClass* enumClass;
+ ISOLATE_STATIC JavaMethod* ReflectInvokeMethod;
ISOLATE_STATIC JavaField* boolValue;
ISOLATE_STATIC JavaField* byteValue;
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=145387&r1=145386&r2=145387&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov 29 01:15:35 2011
@@ -1132,7 +1132,18 @@
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
- UserClass* cl = th->getCallingClassLevel(n);
+
+ // Find the requested frame
+ JavaMethod * meth = th->getCallingMethodLevel(n);
+
+ // Grab the next frame up if the frame requested is Method.invoke()
+ // TODO: Better integrate this throughout the reflection API?
+ // Note that this isn't necessary in the Classpath port only because
+ // it doesn't enforce any language access control for reflection
+ if (meth == vm->upcalls->ReflectInvokeMethod)
+ meth = th->getCallingMethodLevel(n+1);
+
+ UserClass *cl = meth->classDef;
assert(cl);
JavaObject * const * res = cl->getClassDelegateePtr(vm);
RETURN_FROM_JNI((jclass)res);
More information about the vmkit-commits
mailing list