[vmkit-commits] [vmkit] r107855 - in /vmkit/trunk/lib/J3/VMCore: JavaClass.cpp JavaClass.h JavaConstantPool.h JavaLocks.cpp JavaMetaJIT.cpp JavaObject.cpp JavaRuntimeJIT.cpp JavaString.cpp Jni.cpp VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Jul 7 22:58:04 PDT 2010


Author: geoffray
Date: Thu Jul  8 00:58:04 2010
New Revision: 107855

URL: http://llvm.org/viewvc/llvm-project?rev=107855&view=rev
Log:
Continue fixing some llvm_gcroot, and fix a bug in the LockSystem.


Modified:
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.h
    vmkit/trunk/lib/J3/VMCore/JavaConstantPool.h
    vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp
    vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
    vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/J3/VMCore/JavaString.cpp
    vmkit/trunk/lib/J3/VMCore/Jni.cpp
    vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Thu Jul  8 00:58:04 2010
@@ -219,6 +219,7 @@
 
 Class::Class(JnjvmClassLoader* loader, const UTF8* n, ArrayUInt8* B) : 
     CommonClass(loader, n) {
+  llvm_gcroot(B, 0);
   virtualVT = 0;
   bytes = B;
   super = 0;
@@ -254,13 +255,13 @@
 }
 
 JavaObject* UserClassArray::doNew(sint32 n, Jnjvm* vm) {
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   if (n < 0) {
     vm->negativeArraySizeException(n);
   } else if (n > JavaArray::MaxArraySize) {
     vm->outOfMemoryError();
   }
-  JavaObject* res = NULL;
-  llvm_gcroot(res, 0);
   UserCommonClass* cl = baseClass();
   uint32 logSize = cl->isPrimitive() ? 
     cl->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);
