[vmkit-commits] [vmkit] r180546 - Implementing some JNI functions for OpenJDK
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:23:39 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:22:03 2013
New Revision: 180546
URL: http://llvm.org/viewvc/llvm-project?rev=180546&view=rev
Log:
Implementing some JNI functions for OpenJDK
(cherry picked from commit e26c83e5d5dcd062837c3a7b43490c3c10c48700)
Modified:
vmkit/trunk/include/vmkit/System.h
vmkit/trunk/include/vmkit/Thread.h
vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
vmkit/trunk/lib/j3/VMCore/JavaThread.h
vmkit/trunk/lib/j3/VMCore/Jni.cpp
vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
Modified: vmkit/trunk/include/vmkit/System.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/System.h?rev=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/System.h (original)
+++ vmkit/trunk/include/vmkit/System.h Thu Apr 25 12:22:03 2013
@@ -149,7 +149,7 @@ public:
return pagesize;
}
- static word_t GetCallerAddress() {
+ static word_t GetCallerAddress() __attribute((always_inline)) {
#if defined(ARCH_X86) || defined(ARCH_X64)
return (word_t)__builtin_frame_address(0);
#else
Modified: vmkit/trunk/include/vmkit/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/Thread.h?rev=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/Thread.h (original)
+++ vmkit/trunk/include/vmkit/Thread.h Thu Apr 25 12:22:03 2013
@@ -213,6 +213,7 @@ public:
void enterUncooperativeCode(uint16_t level = 0) __attribute__ ((noinline));
void enterUncooperativeCode(word_t SP);
void leaveUncooperativeCode();
+ bool isInUncooperativeCode() { return lastSP; };
word_t waitOnSP();
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=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Thu Apr 25 12:22:03 2013
@@ -1390,6 +1390,7 @@ JVM_FindLoadedClass(JNIEnv *env, jobject
CommonClass * Cl = 0;
JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
+ assert(JCL && "JnVMClassloader is null");
Cl = JCL->lookupClassFromJavaString(str);
jclass res = Cl ? (jclass)Cl->getClassDelegateePtr(vm) : 0;
RETURN_FROM_JNI(res);
Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.h?rev=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.h Thu Apr 25 12:22:03 2013
@@ -36,10 +36,12 @@ class Jnjvm;
#define BEGIN_JNI_EXCEPTION \
JavaThread* th = JavaThread::get(); \
word_t SP = th->getLastSP(); \
+ bool _inUncooperative = th->isInUncooperativeCode(); \
+ if (_inUncooperative) {\
th->leaveUncooperativeCode(); \
vmkit::KnownFrame Frame; \
th->startKnownFrame(Frame); \
- /*Frame.currentFP = vmkit::System::GetCallerAddress(); */\
+ Frame.currentFP = vmkit::System::GetCallerAddress(); }\
TRY {
#define END_JNI_EXCEPTION \
@@ -48,13 +50,15 @@ class Jnjvm;
} END_CATCH;
#define RETURN_FROM_JNI(a) {\
+ if (_inUncooperative) {\
th->endKnownFrame(); \
- th->enterUncooperativeCode(SP); \
+ th->enterUncooperativeCode(SP); }\
return (a); } \
#define RETURN_VOID_FROM_JNI {\
+ if (_inUncooperative) {\
th->endKnownFrame(); \
- th->enterUncooperativeCode(SP); \
+ th->enterUncooperativeCode(SP); }\
return; } \
/// This is used to implement park/unpark behavior.
Modified: vmkit/trunk/lib/j3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jni.cpp?rev=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jni.cpp Thu Apr 25 12:22:03 2013
@@ -51,6 +51,18 @@ jint GetVersion(JNIEnv *env) {
return JNI_VERSION_1_4;
}
+jobject NewLocalRef(JNIEnv *env, jobject ref) {
+ JavaObject* Obj = 0;
+ llvm_gcroot(Obj, 0);
+ if (ref) {
+ JavaThread* th = JavaThread::get();
+ Obj = *(JavaObject**)ref;
+ JavaObject** res = th->localJNIRefs->addJNIReference(th, Obj);
+ return ((jweak)(jobject)res);
+ }
+ return NULL;
+}
+
jclass DefineClass(JNIEnv *env, const char *name, jobject _loader,
const jbyte *buf, jsize len) {
@@ -281,10 +293,6 @@ jint PushLocalFrame(JNIEnv* env, jint ca
}
jobject PopLocalFrame(JNIEnv* env, jobject result) {
- if(result){
- NYI();
- abort();
- }
JavaThread* th = JavaThread::get();
th->endJNI();
std::pair<uint32_t*, int> frame = th->JNIlocalFrames.back();
@@ -294,7 +302,7 @@ jobject PopLocalFrame(JNIEnv* env, jobje
assert(toRemove >= 0 && "Local frame has negative number of references to remove");
th->JNIlocalFrames.pop_back();
th->localJNIRefs->removeJNIReferences(th,toRemove);
- return result;
+ return NewLocalRef(env, result);
}
@@ -320,13 +328,6 @@ jboolean IsSameObject(JNIEnv *env, jobje
}
-jobject NewLocalRef(JNIEnv *env, jobject ref) {
- NYI();
- abort();
- return 0;
-}
-
-
jint EnsureLocalCapacity(JNIEnv* env, jint capacity) {
// Assume we have capacity
return 0;
@@ -4172,7 +4173,9 @@ void ReleaseStringCritical(JNIEnv *env,
abort();
}
-
+/// FIXME : I copied the code of strong references. We need to implement real
+/// weak references.
+///
jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) {
JavaObject* Obj = NULL;
llvm_gcroot(Obj, 0);
Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180546&r1=180545&r2=180546&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 12:22:03 2013
@@ -824,7 +824,8 @@ JnjvmClassLoader::getJnjvmLoaderFromJava
llvm_gcroot(loader, 0);
llvm_gcroot(vmdata, 0);
- if (loader == NULL) return vm->bootstrapLoader;
+ if (loader == NULL)
+ return vm->bootstrapLoader;
JnjvmClassLoader* JCL = 0;
Classpath* upcalls = vm->bootstrapLoader->upcalls;
@@ -834,7 +835,7 @@ JnjvmClassLoader::getJnjvmLoaderFromJava
// If the vmdata field isn't set yet, or it's set to something other than
// a VMClassLoader (which happens in the OpenJDK port), then initialize
// the field now.
- if (vmdata == NULL || !VMClassLoader::isVMClassLoader(vmdata)) {
+ if (vmdata == NULL) {
JavaObject::acquire(loader);
vmdata =
(VMClassLoader*)(upcalls->vmdataClassLoader->getInstanceObjectField(loader));
@@ -846,11 +847,23 @@ JnjvmClassLoader::getJnjvmLoaderFromJava
upcalls->vmdataClassLoader->setInstanceObjectField(loader, (JavaObject*)vmdata);
}
JavaObject::release(loader);
+ }
+ else if (!VMClassLoader::isVMClassLoader(vmdata)) {
+ JavaObject::acquire(loader);
+ vmdata = VMClassLoader::allocate();
+ vmkit::BumpPtrAllocator* A = new vmkit::BumpPtrAllocator();
+ JCL = new(*A, "Class loader") JnjvmClassLoader(*A, *vm->bootstrapLoader,
+ loader, vmdata, vm);
+ upcalls->vmdataClassLoader->setInstanceObjectField(loader, (JavaObject*)vmdata);
+ JavaObject::release(loader);
} else {
JCL = vmdata->getClassLoader();
assert(JCL->javaLoader == loader);
}
-
+ if (!JCL) {
+ assert( vmdata->getClassLoader() == JCL && "Loader is not equal to stored value");
+ fprintf(stderr, "Error in method %s, %d because condition 1: %d\n", __FILE__, __LINE__, (vmdata == NULL || !VMClassLoader::isVMClassLoader(vmdata)));
+ }
return JCL;
}
More information about the vmkit-commits
mailing list