[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