[vmkit-commits] [vmkit] r145806 - /vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Mon Dec 5 03:08:31 PST 2011
Author: wdietz2
Date: Mon Dec 5 05:08:31 2011
New Revision: 145806
URL: http://llvm.org/viewvc/llvm-project?rev=145806&view=rev
Log:
Fix bugs in OpenJDK.inc that misused RETURN_FROM_JNI's evaluation of its param
RETURN_FROM_JNI evaluates the argument /after/ going back to uncooperative code
mode. This is particularly damaging if evaluation of the argument can do
something like triggering a GC (common example: pushJNIRef).
Anyway, fixed this througout OpenJDK.inc, and introduced a new helper macro
RETURN_REF_FROM_JNI to make the common task of returning an object easier.
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=145806&r1=145805&r2=145806&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Mon Dec 5 05:08:31 2011
@@ -29,6 +29,12 @@
#define NYI() \
do{ assert(0 && "Not yet implemented!"); abort(); } while(0)
+// Convenience wrapper for returning a JNI ref to something
+#define RETURN_REF_FROM_JNI(a,type) {\
+ type __jni_ret_val = (type)th->pushJNIRef(a); \
+ RETURN_FROM_JNI(__jni_ret_val); \
+ }
+
JavaObject* internalFillInStackTrace(JavaObject* throwable) {
ArrayPtr* result = 0;
@@ -156,7 +162,7 @@
BEGIN_JNI_EXCEPTION
clone = JavaObject::clone(*(JavaObject**)obj);
- RETURN_FROM_JNI((jobject)th->pushJNIRef(clone));
+ RETURN_REF_FROM_JNI(clone, jobject);
END_JNI_EXCEPTION
@@ -181,7 +187,7 @@
array = JavaString::strToArray(str, vm);
res = vm->constructString(array);
- RETURN_FROM_JNI((jstring)th->pushJNIRef(res))
+ RETURN_REF_FROM_JNI(res, jstring);
END_JNI_EXCEPTION
@@ -338,7 +344,8 @@
JVM_LoadLibrary(const char *name) {
BEGIN_JNI_EXCEPTION
Jnjvm* vm = JavaThread::get()->getJVM();
- RETURN_FROM_JNI(vm->bootstrapLoader->loadLib(name));
+ void * res = (void*)vm->bootstrapLoader->loadLib(name);
+ RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
@@ -354,7 +361,8 @@
JVM_FindLibraryEntry(void *handle, const char *name) {
BEGIN_JNI_EXCEPTION
Jnjvm* vm = JavaThread::get()->getJVM();
- RETURN_FROM_JNI((void *)vm->bootstrapLoader->loadInLib(name, handle));
+ void* res = (void *)vm->bootstrapLoader->loadInLib(name, handle);
+ RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
return 0;
@@ -450,7 +458,7 @@
}
assert(result && "No stack element found");
- RETURN_FROM_JNI((jobject)th->pushJNIRef(result));
+ RETURN_REF_FROM_JNI(result, jobject);
END_JNI_EXCEPTION
@@ -706,7 +714,7 @@
JVM_CurrentThread(JNIEnv *env, jclass threadClass) {
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
- RETURN_FROM_JNI((jobject)th->pushJNIRef(th->currentThread()));
+ RETURN_REF_FROM_JNI(th->currentThread(), jobject);
END_JNI_EXCEPTION
return 0;
@@ -792,7 +800,8 @@
JNIEXPORT jboolean JNICALL
JVM_HoldsLock(JNIEnv *env, jclass threadClass, jobject obj) {
BEGIN_JNI_EXCEPTION
- RETURN_FROM_JNI(JavaObject::owner(*(JavaObject**)obj));
+ jboolean res = JavaObject::owner(*(JavaObject**)obj);
+ RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
return false;
}
@@ -834,7 +843,7 @@
res = GetClassContext(1);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(res));
+ RETURN_REF_FROM_JNI(res, jobjectArray);
END_JNI_EXCEPTION
return 0;
@@ -890,7 +899,7 @@
JavaThread* th = JavaThread::get();
res = th->getNonNullClassLoader();
- RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
+ RETURN_REF_FROM_JNI(res, jobject);
END_JNI_EXCEPTION
return 0;
@@ -916,7 +925,8 @@
BEGIN_JNI_EXCEPTION
array = *(ArrayObject**)arr;
- RETURN_FROM_JNI(ArrayObject::getSize(array));
+ jint size = ArrayObject::getSize(array);
+ RETURN_FROM_JNI(size);
END_JNI_EXCEPTION
@@ -934,7 +944,7 @@
array = *(ArrayObject**)arr;
element = ArrayObject::getElement(array, index);
- RETURN_FROM_JNI((jobject)th->pushJNIRef(element));
+ RETURN_REF_FROM_JNI(element, jobject);
END_JNI_EXCEPTION
@@ -1032,8 +1042,7 @@
res = (JavaObject*)array->doNew(length, vm);
}
- jobject ret = (jobject)th->pushJNIRef(res);
- RETURN_FROM_JNI(ret);
+ RETURN_REF_FROM_JNI(res, jobject);
END_JNI_EXCEPTION
@@ -1120,7 +1129,7 @@
// Invoke recursive helper to create this array
array = multiCallNewIntern(arrayCl, dim_len, dims, vm);
- RETURN_FROM_JNI((jobject)th->pushJNIRef(array));
+ RETURN_REF_FROM_JNI(array, jobject);
END_JNI_EXCEPTION
@@ -1399,7 +1408,7 @@
const UTF8* iname = cl->getName();
result = JavaString::internalToJava(iname, vm);
- RETURN_FROM_JNI((jstring)th->pushJNIRef(result));
+ RETURN_REF_FROM_JNI(result, jstring);
END_JNI_EXCEPTION
@@ -1415,7 +1424,7 @@
ret = JavaObjectClass::getInterfaces(*(JavaObjectClass**)cls);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobjectArray);
END_JNI_EXCEPTION
@@ -1433,7 +1442,7 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
res = cl->classLoader->getJavaClassLoader();
- RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
+ RETURN_REF_FROM_JNI(res, jobject);
END_JNI_EXCEPTION
@@ -1485,7 +1494,7 @@
JOC = *(JavaObjectClass**)cls;
pd = JavaObjectClass::getProtectionDomain(JOC);
- RETURN_FROM_JNI((jobject)th->pushJNIRef(pd));
+ RETURN_REF_FROM_JNI(pd, jobject);
END_JNI_EXCEPTION
@@ -1508,7 +1517,8 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
- RETURN_FROM_JNI(cl->isArray());
+ jboolean ret = cl->isArray();
+ RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
@@ -1526,7 +1536,8 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
- RETURN_FROM_JNI(cl->isPrimitive());
+ jboolean ret = cl->isPrimitive();
+ RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
@@ -1567,7 +1578,8 @@
Cl = *(JavaObjectClass**)cls;
- RETURN_FROM_JNI(JavaObjectClass::getModifiers(Cl));
+ jint res = JavaObjectClass::getModifiers(Cl);
+ RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
@@ -1584,7 +1596,7 @@
// TODO: Verify boolean parameter here, assuming should default to true.
ret = JavaObjectClass::getDeclaredClasses(*(JavaObjectClass**)ofClass, false);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobjectArray);
END_JNI_EXCEPTION
@@ -1600,7 +1612,7 @@
ret = JavaObjectClass::getDeclaringClass(*(JavaObjectClass**)ofClass);
- RETURN_FROM_JNI((jclass)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jclass);
END_JNI_EXCEPTION
@@ -1623,7 +1635,7 @@
ret = JavaObjectClass::getDeclaredAnnotations(*(JavaObjectClass**)cls);
- RETURN_FROM_JNI((jbyteArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jbyteArray);
END_JNI_EXCEPTION
@@ -1643,7 +1655,7 @@
ret = JavaObjectClass::getDeclaredMethods(*(JavaObjectClass**)ofClass, publicOnly);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobjectArray);
END_JNI_EXCEPTION
@@ -1659,7 +1671,7 @@
ret = JavaObjectClass::getDeclaredFields(*(JavaObjectClass**)ofClass, publicOnly);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobjectArray);
END_JNI_EXCEPTION
@@ -1675,7 +1687,7 @@
ret = JavaObjectClass::getDeclaredConstructors(*(JavaObjectClass**)ofClass, publicOnly);
- RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobjectArray);
END_JNI_EXCEPTION
@@ -1702,7 +1714,8 @@
// TODO: Verify this is doing what this function is supposed to do
// (In particular regarding the comment block above)
- RETURN_FROM_JNI(cl->asClass()->access);
+ jint res = cl->asClass()->access;
+ RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
@@ -1731,7 +1744,7 @@
JavaObjectMethod::getClass(m)->getDelegatee(),
0 /* unused */ );
- RETURN_FROM_JNI((jobject)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobject);
END_JNI_EXCEPTION
return 0;
@@ -1757,7 +1770,7 @@
JavaObjectConstructor::getClass(c)->getDelegatee(),
0 /* unused */ );
- RETURN_FROM_JNI((jobject)th->pushJNIRef(ret));
+ RETURN_REF_FROM_JNI(ret, jobject);
END_JNI_EXCEPTION
return 0;
@@ -1873,7 +1886,7 @@
res = meth->invokeJavaObjectVirtual(vm, cl, obj);
- RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
+ RETURN_REF_FROM_JNI(res, jobject);
END_JNI_EXCEPTION
@@ -2310,7 +2323,8 @@
if (err != buf)
strncpy(buf, err, len);
- RETURN_FROM_JNI(strlen(buf));
+ jint len = strlen(buf);
+ RETURN_FROM_JNI(len);
END_JNI_EXCEPTION
More information about the vmkit-commits
mailing list