@@ -471,7 +472,7 @@
 }
 
 JavaObject* UserClass::doNew(Jnjvm* vm) {
-  JavaObject* res = 0;
+  JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   assert(this && "No class when allocating.");
   assert((this->isInitializing() || 
@@ -1075,8 +1076,10 @@
 
 ArrayObject* JavaMethod::getParameterTypes(JnjvmClassLoader* loader) {
   
-  ArrayObject* res = 0;
+  ArrayObject* res = NULL;
+  JavaObject* delegatee = NULL;
   llvm_gcroot(res, 0);
+  llvm_gcroot(delegatee, 0);
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   Signdef* sign = getSignature();
@@ -1084,7 +1087,8 @@
   res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(sign->nbArguments,vm);
 
   for (uint32 index = 0; index < sign->nbArguments; ++index) {
-    ArrayObject::setElement(res, getClassType(vm, loader, arguments[index]), index);
+    delegatee = getClassType(vm, loader, arguments[index]);
+    ArrayObject::setElement(res, delegatee, index);
   }
 
   return res;
@@ -1099,8 +1103,10 @@
 
 ArrayObject* JavaMethod::getExceptionTypes(JnjvmClassLoader* loader) {
   
-  ArrayObject* res = 0;
+  ArrayObject* res = NULL;
+  JavaObject* delegatee = NULL;
   llvm_gcroot(res, 0);
+  llvm_gcroot(delegatee, 0);
   
   Attribut* exceptionAtt = lookupAttribut(Attribut::exceptionsAttribut);
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1117,7 +1123,8 @@
       UserCommonClass* cl = ctp->loadClass(idx);
       assert(cl->asClass() && "Wrong exception type");
       cl->asClass()->resolveClass();
-      ArrayObject::setElement(res, cl->getClassDelegatee(vm), i);
+      delegatee = cl->getClassDelegatee(vm);
+      ArrayObject::setElement(res, delegatee, i);
     }
     return res;
   }

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Thu Jul  8 00:58:04 2010
@@ -1284,7 +1284,7 @@
   ///
   void initialise(Class* cl, const UTF8* name, const UTF8* type, uint16 access);
 
-  /// ~JavaField - Destroy the field as well as its attributs.
+  /// ~JavaField - Destroy the field as well as its attributes.
   ///
   ~JavaField();
 

Modified: vmkit/trunk/lib/J3/VMCore/JavaConstantPool.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaConstantPool.h?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaConstantPool.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaConstantPool.h Thu Jul  8 00:58:04 2010
@@ -50,7 +50,7 @@
   sint32* ctpDef;
   
   /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods,
-  /// fields, strings.
+  /// fields, string pointers.
   ///
   void**  ctpRes; 
   

Modified: vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaLocks.cpp Thu Jul  8 00:58:04 2010
@@ -48,9 +48,10 @@
   
     JavaLock** tab = LockTable[index >> BitIndex];
   
-    if (tab == NULL) 
-      tab = (JavaLock**)associatedVM->allocator.Allocate(IndexSize,
-                                                         "Index LockTable");
+    if (tab == NULL) {
+      tab = (JavaLock**)associatedVM->allocator.Allocate(
+          IndexSize * sizeof(JavaLock*), "Index LockTable");
+    }
     threadLock.unlock();
    
     // Allocate the lock.
@@ -68,9 +69,9 @@
 LockSystem::LockSystem(Jnjvm* vm) {
   associatedVM = vm;
   LockTable = (JavaLock* **)
-    vm->allocator.Allocate(GlobalSize, "Global LockTable");
+    vm->allocator.Allocate(GlobalSize * sizeof(JavaLock**), "Global LockTable");
   LockTable[0] = (JavaLock**)
-    vm->allocator.Allocate(IndexSize, "Index LockTable");
+    vm->allocator.Allocate(IndexSize * sizeof(JavaLock*), "Index LockTable");
   currentIndex = 0;
 }
 

Modified: vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp Thu Jul  8 00:58:04 2010
@@ -230,7 +230,6 @@
   llvm_gcroot(obj, 0); \
   va_list ap;\
   va_start(ap, obj);\
-  llvm_gcroot(obj, 0); \
   TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
   va_end(ap); \
   return res; \

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.cpp Thu Jul  8 00:58:04 2010
@@ -24,8 +24,8 @@
 
 void JavaObject::waitIntern(
     JavaObject* self, struct timeval* info, bool timed) {
-  JavaLock* l = 0;
   llvm_gcroot(self, 0);
+  JavaLock* l = 0;
 
   if (owner(self)) {
     l = self->lock.changeToFatlock(self);
@@ -135,8 +135,8 @@
 }
 
 void JavaObject::notify(JavaObject* self) {
-  JavaLock* l = 0;
   llvm_gcroot(self, 0);
+  JavaLock* l = 0;
 
   if (owner(self)) {
     l = self->lock.getFatLock();
@@ -179,8 +179,8 @@
 }
 
 void JavaObject::notifyAll(JavaObject* self) {
-  JavaLock* l = 0;
   llvm_gcroot(self, 0);
+  JavaLock* l = 0;
   
   if (owner(self)) {
     l = self->lock.getFatLock();

Modified: vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp Thu Jul  8 00:58:04 2010
@@ -257,9 +257,11 @@
   assert(len > 0 && "Negative size given by VMKit");
  
   JavaObject* _res = cl->doNew(dims[0], vm);
-  ArrayObject* res = 0;
+  ArrayObject* res = NULL;
+  JavaObject* temp = NULL;
   llvm_gcroot(_res, 0);
   llvm_gcroot(res, 0);
+  llvm_gcroot(temp, 0);
 
   if (len > 1) {
     res = (ArrayObject*)_res;
@@ -268,8 +270,8 @@
     UserClassArray* base = (UserClassArray*)_base;
     if (dims[0] > 0) {
       for (sint32 i = 0; i < dims[0]; ++i) {
-        ArrayObject::setElement(
-            res, multiCallNewIntern(base, (len - 1), &dims[1], vm), i);
+        temp = multiCallNewIntern(base, (len - 1), &dims[1], vm);
+        ArrayObject::setElement(res, temp, i);
       }
     } else {
       for (uint32 i = 1; i < len; ++i) {

Modified: vmkit/trunk/lib/J3/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaString.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaString.cpp Thu Jul  8 00:58:04 2010
@@ -36,7 +36,7 @@
 
   // No need to call the Java function: both the Java function and
   // this function do the same thing.
-  setValue(res, array);
+  JavaString::setValue(res, array);
   res->count = ArrayUInt16::getSize(array);
   res->offset = 0;
   res->cachedHashCode = 0;
@@ -44,39 +44,48 @@
 }
 
 char* JavaString::strToAsciiz(JavaString* self) {
+  const ArrayUInt16* value = NULL;
   llvm_gcroot(self, 0);
+  llvm_gcroot(value, 0);
+  value = JavaString::getValue(self);
   char* buf = new char[self->count + 1]; 
   for (sint32 i = 0; i < self->count; ++i) {
-    buf[i] = ArrayUInt16::getElement(getValue(self), i + self->offset);
+    buf[i] = ArrayUInt16::getElement(value, i + self->offset);
   }
   buf[self->count] =  0; 
   return buf;
 }
 
 const ArrayUInt16* JavaString::strToArray(JavaString* self, Jnjvm* vm) {
-  ArrayUInt16* array = 0;
+  ArrayUInt16* array = NULL;
+  const ArrayUInt16* value = NULL;
   llvm_gcroot(self, 0);
   llvm_gcroot(array, 0);
+  llvm_gcroot(value, 0);
+  value = JavaString::getValue(self);
 
   assert(getValue(self) && "String without an array?");
   if (self->offset || (self->count != ArrayUInt16::getSize(getValue(self)))) {
     array = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(self->count, vm);
     for (sint32 i = 0; i < self->count; i++) {
       ArrayUInt16::setElement(
-          array, ArrayUInt16::getElement(getValue(self), i + self->offset), i);
+          array, ArrayUInt16::getElement(value, i + self->offset), i);
     }
     return array;
   } else {
-    return getValue(self);
+    return value;
   }
 }
 
 void JavaString::stringDestructor(JavaString* str) {
+  const ArrayUInt16* value = NULL;
   llvm_gcroot(str, 0);
+  llvm_gcroot(value, 0);
+  value = JavaString::getValue(str);
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   assert(vm && "No vm when destroying a string");
-  if (getValue(str) != NULL) vm->hashStr.removeUnlocked(getValue(str), str);
+  if (value != NULL) vm->hashStr.removeUnlocked(value, str);
 }
 
 JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) {
@@ -99,12 +108,15 @@
 }
 
 const UTF8* JavaString::javaToInternal(const JavaString* self, UTF8Map* map) {
+  const ArrayUInt16* value = NULL;
   llvm_gcroot(self, 0);
+  llvm_gcroot(value, 0);
+  value = JavaString::getValue(self);
   
   uint16* java = new uint16[self->count];
 
   for (sint32 i = 0; i < self->count; ++i) {
-    uint16 cur = ArrayUInt16::getElement(getValue(self), self->offset + i);
+    uint16 cur = ArrayUInt16::getElement(value, self->offset + i);
     if (cur == '.') java[i] = '/';
     else java[i] = cur;
   }

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Thu Jul  8 00:58:04 2010
@@ -2488,10 +2488,12 @@
 
   BEGIN_JNI_EXCEPTION
 
+  JavaObject* obj = NULL;
+  llvm_gcroot(obj, 0);
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* obj = vm->asciizToStr(bytes);
-  llvm_gcroot(obj, 0);
+  obj = vm->asciizToStr(bytes);
   jstring ret = (jstring)th->pushJNIRef(obj);
   RETURN_FROM_JNI(ret);
 
@@ -2643,10 +2645,12 @@
   
   BEGIN_JNI_EXCEPTION
   
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
+  
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfBool->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfBool->doNew(len, vm);
   jbooleanArray ret = (jbooleanArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2659,11 +2663,13 @@
 jbyteArray NewByteArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+  
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
 
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfByte->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfByte->doNew(len, vm);
   jbyteArray ret = (jbyteArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2675,11 +2681,13 @@
 jcharArray NewCharArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfChar->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfChar->doNew(len, vm);
   jcharArray ret = (jcharArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2691,11 +2699,13 @@
 jshortArray NewShortArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfShort->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfShort->doNew(len, vm);
   jshortArray ret = (jshortArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2707,11 +2717,13 @@
 jintArray NewIntArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfInt->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfInt->doNew(len, vm);
   jintArray ret = (jintArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2723,11 +2735,13 @@
 jlongArray NewLongArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfLong->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfLong->doNew(len, vm);
   jlongArray ret = (jlongArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2739,11 +2753,13 @@
 jfloatArray NewFloatArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfFloat->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfFloat->doNew(len, vm);
   jfloatArray ret = (jfloatArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2755,11 +2771,13 @@
 jdoubleArray NewDoubleArray(JNIEnv *env, jsize len) {
   
   BEGIN_JNI_EXCEPTION
+
+  JavaObject* res = NULL;
+  llvm_gcroot(res, 0);
   
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
-  JavaObject* res = vm->upcalls->ArrayOfDouble->doNew(len, vm);
-  llvm_gcroot(res, 0);
+  res = vm->upcalls->ArrayOfDouble->doNew(len, vm);
   jdoubleArray ret = (jdoubleArray)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
 
@@ -2945,12 +2963,12 @@
   
   BEGIN_JNI_EXCEPTION
   
+  ArrayUInt8* array = *(ArrayUInt8**)_array;
+  llvm_gcroot(array, 0);
+  
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArrayUInt8* array = *(ArrayUInt8**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArrayUInt8::getSize(array);
     memcpy(ArrayUInt8::getElements(array), elems, len);
 
@@ -2967,13 +2985,13 @@
 			      jint mode) {
   
   BEGIN_JNI_EXCEPTION
+
+  ArraySInt16* array = *(ArraySInt16**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArraySInt16* array = *(ArraySInt16**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArraySInt16::getSize(array);
     memcpy(ArraySInt16::getElements(array), elems, len);
 
@@ -2990,13 +3008,13 @@
 			      jint mode) {
   
   BEGIN_JNI_EXCEPTION
-  
+
+  ArrayUInt16* array = *(ArrayUInt16**)_array;
+  llvm_gcroot(array, 0);
+
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArrayUInt16* array = *(ArrayUInt16**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArrayUInt16::getSize(array) << 1;
     memcpy(ArrayUInt16::getElements(array), elems, len);
 
@@ -3013,13 +3031,13 @@
 			       jint mode) {
   
   BEGIN_JNI_EXCEPTION
+
+  ArraySInt16* array = *(ArraySInt16**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArraySInt16* array = *(ArraySInt16**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArraySInt16::getSize(array) << 1;
     memcpy(ArraySInt16::getElements(array), elems, len);
 
@@ -3036,13 +3054,13 @@
 			     jint mode) {
   
   BEGIN_JNI_EXCEPTION
+    
+  ArraySInt32* array = *(ArraySInt32**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArraySInt32* array = *(ArraySInt32**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArraySInt32::getSize(array) << 2;
     memcpy(ArraySInt32::getElements(array), elems, len);
 
@@ -3059,13 +3077,13 @@
 			      jint mode) {
   
   BEGIN_JNI_EXCEPTION
+    
+  ArrayLong* array = *(ArrayLong**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArrayLong* array = *(ArrayLong**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArrayLong::getSize(array) << 3;
     memcpy(ArrayLong::getElements(array), elems, len);
 
@@ -3081,13 +3099,13 @@
 void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray _array, jfloat *elems,
 			       jint mode) {
   BEGIN_JNI_EXCEPTION
+    
+  ArrayFloat* array = *(ArrayFloat**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArrayFloat* array = *(ArrayFloat**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArrayFloat::getSize(array) << 2;
     memcpy(ArrayFloat::getElements(array), elems, len);
 
@@ -3104,13 +3122,13 @@
 				jdouble *elems, jint mode) {
   
   BEGIN_JNI_EXCEPTION
+    
+  ArrayDouble* array = *(ArrayDouble**)_array;
+  llvm_gcroot(array, 0);
   
   if (mode == JNI_ABORT) {
     free(elems);
   } else {
-    ArrayDouble* array = *(ArrayDouble**)_array;
-    llvm_gcroot(array, 0);
-
     sint32 len = ArrayDouble::getSize(array) << 3;
     memcpy(ArrayDouble::getElements(array), elems, len);
 
@@ -3470,12 +3488,12 @@
   
   BEGIN_JNI_EXCEPTION
   
+  JavaObject* array = *(JavaObject**)_array;
+  llvm_gcroot(array, 0);
+
   if (mode == JNI_ABORT) {
     free(carray);
   } else {
-    JavaObject* array = *(JavaObject**)_array;
-    llvm_gcroot(array, 0);
-
     UserClassArray* cl = JavaObject::getClass(array)->asArrayClass();
     uint32 logSize = cl->baseClass()->asPrimitiveClass()->logSize;
     sint32 len = JavaArray::getSize(array) << logSize;
@@ -3519,10 +3537,13 @@
 jobject NewGlobalRef(JNIEnv* env, jobject obj) {
   
   BEGIN_JNI_EXCEPTION
+    
+  JavaObject* Obj = NULL;
+  llvm_gcroot(Obj, 0);
   
   // Local object references.
   if (obj) {
-    JavaObject* Obj = *(JavaObject**)obj;
+    Obj = *(JavaObject**)obj;
     llvm_gcroot(Obj, 0);
 
     Jnjvm* vm = JavaThread::get()->getJVM();

Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=107855&r1=107854&r2=107855&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Thu Jul  8 00:58:04 2010
@@ -285,14 +285,22 @@
     mvm::Collector::markAndTraceRoot(key, closure);
   }
  
-  for (uint32 i = 0; i < LockSystem::GlobalSize; i++) {
+  uint32 i = 0;
+  for (; i < LockSystem::GlobalSize; i++) {
     JavaLock** array = lockSystem.LockTable[i];
     if (array == NULL) break;
-    for (uint32 j = 0; j < LockSystem::IndexSize; j++) {
+    uint32 j = 0;
+    for (; j < LockSystem::IndexSize; j++) {
       if (array[j] == NULL) break;
       JavaLock* lock = array[j];
       mvm::Collector::markAndTraceRoot(lock->getAssociatedObjectPtr(), closure);
     }
+    for (j = j + 1; j < LockSystem::IndexSize; j++) {
+      assert(array[j] == NULL);
+    }
+  }
+  for (i = i + 1; i < LockSystem::GlobalSize; i++) {
+    assert(lockSystem.LockTable[i] == NULL);
   }
 #if defined(ISOLATE_SHARING)
   mvm::Collector::markAndTraceRoot(&JnjvmSharedLoader::sharedLoader, closure);





More information about the vmkit-commits mailing list