[vmkit-commits] [vmkit] r86372 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaThread.cpp JavaThread.h Jni.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Nov 7 04:04:09 PST 2009


Author: geoffray
Date: Sat Nov  7 06:04:08 2009
New Revision: 86372

URL: http://llvm.org/viewvc/llvm-project?rev=86372&view=rev
Log:
Bugfix for the JNI FindClass method.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
    vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=86372&r1=86371&r2=86372&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Sat Nov  7 06:04:08 2009
@@ -138,6 +138,38 @@
 
   return meth->classDef;
 }
+  
+UserClass* JavaThread::getCallingClassFromJNI() {
+  std::vector<void*>::iterator it = addresses.end();
+
+  // Loop until we cross the first Java frame.
+  while (it != addresses.begin()) {
+    
+    // Get the last Java frame.
+    void** addr = (void**)*(--it);
+    
+    // Set the iterator to the next native -> Java call.
+    --it;
+    
+    // See if we're from JNI.
+    if (*it == 0) {
+      --it;
+      addr = (void**)*it;
+      --it;
+      if (*it == 0) {
+        addr = (void**)addr[0];
+        continue;
+      }
+    }
+
+    void* ip = FRAME_IP(addr);
+    bool isStub = ((unsigned char*)ip)[0] == 0xCE;
+    if (isStub) ip = addr[2];
+    JavaMethod* meth = getJVM()->IPToMethod<JavaMethod>(ip);
+    return meth->classDef;
+  }
+  return 0;
+}
 
 void JavaThread::getJavaFrameContext(std::vector<void*>& context) {
   std::vector<void*>::iterator it = addresses.end();

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=86372&r1=86371&r2=86372&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Sat Nov  7 06:04:08 2009
@@ -266,6 +266,11 @@
   ///
   UserClass* getCallingClass(uint32 level);
   
+  /// getCallingClassFromJNI - Get the Java class that called the last Java
+  /// method that called the FindClass JNI function.
+  ///
+  UserClass* getCallingClassFromJNI();
+  
   /// getCallingMethod - Get the Java method that called the last Java
   /// method on the stack.
   ///

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=86372&r1=86371&r2=86372&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Sat Nov  7 06:04:08 2009
@@ -67,7 +67,7 @@
   JnjvmClassLoader* loader = 0;
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  UserClass* currentClass = th->getCallingClass(0);
+  UserClass* currentClass = th->getCallingClassFromJNI();
   if (currentClass) loader = currentClass->classLoader;
   else loader = vm->appClassLoader;
 





More information about the vmkit-commits mailing list