[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