[vmkit-commits] [vmkit] r180545 - Add implementation of JNI local frames, relying on JNILocalReferences implementation

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:23:30 PDT 2013


Author: peter.senna
Date: Thu Apr 25 12:21:54 2013
New Revision: 180545

URL: http://llvm.org/viewvc/llvm-project?rev=180545&view=rev
Log:
Add implementation of JNI local frames, relying on JNILocalReferences implementation
(cherry picked from commit 3130ac410caf5442f761794a3cfa169fe6fe3c44)

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

Modified: vmkit/trunk/lib/j3/VMCore/JNIReferences.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JNIReferences.h?rev=180545&r1=180544&r2=180545&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JNIReferences.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JNIReferences.h Thu Apr 25 12:21:54 2013
@@ -38,6 +38,7 @@ public:
 
   void removeJNIReferences(JavaThread* th, uint32_t num);
 
+  uint32_t getLength() { return length; }
 };
 
 class JNIGlobalReferences {

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.cpp?rev=180545&r1=180544&r2=180545&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.cpp Thu Apr 25 12:21:54 2013
@@ -154,6 +154,8 @@ JavaObject** JNILocalReferences::addJNIR
   }
 }
 
+/// TODO optimize this function with iterative impl.
+///
 void JNILocalReferences::removeJNIReferences(JavaThread* th, uint32_t num) {
     
   if (th->localJNIRefs != this) {

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.h?rev=180545&r1=180544&r2=180545&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.h Thu Apr 25 12:21:54 2013
@@ -103,6 +103,9 @@ public:
 
   vmkit::LockingThread lockingThread;
   
+  /// JNI implementation fields
+  ///
+
   /// currentAddedReferences - Current number of added local references.
   ///
   uint32_t* currentAddedReferences;
@@ -111,6 +114,14 @@ public:
   ///
   JNILocalReferences* localJNIRefs;
 
+  /// JNIlocalFrames - vector of JNI Frames
+  /// pair represents { oldAddedReferences, capacity }
+  ///
+  std::vector< std::pair<uint32_t*, int> > JNIlocalFrames;
+
+  ///
+  ///
+
   // State of this Thread
   int state;
 

Modified: vmkit/trunk/lib/j3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jni.cpp?rev=180545&r1=180544&r2=180545&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jni.cpp Thu Apr 25 12:21:54 2013
@@ -271,15 +271,30 @@ void FatalError(JNIEnv *env, const char
 
 
 jint PushLocalFrame(JNIEnv* env, jint capacity) {
-  NYI();
-  abort();
+  JavaThread* th = JavaThread::get();
+  std::pair<uint32_t*,int> frame;
+  frame.first = th->currentAddedReferences;
+  frame.second = th->localJNIRefs->getLength();
+  th->JNIlocalFrames.push_back(frame);
+  th->startJNI();
   return 0;
 }
 
 jobject PopLocalFrame(JNIEnv* env, jobject result) {
-  NYI();
-  abort();
-  return 0;
+	if(result){
+	  NYI();
+	  abort();
+	}
+  JavaThread* th = JavaThread::get();
+  th->endJNI();
+  std::pair<uint32_t*, int> frame = th->JNIlocalFrames.back();
+  th->currentAddedReferences = frame.first;
+
+  uint32_t toRemove = th->localJNIRefs->getLength() - frame.second;
+  assert(toRemove >= 0 && "Local frame has negative number of references to remove");
+  th->JNIlocalFrames.pop_back();
+  th->localJNIRefs->removeJNIReferences(th,toRemove);
+  return result;
 }
 
 





More information about the vmkit-commits mailing list