[vmkit-commits] [vmkit] r180548 - Corrected push/pop local frame and some return handlings in Jni functions.

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


Author: peter.senna
Date: Thu Apr 25 12:22:15 2013
New Revision: 180548

URL: http://llvm.org/viewvc/llvm-project?rev=180548&view=rev
Log:
Corrected push/pop local frame and some return handlings in Jni functions.
(cherry picked from commit 72cf8e4e2449902fbc27cfa09e0fcbd262564bed)

Modified:
    vmkit/trunk/lib/j3/VMCore/Jni.cpp

Modified: vmkit/trunk/lib/j3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jni.cpp?rev=180548&r1=180547&r2=180548&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jni.cpp Thu Apr 25 12:22:15 2013
@@ -54,13 +54,18 @@ jint GetVersion(JNIEnv *env) {
 jobject NewLocalRef(JNIEnv *env, jobject ref) {
 	JavaObject* Obj = 0;
 	llvm_gcroot(Obj, 0);
+
+	BEGIN_JNI_EXCEPTION
+
 	if (ref) {
-		JavaThread* th = JavaThread::get();
 		Obj = *(JavaObject**)ref;
-		JavaObject** res = th->localJNIRefs->addJNIReference(th, Obj);
-		return ((jweak)(jobject)res);
+		jobject res = (jobject)th->pushJNIRef(Obj);
+		RETURN_FROM_JNI(res);
 	}
-	return NULL;
+
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0);
 }
 
 
@@ -90,7 +95,7 @@ jclass DefineClass(JNIEnv *env, const ch
 
   END_JNI_EXCEPTION
 
-  return 0;
+  RETURN_FROM_JNI(0);
 }
 
 
@@ -271,8 +276,8 @@ void ExceptionDescribe(JNIEnv *env) {
 void ExceptionClear(JNIEnv *env) {
   BEGIN_JNI_EXCEPTION
   JavaThread::get()->pendingException = NULL;
-  RETURN_VOID_FROM_JNI
   END_JNI_EXCEPTION
+  RETURN_VOID_FROM_JNI
 }
 
 
@@ -283,26 +288,44 @@ void FatalError(JNIEnv *env, const char
 
 
 jint PushLocalFrame(JNIEnv* env, jint capacity) {
-  JavaThread* th = JavaThread::get();
+	BEGIN_JNI_EXCEPTION
+
+	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;
+
+  RETURN_FROM_JNI(0);
+
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0);
 }
 
 jobject PopLocalFrame(JNIEnv* env, jobject result) {
-  JavaThread* th = JavaThread::get();
-  th->endJNI();
+	JavaObject* res = NULL;
+	llvm_gcroot(res, 0);
+
+	BEGIN_JNI_EXCEPTION
+
+	JavaThread* th = JavaThread::get();
   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 NewLocalRef(env, result);
+
+  if(result){
+  	res = *(JavaObject**)result;
+  	jobject ret = (jobject)th->pushJNIRef(res);
+  	RETURN_FROM_JNI(ret);
+  }
+
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0);
 }
 
 





More information about the vmkit-commits mailing list