[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