[vmkit-commits] [vmkit] r198301 - Better management of null Java references in C++ code

Gael Thomas gael.thomas at lip6.fr
Thu Jan 2 04:20:49 PST 2014


Author: gthomas
Date: Thu Jan  2 06:20:49 2014
New Revision: 198301

URL: http://llvm.org/viewvc/llvm-project?rev=198301&view=rev
Log:
Better management of null Java references in C++ code

Modified:
    vmkit/branches/mcjit/include/j3/j3object.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3object.cc
    vmkit/branches/mcjit/lib/j3/vm/j3options.cc
    vmkit/branches/mcjit/lib/j3/vm/j3signature.cc

Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Thu Jan  2 06:20:49 2014
@@ -193,7 +193,7 @@ namespace j3 {
 	public:
 		J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack<J3ObjectHandle>(_allocator) {}
 
-		J3ObjectHandle* push(J3ObjectHandle* handle) { return push(handle->obj()); }
+		J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; }
 		J3ObjectHandle* push(J3Object* obj);
 	};
 

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan  2 06:20:49 2014
@@ -348,7 +348,12 @@ jclass JNICALL JVM_FindClassFromBootLoad
  * or NoClassDefFoundError depending on the value of the last
  * argument.
  */
-jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *name, jboolean init, jobject loader, jboolean throwError) { enterJVM(); NYI(); leaveJVM(); }
+jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *name, jboolean init, jobject loader, jboolean throwError) { 
+	enterJVM(); 
+	fprintf(stderr, " class loader: %p\n", loader);
+	NYI(); 
+	leaveJVM(); 
+}
 
 /*
  * Find a class from a given class.

Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan  2 06:20:49 2014
@@ -357,7 +357,14 @@ void JNICALL SetStaticFloatField(JNIEnv*
 void JNICALL SetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID, jdouble value) { enterJVM(); leaveJVM(); NYI(); }
 
 jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { enterJVM(); leaveJVM(); NYI(); }
-jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { enterJVM(); leaveJVM(); NYI(); }
+jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { 
+	jsize res;
+	enterJVM(); 
+	res = str->getObject(J3Thread::get()->vm()->stringClassValue)->arrayLength();
+	leaveJVM(); 
+	return res;
+}
+
 const jchar* JNICALL GetStringChars(JNIEnv* env, jstring str, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); }
 void JNICALL ReleaseStringChars(JNIEnv* env, jstring str, const jchar* chars) { enterJVM(); leaveJVM(); NYI(); }
 
@@ -371,13 +378,19 @@ jstring JNICALL NewStringUTF(JNIEnv* env
 	return res;
 }
 
-jsize JNICALL GetStringUTFLength(JNIEnv* env, jstring str) { enterJVM(); leaveJVM(); NYI(); }
+jsize JNICALL GetStringUTFLength(JNIEnv* env, jstring str) { 
+	jsize res;
+	enterJVM(); 
+	res = str->getObject(J3Thread::get()->vm()->stringClassValue)->arrayLength();
+	leaveJVM(); 
+	return res;
+}
 
 const char* JNICALL GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) { 
 	char* res;
 
 	enterJVM(); 
-	J3* vm = str->vt()->type()->loader()->vm();
+	J3* vm = J3Thread::get()->vm();
 	jobject content = str->getObject(vm->stringClassValue);
 	uint32_t length = content->arrayLength();
 	res = new char[length+1];
@@ -455,7 +468,19 @@ jint JNICALL MonitorExit(JNIEnv* env, jo
 jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { enterJVM(); leaveJVM(); NYI(); }
 
 void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); leaveJVM(); NYI(); }
-void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { enterJVM(); leaveJVM(); NYI(); }
+
+void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { 
+	enterJVM(); 
+	J3* vm = J3Thread::get()->vm();
+	jobject content = str->getObject(vm->stringClassValue);
+
+	for(uint32_t i=0; i<len; i++)
+		buf[i] = content->getCharAt(start+i);
+
+	//buf[len] = 0;
+
+	leaveJVM(); 
+}
 
 void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); }
 void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan  2 06:20:49 2014
@@ -468,9 +468,7 @@ J3ObjectHandle* J3ObjectHandle::rawCASOb
 		return orig;
 	else if(res == ov)
 		return value;
-	else if(!res)
-		return 0;
-	else
+	else 
 		return J3Thread::get()->push(res);
 }
 
@@ -479,7 +477,7 @@ void J3ObjectHandle::rawSetObject(uintpt
 }
 
 J3ObjectHandle* J3ObjectHandle::rawGetObject(uintptr_t offset) {
-	return obj() ? J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))) : 0;
+	return J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset)));
 }
 
 void J3ObjectHandle::setObject(J3Field* field, J3ObjectHandle* value) {
@@ -509,9 +507,12 @@ void J3ObjectHandle::rawArrayCopyTo(uint
  *  J3LocalReferences
  */
 J3ObjectHandle* J3LocalReferences::push(J3Object* obj) {
-	J3ObjectHandle* res = Stack<J3ObjectHandle>::push();
-	res->_obj = obj;
-	return res;
+	if(obj) {
+		J3ObjectHandle* res = Stack<J3ObjectHandle>::push();
+		res->_obj = obj;
+		return res;
+	} else
+		return 0;
 }
 
 /*
@@ -524,17 +525,22 @@ J3GlobalReferences::J3GlobalReferences(v
 }
 		
 J3ObjectHandle* J3GlobalReferences::add(J3ObjectHandle* handle) {
-	pthread_mutex_lock(&mutex);
-	J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop();
-	res->_obj = handle->_obj;
-	pthread_mutex_unlock(&mutex);
-	return res;
+	if(handle) {
+		pthread_mutex_lock(&mutex);
+		J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop();
+		res->_obj = handle->_obj;
+		pthread_mutex_unlock(&mutex);
+		return res;
+	} else
+		return 0;
 }
 
 void J3GlobalReferences::del(J3ObjectHandle* handle) {
-	handle->harakiri();
-	pthread_mutex_lock(&mutex);
-	*emptySlots.push() = handle;
-	pthread_mutex_unlock(&mutex);
+	if(handle) {
+		handle->harakiri();
+		pthread_mutex_lock(&mutex);
+		*emptySlots.push() = handle;
+		pthread_mutex_unlock(&mutex);
+	}
 }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan  2 06:20:49 2014
@@ -15,7 +15,7 @@ J3Options::J3Options() {
 
 	debugEnterIndent = 1;
 
-	debugExecute = 2;
+	debugExecute = 0;
 	debugLoad = 0;
 	debugResolve = 0;
 	debugIniting = 0;

Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198301&r1=198300&r2=198301&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Thu Jan  2 06:20:49 2014
@@ -69,15 +69,6 @@ void J3LLVMSignature::generateCallerIR(J
 	if(ret != builder.getVoidTy()) {
 		if(ret->isPointerTy()) {
 			codeGen->builder = &builder;
-
-			llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(caller->getContext(), "ifnull", caller);
-			llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(caller->getContext(), "ifnotnull", caller);
-			builder.CreateCondBr(builder.CreateIsNull(res), ifnull, ifnotnull);
-
-			builder.SetInsertPoint(ifnull);
-			builder.CreateRet(builder.getInt64(0));
-
-			builder.SetInsertPoint(ifnotnull);
 			codeGen->currentThread();
 			res = builder.CreatePtrToInt(builder.CreateCall2(codeGen->funcJ3ThreadPush, codeGen->currentThread(), res),
 																	 uint64Ty);





More information about the vmkit-commits mailing list