[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