[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