[vmkit-commits] [vmkit] r180391 - Added many missing llvm_gcroot calls.

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


Author: peter.senna
Date: Thu Apr 25 12:05:01 2013
New Revision: 180391

URL: http://llvm.org/viewvc/llvm-project?rev=180391&view=rev
Log:
Added many missing llvm_gcroot calls.
(cherry picked from commit 218281cb7925925d264f3df80b84f7e3e94a81d7)

Modified:
    vmkit/trunk/include/vmkit/FinalizerThread.h
    vmkit/trunk/include/vmkit/ReferenceThread.h
    vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/ClassLib/Reflect.inc
    vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/j3/VMCore/JavaArray.h
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h
    vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/j3/VMCore/JavaReferenceQueue.cpp
    vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
    vmkit/trunk/lib/j3/VMCore/Jni.cpp
    vmkit/trunk/lib/j3/VMCore/JniClasspath.inc
    vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc
    vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
    vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
    vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
    vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp
    vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
    vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp

Modified: vmkit/trunk/include/vmkit/FinalizerThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/FinalizerThread.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/FinalizerThread.h (original)
+++ vmkit/trunk/include/vmkit/FinalizerThread.h Thu Apr 25 12:05:01 2013
@@ -136,9 +136,12 @@ namespace vmkit {
 		/// them for finalization if they are not live.
 		///
 		void scanFinalizationQueue(word_t closure) {
+			gc* obj = NULL;
+			llvm_gcroot(obj, 0);
+
 			uint32 NewIndex = 0;
 			for (uint32 i = 0; i < CurrentIndex; ++i) {
-				gc* obj = FinalizationQueue[i];
+				obj = FinalizationQueue[i];
 
 				if (!vmkit::Collector::isLive(obj, closure)) {
 					obj = vmkit::Collector::retainForFinalize(FinalizationQueue[i], closure);

Modified: vmkit/trunk/include/vmkit/ReferenceThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/ReferenceThread.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/ReferenceThread.h (original)
+++ vmkit/trunk/include/vmkit/ReferenceThread.h Thu Apr 25 12:05:01 2013
@@ -30,12 +30,18 @@ namespace vmkit {
 
 	  template <class T>
 	  gc* processReference(gc* reference, ReferenceThread<T>* th, word_t closure) {
+        gc *referent = NULL, *newReference = NULL, *newReferent = NULL;
+        llvm_gcroot(referent, 0);
+        llvm_gcroot(newReference, 0);
+        llvm_gcroot(newReferent, 0);
+  	    llvm_gcroot(reference, 0);
+
 	    if (!vmkit::Collector::isLive(reference, closure)) {
 	      vmkit::Thread::get()->MyVM->clearObjectReferent(reference);
 	      return NULL;
 	    }
 
-	    gc* referent = *(vmkit::Thread::get()->MyVM->getObjectReferentPtr(reference));
+	    referent = *(vmkit::Thread::get()->MyVM->getObjectReferentPtr(reference));
 
 	    if (!referent) {
 	      return NULL;
@@ -50,10 +56,10 @@ namespace vmkit {
 	      // Nothing to do.
 	    }
 
-	    gc* newReference =
+	    newReference =
 	        vmkit::Collector::getForwardedReference(reference, closure);
 	    if (vmkit::Collector::isLive(referent, closure)) {
-	      gc* newReferent = vmkit::Collector::getForwardedReferent(referent, closure);
+	      newReferent = vmkit::Collector::getForwardedReferent(referent, closure);
 	      vmkit::Thread::get()->MyVM->setObjectReferent(newReference, newReferent);
 	      return newReference;
 	    } else {
@@ -112,11 +118,14 @@ namespace vmkit {
 
 	  template <class T>
 	  void scan(ReferenceThread<T>* thread, word_t closure) {
+        gc *obj = NULL, *res = NULL;
+        llvm_gcroot(obj, 0);
+        llvm_gcroot(res, 0);
 	    uint32 NewIndex = 0;
 
 	    for (uint32 i = 0; i < CurrentIndex; ++i) {
-	      gc* obj = References[i];
-	      gc* res = processReference(obj, thread, closure);
+	      obj = References[i];
+	      res = processReference(obj, thread, closure);
 	      if (res) References[NewIndex++] = res;
 	    }
 

Modified: vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/ArrayCopy.inc Thu Apr 25 12:05:01 2013
@@ -10,10 +10,14 @@
 
 void ArrayCopy(JavaObject* src, jint sstart, JavaObject* dst, jint dstart, jint len)
 {
+  ArrayObject* arraySrc = 0;
+  ArrayObject* arrayDest = 0;
   JavaObject* cur = 0;
   llvm_gcroot(src, 0);
   llvm_gcroot(dst, 0);
   llvm_gcroot(cur, 0);
+  llvm_gcroot(arraySrc, 0);
+  llvm_gcroot(arrayDest, 0);
 
   JavaThread* th = JavaThread::get();
   Jnjvm *vm = th->getJVM();
@@ -68,8 +72,9 @@ void ArrayCopy(JavaObject* src, jint sst
     // Unfortunately in the case that an element can't be assigned,
     // System.arrayCopy is required to do the partial copy, hence this check.
     int copyLen = len;
+    arraySrc = (ArrayObject*)src;
     for (int i = 0; i < len; i++) {
-      cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
+      cur = ArrayObject::getElement(arraySrc, i + sstart);
       if (cur) {
         if (!(JavaObject::getClass(cur)->isSubclassOf(dstType))) {
           copyLen = i; // copy up until this element
@@ -80,6 +85,7 @@ void ArrayCopy(JavaObject* src, jint sst
 
     // If same array, then there's a potential for overlap.
     // Check this now, and use it to determine iteration order.
+    arrayDest = (ArrayObject*)dst;
     bool backward = (src == dst) &&
                     (sstart < dstart) &&
                     (sstart + copyLen > dstart);
@@ -87,12 +93,12 @@ void ArrayCopy(JavaObject* src, jint sst
     if (backward) {
       for(int i = copyLen - 1; i >= 0; --i) {
         cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
-        ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
+        ArrayObject::setElement(arrayDest, cur, i + dstart);
       }
     } else {
       for(int i = 0; i < copyLen; ++i) {
-        cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
-        ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
+        cur = ArrayObject::getElement(arraySrc, i + sstart);
+        ArrayObject::setElement(arrayDest, cur, i + dstart);
       }
     }
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp Thu Apr 25 12:05:01 2013
@@ -65,9 +65,11 @@ JavaObjectMethod* JavaObjectMethod::crea
   JavaObjectMethod* ret = 0;
   JavaObjectVMMethod* vmMeth = 0;
   JavaString* str = 0;
+  JavaObject* Cl = 0;
   llvm_gcroot(ret, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(vmMeth, 0);
+  llvm_gcroot(Cl, 0);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
 
@@ -78,7 +80,7 @@ JavaObjectMethod* JavaObjectMethod::crea
 
 
   str = vm->internalUTF8ToStr(meth->name);
-  JavaObject* Cl = meth->classDef->getDelegatee();
+  Cl = meth->classDef->getDelegatee();
 
   vm->upcalls->initVMMethod->invokeIntSpecial(vm, VMMeth, vmMeth);
   vmMeth->name = str;

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h Thu Apr 25 12:05:01 2013
@@ -52,6 +52,7 @@ public:
   }
 
   static void staticTracer(JavaObjectClass* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->pd, closure);
     vmkit::Collector::markAndTrace(obj, &obj->signers, closure);
     vmkit::Collector::markAndTrace(obj, &obj->constructor, closure);
@@ -79,6 +80,7 @@ private:
 	// others
 public:
 	static void staticTracer(JavaObjectVMField* obj, word_t closure) {
+	    llvm_gcroot(obj, 0);
 		vmkit::Collector::markAndTrace(obj, &obj->name, closure);
 		vmkit::Collector::markAndTrace(obj, &obj->declaringClass, closure);
 	}
@@ -105,6 +107,7 @@ private:
 public:
 
   static void staticTracer(JavaObjectField* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->p, closure);
     vmkit::Collector::markAndTrace(obj, &obj->vmField, closure);
   }
@@ -129,6 +132,7 @@ public:
 	uint32 slot;
 public:
   	static void staticTracer(JavaObjectVMMethod* obj, word_t closure) {
+	    llvm_gcroot(obj, 0);
   		vmkit::Collector::markAndTrace(obj, &obj->name, closure);
   		vmkit::Collector::markAndTrace(obj, &obj->declaringClass, closure);
 	}
@@ -151,6 +155,7 @@ private:
 public:
   
   static void staticTracer(JavaObjectMethod* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->p, closure);
     vmkit::Collector::markAndTrace(obj, &obj->vmMethod, closure);
   }
@@ -173,6 +178,7 @@ private:
 
 public:
   static void staticTracer(JavaObjectVMConstructor* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->declaringClass, closure);
   }
 
@@ -193,6 +199,7 @@ private:
 
 public:
   static void staticTracer(JavaObjectConstructor* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->p, closure);
     vmkit::Collector::markAndTrace(obj, &obj->vmCons, closure);
   }
@@ -212,6 +219,7 @@ private:
 
 public:
   static void staticTracer(JavaObjectVMThread* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->thread, closure);
   }
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc Thu Apr 25 12:05:01 2013
@@ -84,14 +84,15 @@ jclass clazz,
 #endif
 JavaObject* Cl, 
 jboolean publicOnly) {
-
+  JavaObjectClass* jcl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredConstructors((JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredConstructors(jcl = (JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -106,13 +107,15 @@ jclass clazz,
 JavaObject* Cl, 
 jboolean publicOnly) {
 
+  JavaObjectClass* jcl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredMethods((JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredMethods(jcl = (JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -127,12 +130,14 @@ jclass clazz,
 JavaObject* Cl, 
 jboolean ignore) {
   
+  JavaObjectClass* jcl = 0;
   jint res = 0;
   llvm_gcroot(Cl, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getModifiers((JavaObjectClass*)Cl);
+  res = JavaObjectClass::getModifiers(jcl = (JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
   return res;
@@ -337,14 +342,15 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl, jboolean publicOnly) {
-
+  JavaObjectClass* jcl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredFields((JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredFields(jcl = (JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -357,14 +363,15 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl) {
-
+  JavaObjectClass* jcl = 0;
   ArrayObject* res = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(Cl, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getInterfaces((JavaObjectClass*)Cl);
+  res = JavaObjectClass::getInterfaces(jcl = (JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -378,14 +385,16 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl) {
+  JavaObjectClass* jcl = 0;
   JavaObject* res = 0;
 
   llvm_gcroot(res, 0);
   llvm_gcroot(Cl, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getDeclaringClass((JavaObjectClass*)Cl);
+  res = JavaObjectClass::getDeclaringClass(jcl = (JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -399,14 +408,15 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl, bool publicOnly) {
-
+  JavaObjectClass* jcl = 0;
   ArrayObject* result = 0;
   llvm_gcroot(result, 0);
   llvm_gcroot(Cl, 0);
+  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  result = JavaObjectClass::getDeclaredClasses((JavaObjectClass*)Cl, publicOnly);
+  result = JavaObjectClass::getDeclaredClasses(jcl = (JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -438,6 +448,7 @@ JavaObject* Cl) {
 	//fprintf(stderr, "Java_java_lang_VMClass_getDeclaredAnnotations not implemented\n");
   //abort();
 
+  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -447,6 +458,7 @@ JavaObject* Cl) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(Cl, 0);
   llvm_gcroot(annotationClass, 0);
+  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -467,7 +479,7 @@ JavaObject* Cl) {
     uint16 numAnnotations = reader.readU2();
     
     UserClassArray* array = upcalls->annotationArrayClass;
-    res = array->doNew(numAnnotations, vm);
+    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
     for (uint16 i = 0; i < numAnnotations; ++i) {
 			uint16 typeIndex = reader.readU2();
 			const UTF8* annoType = cl->ctpInfo->UTF8At(typeIndex);
@@ -489,7 +501,7 @@ JavaObject* Cl) {
 			annotationClass = AnnonClass->getClassDelegatee(vm);
 			
 			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement((ArrayObject *)res, annon, i);
+			ArrayObject::setElement(arrayRes, annon, i);
 		} // end for
 		
   }

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc Thu Apr 25 12:05:01 2013
@@ -112,6 +112,7 @@ JNIEXPORT JavaObject* JNICALL Java_java_
 JNIEnv *env, 
 #endif
 JavaObjectVMField* VMField) { 
+  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -121,6 +122,7 @@ JavaObjectVMField* VMField) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(VMField, 0);
   llvm_gcroot(annotationClass, 0);
+  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -142,7 +144,7 @@ JavaObjectVMField* VMField) {
     uint16 numAnnotations = reader.readU2();
     
     UserClassArray* array = upcalls->annotationArrayClass;
-    res = array->doNew(numAnnotations, vm);
+    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
 		dprintf("JavaField : %s with %d fields \n", UTF8Buffer(field->name).cString(), numAnnotations);
     for (uint16 i = 0; i < numAnnotations; ++i) {
 			uint16 typeIndex = reader.readU2();
@@ -166,7 +168,7 @@ JavaObjectVMField* VMField) {
 			annotationClass = AnnonClass->getClassDelegatee(vm);
 			
 			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement((ArrayObject *)res, annon, i);
+			ArrayObject::setElement(arrayRes, annon, i);
 		} // end for
   }
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Apr 25 12:05:01 2013
@@ -133,6 +133,7 @@ JNIEXPORT JavaObject* JNICALL Java_java_
 JNIEnv *env, 
 #endif
 JavaObjectVMMethod* VMMethod) { 
+  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -142,6 +143,7 @@ JavaObjectVMMethod* VMMethod) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(VMMethod, 0);
   llvm_gcroot(annotationClass, 0);
+  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -163,7 +165,7 @@ JavaObjectVMMethod* VMMethod) {
     uint16 numAnnotations = reader.readU2();
     
     UserClassArray* array = upcalls->annotationArrayClass;
-    res = array->doNew(numAnnotations, vm);
+    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
     for (uint16 i = 0; i < numAnnotations; ++i) {
 			uint16 typeIndex = reader.readU2();
 			const UTF8* annoType = compilingClass->ctpInfo->UTF8At(typeIndex);
@@ -184,7 +186,7 @@ JavaObjectVMMethod* VMMethod) {
 			annotationClass = AnnonClass->getClassDelegatee(vm);
 			
 			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement((ArrayObject *)res, annon, i);
+			ArrayObject::setElement(arrayRes, annon, i);
 		} // end for
   }
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc Thu Apr 25 12:05:01 2013
@@ -110,7 +110,8 @@ JNIEXPORT void JNICALL Java_java_lang_VM
 JNIEnv *env,
 #endif
 JavaObject* vmthread) {
-
+  gc* obj = NULL;
+  llvm_gcroot(obj, 0);
   llvm_gcroot(vmthread, 0);  
 
   BEGIN_NATIVE_EXCEPTION(0)
@@ -145,7 +146,7 @@ JavaObject* vmthread) {
     th->lockingThread.varcond.signal();
 
     // Release the lock if we acquired it.
-    if (locked) lock->release(lock->getAssociatedObject(), vm->lockSystem);
+    if (locked) lock->release(obj = lock->getAssociatedObject(), vm->lockSystem);
   }
 
   // Here we could also raise a signal for interrupting I/O

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Apr 25 12:05:01 2013
@@ -489,42 +489,50 @@ extern "C" JavaObject* Java_java_lang_re
 }
 
 extern "C" void nativeJavaObjectClassTracer(
-    JavaObjectClass* obj, word_t closure) {
+  JavaObjectClass* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectClass::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectFieldTracer(
     JavaObjectField* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectField::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectMethodTracer(
     JavaObjectMethod* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectMethod::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectConstructorTracer(
     JavaObjectConstructor* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectConstructor::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectVMFieldTracer(
     JavaObjectVMField* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectVMField::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectVMMethodTracer(
     JavaObjectVMMethod* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectVMMethod::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectVMConstructorTracer(
     JavaObjectVMConstructor* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectVMConstructor::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectVMThreadTracer(
     JavaObjectVMThread* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectVMThread::staticTracer(obj, closure);
 }
 

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h Thu Apr 25 12:05:01 2013
@@ -73,6 +73,7 @@ public:
   }
 
   static void staticTracer(JavaObjectClass* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->cachedConstructor, closure);
     vmkit::Collector::markAndTrace(obj, &obj->newInstanceCallerCache, closure);
     vmkit::Collector::markAndTrace(obj, &obj->name, closure);
@@ -132,6 +133,7 @@ private:
 public:
 
   static void staticTracer(JavaObjectField* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
     vmkit::Collector::markAndTrace(obj, &obj->name, closure);
     vmkit::Collector::markAndTrace(obj, &obj->type, closure);
@@ -189,6 +191,7 @@ private:
 public:
 
   static void staticTracer(JavaObjectMethod* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
     vmkit::Collector::markAndTrace(obj, &obj->name, closure);
     vmkit::Collector::markAndTrace(obj, &obj->returnType, closure);
@@ -242,6 +245,7 @@ private:
 
 public:
   static void staticTracer(JavaObjectConstructor* obj, word_t closure) {
+    llvm_gcroot(obj, 0);
     vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
     vmkit::Collector::markAndTrace(obj, &obj->parameterTypes, closure);
     vmkit::Collector::markAndTrace(obj, &obj->exceptionTypes, closure);

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Thu Apr 25 12:05:01 2013
@@ -466,21 +466,25 @@ extern "C" void Java_java_lang_ref_Refer
 
 extern "C" void nativeJavaObjectClassTracer(
     JavaObjectClass* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectClass::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectFieldTracer(
     JavaObjectField* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectField::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectMethodTracer(
     JavaObjectMethod* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectMethod::staticTracer(obj, closure);
 }
 
 extern "C" void nativeJavaObjectConstructorTracer(
     JavaObjectConstructor* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   JavaObjectConstructor::staticTracer(obj, closure);
 }
 

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=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Thu Apr 25 12:05:01 2013
@@ -157,11 +157,14 @@ JVM_MonitorNotifyAll(JNIEnv *env, jobjec
 
 JNIEXPORT jobject JNICALL
 JVM_Clone(JNIEnv *env, jobject obj) {
+  JavaObject* src = 0;
   JavaObject * clone = 0;
   llvm_gcroot(clone, 0);
+  llvm_gcroot(src, 0);
+
   BEGIN_JNI_EXCEPTION
 
-  clone = JavaObject::clone(*(JavaObject**)obj);
+  clone = JavaObject::clone(src = *(JavaObject**)obj);
   RETURN_REF_FROM_JNI(clone, jobject);
 
   END_JNI_EXCEPTION
@@ -767,7 +770,9 @@ JVM_CountStackFrames(JNIEnv *env, jobjec
 
 JNIEXPORT void JNICALL
 JVM_Interrupt(JNIEnv *env, jobject _thread) {
+  gc* obj = NULL;
   JavaObject * thread = 0;
+  llvm_gcroot(obj, 0);
   llvm_gcroot(thread, 0);
   BEGIN_JNI_EXCEPTION
 
@@ -802,7 +807,7 @@ JVM_Interrupt(JNIEnv *env, jobject _thre
     jth->lockingThread.varcond.signal();
 
     // Release the lock if we acquired it.
-    if (locked) lock->release(lock->getAssociatedObject(), vm->lockSystem);
+    if (locked) lock->release(obj = lock->getAssociatedObject(), vm->lockSystem);
   }
 
   // Here we could also raise a signal for interrupting I/O
@@ -1469,12 +1474,15 @@ JVM_GetClassName(JNIEnv *env, jclass cls
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassInterfaces(JNIEnv *env, jclass cls) {
+  JavaObjectClass* cl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(ret, 0);
+  llvm_gcroot(cl, 0);
 
   BEGIN_JNI_EXCEPTION
 
-  ret = JavaObjectClass::getInterfaces(*(JavaObjectClass**)cls);
+  cl = *(JavaObjectClass**)cls;
+  ret = JavaObjectClass::getInterfaces(cl);
 
   RETURN_REF_FROM_JNI(ret, jobjectArray);
 
@@ -1640,13 +1648,16 @@ JVM_GetClassModifiers(JNIEnv *env, jclas
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass) {
+  JavaObjectClass* cl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(ret, 0);
+  llvm_gcroot(cl, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // TODO: Verify boolean parameter here, assuming should default to true.
-  ret = JavaObjectClass::getDeclaredClasses(*(JavaObjectClass**)ofClass, false);
+  cl = *(JavaObjectClass**)ofClass;
+  ret = JavaObjectClass::getDeclaredClasses(cl, false);
 
   RETURN_REF_FROM_JNI(ret, jobjectArray);
 
@@ -1723,12 +1734,15 @@ JVM_GetClassAnnotations(JNIEnv *env, jcl
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
+  JavaObjectClass* cl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(ret, 0);
+  llvm_gcroot(cl, 0);
 
   BEGIN_JNI_EXCEPTION
 
-  ret = JavaObjectClass::getDeclaredMethods(*(JavaObjectClass**)ofClass, publicOnly);
+  cl = *(JavaObjectClass**)ofClass;
+  ret = JavaObjectClass::getDeclaredMethods(cl, publicOnly);
 
   RETURN_REF_FROM_JNI(ret, jobjectArray);
 
@@ -1739,12 +1753,15 @@ JVM_GetClassDeclaredMethods(JNIEnv *env,
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
+  JavaObjectClass* cl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(ret, 0);
+  llvm_gcroot(cl, 0);
 
   BEGIN_JNI_EXCEPTION
 
-  ret = JavaObjectClass::getDeclaredFields(*(JavaObjectClass**)ofClass, publicOnly);
+  cl = *(JavaObjectClass**)ofClass;
+  ret = JavaObjectClass::getDeclaredFields(cl, publicOnly);
 
   RETURN_REF_FROM_JNI(ret, jobjectArray);
 
@@ -1755,12 +1772,15 @@ JVM_GetClassDeclaredFields(JNIEnv *env,
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
+  JavaObjectClass* cl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(ret, 0);
+  llvm_gcroot(cl, 0);
 
   BEGIN_JNI_EXCEPTION
 
-  ret = JavaObjectClass::getDeclaredConstructors(*(JavaObjectClass**)ofClass, publicOnly);
+  cl = *(JavaObjectClass**)ofClass;
+  ret = JavaObjectClass::getDeclaredConstructors(cl, publicOnly);
 
   RETURN_REF_FROM_JNI(ret, jobjectArray);
 

Modified: vmkit/trunk/lib/j3/ClassLib/Reflect.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/Reflect.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/Reflect.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/Reflect.inc Thu Apr 25 12:05:01 2013
@@ -135,9 +135,11 @@ JavaObject* JavaObjectClass::getDeclarin
 }
 
 ArrayObject* JavaObjectClass::getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly) {
+  JavaObject* obj = 0;
   ArrayObject* result = 0;
   llvm_gcroot(result, 0);
   llvm_gcroot(Cl, 0);
+  llvm_gcroot(obj, 0);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();
@@ -160,8 +162,9 @@ ArrayObject* JavaObjectClass::getDeclare
     int index = 0;
     for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
       UserClass* klass = cl->innerClasses[i];
+      obj = klass->getClassDelegatee(vm);
       if (!publicOnly || isPublic(klass->innerAccess))
-        ArrayObject::setElement(result, klass->getClassDelegatee(vm), index++);
+        ArrayObject::setElement(result, obj, index++);
     }
     assert(index == sizeArray);
   }
@@ -212,9 +215,11 @@ ArrayObject* JavaObjectClass::getDeclare
 }
 
 ArrayObject* JavaObjectClass::getInterfaces(JavaObjectClass* Cl) {
+  JavaObject* obj = 0;
   ArrayObject* res = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(res, 0);
+  llvm_gcroot(obj, 0);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
@@ -222,7 +227,8 @@ ArrayObject* JavaObjectClass::getInterfa
 
   for (uint16 i = 0; i < cl->nbInterfaces; ++i) {
     UserClass* klass = cl->interfaces[i];
-    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);
+    obj = klass->getClassDelegatee(vm);
+    ArrayObject::setElement(res, obj, i);
   }
 
   return res;

Modified: vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp Thu Apr 25 12:05:01 2013
@@ -244,6 +244,8 @@ Constant* JavaAOTCompiler::getMethodInCl
 }
 
 Constant* JavaAOTCompiler::getString(JavaString* str) {
+  llvm_gcroot(str, 0);
+
   assert(!useCooperativeGC());
   string_iterator SI = strings.find(str);
   if (SI != strings.end()) {
@@ -328,6 +330,9 @@ JavaObject* JavaAOTCompiler::getFinalObj
 }
 
 Constant* JavaAOTCompiler::HandleMagic(JavaObject* obj, CommonClass* objCl) {
+  word_t* realObj = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(realObj, 0);
 
   static const UTF8* AddressArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/AddressArray");
   static const UTF8* WordArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/WordArray");
@@ -340,7 +345,7 @@ Constant* JavaAOTCompiler::HandleMagic(J
       name->equals(ExtentArray) || name->equals(ObjectReferenceArray) || 
       name->equals(OffsetArray)) {
     
-    word_t* realObj = (word_t*)obj;
+    realObj = (word_t*)obj;
     word_t size = realObj[0];
 
     ArrayType* ATy = ArrayType::get(JavaIntrinsics.JavaObjectType,
@@ -373,6 +378,8 @@ Constant* JavaAOTCompiler::HandleMagic(J
 
 
 Constant* JavaAOTCompiler::getFinalObject(JavaObject* obj, CommonClass* objCl) {
+  llvm_gcroot(obj, 0);
+
   assert(!useCooperativeGC());
   llvm::GlobalVariable* varGV = 0;
   final_object_iterator End = finalObjects.end();
@@ -446,6 +453,11 @@ Constant* JavaAOTCompiler::getFinalObjec
 }
 
 Constant* JavaAOTCompiler::CreateConstantFromStaticInstance(Class* cl) {
+  JavaObject* val = 0;
+  JavaString* obj = 0;
+  llvm_gcroot(val, 0);
+  llvm_gcroot(obj, 0);
+
   LLVMClassInfo* LCI = getClassInfo(cl);
   Type* Ty = LCI->getStaticType();
   StructType* STy = dyn_cast<StructType>(Ty->getContainedType(0));
@@ -498,7 +510,7 @@ Constant* JavaAOTCompiler::CreateConstan
             abort();
           }
         } else {
-          JavaObject* val = field.getStaticObjectField();
+          val = field.getStaticObjectField();
           if (val) {
             JnjvmClassLoader* JCL = cl->classLoader;
             CommonClass* FieldCl = field.getSignature()->assocClass(JCL);
@@ -530,7 +542,7 @@ Constant* JavaAOTCompiler::CreateConstan
           Elts.push_back(JavaIntrinsics.JavaObjectNullConstant);
         } else {
           const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]);
-          JavaString* obj = ctpInfo->resolveString(utf8, idx);
+          obj = ctpInfo->resolveString(utf8, idx);
           Constant* C = getString(obj);
           C = ConstantExpr::getBitCast(C, JavaIntrinsics.JavaObjectType);
           Elts.push_back(C);
@@ -657,6 +669,12 @@ Constant* JavaAOTCompiler::CreateConstan
 }
 
 Constant* JavaAOTCompiler::CreateConstantFromJavaObject(JavaObject* obj) {
+  JavaObject* val = 0;
+  ArrayObject* array = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(val, 0);
+  llvm_gcroot(array, 0);
+
   assert(!useCooperativeGC());
   CommonClass* cl = JavaObject::getClass(obj);
 
@@ -692,7 +710,8 @@ Constant* JavaAOTCompiler::CreateConstan
         abort();
       }
     } else {
-      return CreateConstantFromObjectArray((ArrayObject*)obj);
+      array = (ArrayObject*)obj;
+      return CreateConstantFromObjectArray(array);
     }
   } else {
     
@@ -744,7 +763,7 @@ Constant* JavaAOTCompiler::CreateConstan
             abort();
           }
         } else {
-          JavaObject* val = field.getInstanceObjectField(obj);
+          val = field.getInstanceObjectField(obj);
           if (val) {
             JnjvmClassLoader* JCL = cl->classLoader;
             CommonClass* FieldCl = field.getSignature()->assocClass(JCL);
@@ -764,6 +783,8 @@ Constant* JavaAOTCompiler::CreateConstan
 }
 
 Constant* JavaAOTCompiler::CreateConstantFromJavaString(JavaString* str) {
+  llvm_gcroot(str, 0);
+
   assert(!useCooperativeGC());
   Class* cl = JavaObject::getClass(str)->asClass();
   LLVMClassInfo* LCI = getClassInfo(cl);
@@ -1442,6 +1463,9 @@ Constant* JavaAOTCompiler::CreateConstan
 }
 
 Constant* JavaAOTCompiler::CreateConstantFromObjectArray(const ArrayObject* val) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(val, 0);
   assert(!useCooperativeGC());
   std::vector<Type*> Elemts;
   llvm::Type* Ty = JavaIntrinsics.JavaObjectType;
@@ -1461,8 +1485,9 @@ Constant* JavaAOTCompiler::CreateConstan
   
   std::vector<Constant*> Vals;
   for (sint32 i = 0; i < ArrayObject::getSize(val); ++i) {
-    if (ArrayObject::getElement(val, i)) {
-      Vals.push_back(getFinalObject(ArrayObject::getElement(val, i),
+    obj = ArrayObject::getElement(val, i);
+    if (obj) {
+      Vals.push_back(getFinalObject(obj,
           JavaObject::getClass(val)->asArrayClass()->baseClass()));
     } else {
       Vals.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
@@ -2496,12 +2521,14 @@ void JavaAOTCompiler::generateMain(const
 extern std::set<gc*> __InternalSet__;
 
 CommonClass* JavaAOTCompiler::getUniqueBaseClass(CommonClass* cl) {
+  JavaObject* obj = NULL;
+  llvm_gcroot(obj, 0);
   std::set<gc*>::iterator I = __InternalSet__.begin();
   std::set<gc*>::iterator E = __InternalSet__.end();
   CommonClass* currentClass = 0;
 
   for (; I != E; ++I) {
-    JavaObject* obj = (JavaObject*)(*I);
+    obj = (JavaObject*)(*I);
     if (!VMClassLoader::isVMClassLoader(obj) &&
         !VMStaticInstance::isVMStaticInstance(obj) &&
         JavaObject::instanceOf(obj, cl)) {

Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp Thu Apr 25 12:05:01 2013
@@ -127,6 +127,8 @@ bool JavaJIT::isThisReference(int stackI
 }
 
 void JavaJIT::invokeVirtual(uint16 index) {
+  JavaObject* source = 0;
+  llvm_gcroot(source, 0);
   
   JavaConstantPool* ctpInfo = compilingClass->ctpInfo;
   CommonClass* cl = 0;
@@ -168,7 +170,7 @@ void JavaJIT::invokeVirtual(uint16 index
  
   if (TheCompiler->isStaticCompiling()) {
     Value* obj = objectStack[stack.size() - signature->nbArguments - 1];
-    JavaObject* source = TheCompiler->getFinalObject(obj);
+    source = TheCompiler->getFinalObject(obj);
     if (source) {
       canBeDirect = true;
       CommonClass* sourceClass = JavaObject::getClass(source);
@@ -1317,13 +1319,15 @@ void JavaJIT::compareFP(Value* val1, Val
 }
 
 void JavaJIT::loadConstant(uint16 index) {
+  JavaString* str = NULL;
+  llvm_gcroot(str, 0);
   JavaConstantPool* ctpInfo = compilingClass->ctpInfo;
   uint8 type = ctpInfo->typeAt(index);
   
   if (type == JavaConstantPool::ConstantString) {
     if (TheCompiler->isStaticCompiling() && !TheCompiler->useCooperativeGC()) {
       const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]);
-      JavaString* str = *(compilingClass->classLoader->UTF8ToStr(utf8));
+      str = *(compilingClass->classLoader->UTF8ToStr(utf8));
       Value* val = TheCompiler->getString(str);
       push(val, false, upcalls->newString);
     } else {
@@ -2012,6 +2016,9 @@ void JavaJIT::setStaticField(uint16 inde
 }
 
 void JavaJIT::getStaticField(uint16 index) {
+  JavaObject* val = 0;
+  llvm_gcroot(val, 0);
+
   Typedef* sign = compilingClass->ctpInfo->infoOfField(index);
   LLVMAssessorInfo& LAI = TheCompiler->getTypedefInfo(sign);
   Type* type = LAI.llvmType;
@@ -2055,7 +2062,7 @@ void JavaJIT::getStaticField(uint16 inde
         }
       } else {
         if (TheCompiler->isStaticCompiling() && !TheCompiler->useCooperativeGC()) {
-          JavaObject* val = field->getStaticObjectField();
+          val = field->getStaticObjectField();
           JnjvmClassLoader* JCL = field->classDef->classLoader;
           Value* V = TheCompiler->getFinalObject(val, sign->assocClass(JCL));
           CommonClass* cl = vmkit::Collector::begOf(val) ?

Modified: vmkit/trunk/lib/j3/VMCore/JavaArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaArray.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaArray.h Thu Apr 25 12:05:01 2013
@@ -143,23 +143,35 @@ public:
   static const unsigned int T_LONG;
 
   static void setSize(JavaObject* array, int size) {
+    ArrayUInt8* obj = 0;
+    llvm_gcroot(obj, 0);
     llvm_gcroot(array, 0);
-    ((ArrayUInt8*)array)->size = size;
+    obj = (ArrayUInt8*)array;
+    obj->size = size;
   }
 
   static sint32 getSize(const JavaObject* array) {
+    const ArrayUInt8* obj = 0;
+    llvm_gcroot(obj, 0);
     llvm_gcroot(array, 0);
-    return ((const ArrayUInt8*)array)->size;
+    obj = (const ArrayUInt8*)array;
+    return obj->size;
   }
 
   static const unsigned char* getElements(const JavaObject* array) {
+    const ArrayUInt8* obj = 0;
+    llvm_gcroot(obj, 0);
     llvm_gcroot(array, 0);
-    return ((const ArrayUInt8*)array)->elements;
+    obj = (const ArrayUInt8*)array;
+    return obj->elements;
   }
 
   static unsigned char* getElements(JavaObject* array) {
+    ArrayUInt8* obj = 0;
+    llvm_gcroot(obj, 0);
     llvm_gcroot(array, 0);
-    return ((ArrayUInt8*)array)->elements;
+    obj = (ArrayUInt8*)array;
+    return obj->elements;
   }
 };
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:05:01 2013
@@ -604,6 +604,9 @@ void JavaField::InitStaticField(float va
 }
 
 void JavaField::InitStaticField(Jnjvm* vm) {
+  JavaString* obj = 0;
+  llvm_gcroot(obj, 0);
+
   const Typedef* type = getSignature();
   JavaAttribute* attribute = lookupAttribute(JavaAttribute::constantAttribute);
 
@@ -626,7 +629,8 @@ void JavaField::InitStaticField(Jnjvm* v
       }
     } else if (type->isReference()) {
       const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]);
-      InitStaticField((JavaObject*)ctpInfo->resolveString(utf8, idx));
+      obj = ctpInfo->resolveString(utf8, idx);
+      InitStaticField(obj);
     } else {
       fprintf(stderr, "I haven't verified your class file and it's malformed:"
                       " unknown constant %s!\n",
@@ -1033,9 +1037,12 @@ ArrayObject* JavaMethod::getParameterTyp
 }
 
 JavaObject* JavaMethod::getReturnType(JnjvmClassLoader* loader) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   Jnjvm* vm = JavaThread::get()->getJVM();
   Typedef* ret = getSignature()->getReturnType();
-  return getClassType(vm, loader, ret);
+  obj = getClassType(vm, loader, ret);
+  return obj;
 }
 
 ArrayObject* JavaMethod::getExceptionTypes(JnjvmClassLoader* loader) {
@@ -1083,10 +1090,11 @@ JavaObject* CommonClass::setDelegatee(Ja
 UserCommonClass* UserCommonClass::resolvedImplClass(Jnjvm* vm,
                                                     JavaObject* clazz,
                                                     bool doClinit) {
-
+  JavaObjectClass* jcl = 0;
   llvm_gcroot(clazz, 0);
+  llvm_gcroot(jcl, 0);
 
-  UserCommonClass* cl = JavaObjectClass::getClass((JavaObjectClass*)clazz);
+  UserCommonClass* cl = JavaObjectClass::getClass(jcl = (JavaObjectClass*)clazz);
   assert(cl && "No class in Class object");
   if (cl->isClass()) {
     cl->asClass()->resolveClass();
@@ -1754,8 +1762,10 @@ JavaObject* AnnotationReader::createElem
   uint8 tag = reader.readU1();
   JavaObject* res = 0;
   JavaObject* tmp = 0;
+  ArrayObject* arrayObj = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(tmp, 0);
+  llvm_gcroot(arrayObj, 0);
 	
 	Jnjvm* vm = JavaThread::get()->getJVM();
   Classpath* upcalls = JavaThread::get()->getJVM()->upcalls;
@@ -1836,7 +1846,8 @@ JavaObject* AnnotationReader::createElem
     ddprintf("Tableau de %d elements\n", numValues);
     for (uint32 i = 0; i < numValues; ++i) {
       tmp = createElementValue();
-      ArrayObject::setElement((ArrayObject *)res, tmp, i);
+      arrayObj = (ArrayObject *)res;
+      ArrayObject::setElement(arrayObj, tmp, i);
     }
     ddprintf("Fin du Tableau");
   } else {
@@ -1858,7 +1869,7 @@ JavaObject* AnnotationReader::createAnno
   llvm_gcroot(str, 0);
   llvm_gcroot(newHashMap, 0);
 
-	Jnjvm * vm = JavaThread::get()->getJVM();
+  Jnjvm * vm = JavaThread::get()->getJVM();
   Classpath* upcalls = vm->upcalls;
   UserClass* HashMap = upcalls->newHashMap;
   newHashMap = HashMap->doNew(vm);

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:05:01 2013
@@ -1076,6 +1076,7 @@ private:
 	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
 	TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) {
 		llvm_gcroot(obj, 0);
+		assert(cl && "Class is NULL");
 		vmkit::ThreadAllocator allocator;
 		jvalue* buffer = marshalArguments(allocator, ap);
 		return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
@@ -1084,6 +1085,7 @@ private:
 	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
 	TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) {
 		llvm_gcroot(obj, 0);
+		assert(cl && "Class is NULL");
 		vmkit::ThreadAllocator allocator;
 		jvalue* buffer = marshalArguments(allocator, ap);
 		return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
@@ -1091,6 +1093,7 @@ private:
 
 	template<class TYPE, class FUNC_TYPE_STATIC_BUF>
 	TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list ap) __attribute__((noinline)) {
+		assert(cl && "Class is NULL");
 		vmkit::ThreadAllocator allocator;
 		jvalue* buffer = marshalArguments(allocator, ap);
 		return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buffer);

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.cpp Thu Apr 25 12:05:01 2013
@@ -161,10 +161,14 @@ void JavaObject::notifyAll(JavaObject* s
 JavaObject* JavaObject::clone(JavaObject* src) {
   JavaObject* res = 0;
   JavaObject* tmp = 0;
+  ArrayObject* srcArray = 0;
+  ArrayObject* resArray = 0;
 
   llvm_gcroot(src, 0);
   llvm_gcroot(res, 0);
   llvm_gcroot(tmp, 0);
+  llvm_gcroot(srcArray, 0);
+  llvm_gcroot(resArray, 0);
 
   UserCommonClass* cl = JavaObject::getClass(src);
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -185,9 +189,11 @@ JavaObject* JavaObject::clone(JavaObject
              (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),
              size);
     } else {
+      srcArray = (ArrayObject*)src;
+      resArray = (ArrayObject*)res;
       for (int i = 0; i < length; i++) {
-        tmp = ArrayObject::getElement((ArrayObject*)src, i);
-        ArrayObject::setElement((ArrayObject*)res, tmp, i);
+        tmp = ArrayObject::getElement(srcArray, i);
+        ArrayObject::setElement(resArray, tmp, i);
       }
     }
   } else {
@@ -373,6 +379,9 @@ bool JavaObject::instanceOf(JavaObject*
 
 std::ostream& j3::operator << (std::ostream& os, JavaObjectVMThread& threadObj)
 {
+	JavaObject *obj = &threadObj;
+	llvm_gcroot(obj, 0);
+
 	for (int retries = 10; (!threadObj.vmdata) && (retries >= 0); --retries)
 		usleep(100);
 
@@ -384,9 +393,14 @@ std::ostream& j3::operator << (std::ostr
 
 std::ostream& j3::operator << (std::ostream& os, const JavaObject& obj)
 {
+	JavaObject* javaLoader = NULL;
+	JavaObject *o = const_cast<JavaObject*>(&obj);
+	llvm_gcroot(javaLoader, 0);
+	llvm_gcroot(o, 0);
+
 	if (VMClassLoader::isVMClassLoader(&obj)) {
 		JnjvmClassLoader* loader = ((const VMClassLoader&)obj).getClassLoader();
-		JavaObject* javaLoader = loader->getJavaClassLoader();
+		javaLoader = loader->getJavaClassLoader();
 		CommonClass* javaCl = JavaObject::getClass(javaLoader);
 		os << &obj <<
 			"(class=j3::VMClassLoader" <<

Modified: vmkit/trunk/lib/j3/VMCore/JavaReferenceQueue.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaReferenceQueue.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaReferenceQueue.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaReferenceQueue.cpp Thu Apr 25 12:05:01 2013
@@ -16,9 +16,10 @@
 using namespace j3;
 
 bool enqueueReference(gc* _obj) {
-  Jnjvm* vm = JavaThread::get()->getJVM();
   JavaObject* obj = (JavaObject*)_obj;
   llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
+  Jnjvm* vm = JavaThread::get()->getJVM();
   JavaMethod* meth = vm->upcalls->EnqueueReference;
   UserClass* cl = JavaObject::getClass(obj)->asClass();
   return (bool)meth->invokeIntSpecialBuf(vm, cl, obj, 0);
@@ -35,28 +36,34 @@ void Jnjvm::invokeEnqueueReference(gc* r
 gc** Jnjvm::getObjectReferentPtr(gc* _obj) {
   JavaObjectReference* obj = (JavaObjectReference*)_obj;
   llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
   return (gc**)JavaObjectReference::getReferentPtr(obj);
 }
 
 void Jnjvm::setObjectReferent(gc* _obj, gc* val) {
   JavaObjectReference* obj = (JavaObjectReference*)_obj;
+  JavaObject *_val = (JavaObject*)val;
   llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
   llvm_gcroot(val, 0);
-  JavaObjectReference::setReferent(obj, (JavaObject*)val);
+  llvm_gcroot(_val, 0);
+  JavaObjectReference::setReferent(obj, _val);
 }
  
 void Jnjvm::clearObjectReferent(gc* _obj) {
   JavaObjectReference* obj = (JavaObjectReference*)_obj;
   llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
   JavaObjectReference::setReferent(obj, NULL);
 }
 
 typedef void (*destructor_t)(void*);
 
 void invokeFinalizer(gc* _obj) {
-  Jnjvm* vm = JavaThread::get()->getJVM();
   JavaObject* obj = (JavaObject*)_obj;
   llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
+  Jnjvm* vm = JavaThread::get()->getJVM();
   JavaMethod* meth = vm->upcalls->FinalizeObject;
   UserClass* cl = JavaObject::getClass(obj)->asClass();
   meth->invokeIntVirtualBuf(vm, cl, obj, 0);
@@ -71,10 +78,9 @@ void invokeFinalize(gc* res) {
 }
 
 void Jnjvm::finalizeObject(gc* object) {
-	JavaObject* res = 0;
-	llvm_gcroot(object, 0);
-	llvm_gcroot(res, 0);
-	res = (JavaObject*) object;
+  JavaObject* res = (JavaObject*)object;
+  llvm_gcroot(object, 0);
+  llvm_gcroot(res, 0);
   JavaVirtualTable* VT = res->getVirtualTable();
   if (VT->operatorDelete) {
     destructor_t dest = (destructor_t)VT->destructor;

Modified: vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp Thu Apr 25 12:05:01 2013
@@ -180,21 +180,26 @@ extern "C" UserCommonClass* j3RuntimeIni
 
 // Calls Java code.
 extern "C" JavaObject* j3RuntimeDelegatee(UserCommonClass* cl) {
-  return cl->getClassDelegatee(JavaThread::get()->getJVM());
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+  obj = cl->getClassDelegatee(JavaThread::get()->getJVM());
+  return obj;
 }
 
 // Throws if one of the dimension is negative.
 JavaObject* multiCallNewIntern(UserClassArray* cl, uint32 len,
                                sint32* dims, Jnjvm* vm) {
-  assert(len > 0 && "Negative size given by VMKit");
- 
-  JavaObject* _res = cl->doNew(dims[0], vm);
+  JavaObject* _res = NULL;
   ArrayObject* res = NULL;
   JavaObject* temp = NULL;
   llvm_gcroot(_res, 0);
   llvm_gcroot(res, 0);
   llvm_gcroot(temp, 0);
 
+  assert(len > 0 && "Negative size given by VMKit");
+ 
+  _res = cl->doNew(dims[0], vm);
+
   if (len > 1) {
     res = (ArrayObject*)_res;
     UserCommonClass* _base = cl->baseClass();
@@ -501,6 +506,7 @@ extern "C" void* j3ResolveSpecialStub()
 
 // Does not throw an exception.
 extern "C" void* j3ResolveInterface(JavaObject* obj, JavaMethod* meth, uint32_t index) {
+  llvm_gcroot(obj, 0);
   word_t result = 0;
   InterfaceMethodTable* IMT = JavaObject::getClass(obj)->virtualVT->IMT;
   if ((IMT->contents[index] & 1) == 0) {

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.cpp Thu Apr 25 12:05:01 2013
@@ -170,12 +170,17 @@ void JNILocalReferences::removeJNIRefere
 
 std::ostream& j3::operator << (std::ostream& os, const JavaThread& thread)
 {
+	JavaObject* jThread = NULL;
+	JavaString* threadNameObj = NULL;
+	llvm_gcroot(jThread, 0);
+	llvm_gcroot(threadNameObj, 0);
+
 	os << '[' << (void*)(&thread);
 
 	Jnjvm* vm = thread.getJVM();
-	JavaObject* jThread = thread.currentThread();
+	jThread = thread.currentThread();
 	if (vm && jThread) {
-		JavaString* threadNameObj = static_cast<JavaString*>(
+		threadNameObj = static_cast<JavaString*>(
 			vm->upcalls->threadName->getInstanceObjectField(jThread));
 		char *threadName = JavaString::strToAsciiz(threadNameObj);
 		os << '(' << threadName << ')';

Modified: vmkit/trunk/lib/j3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jni.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jni.cpp Thu Apr 25 12:05:01 2013
@@ -54,10 +54,12 @@ jint GetVersion(JNIEnv *env) {
 
 jclass DefineClass(JNIEnv *env, const char *name, jobject _loader,
 				   const jbyte *buf, jsize len) {
+  JavaObject *loader = NULL;
+  llvm_gcroot(loader, 0);
+
   BEGIN_JNI_EXCEPTION
 
-  JavaObject * loader = _loader ? *(JavaObject**)_loader : 0;
-  llvm_gcroot(loader, 0);
+  loader = _loader ? *(JavaObject**)_loader : 0;
 
   jclass res = NULL;
 
@@ -105,12 +107,15 @@ jclass FindClass(JNIEnv *env, const char
   
 
 jmethodID FromReflectedMethod(JNIEnv *env, jobject method) {
+  JavaObjectConstructor* methObj = 0;
+  JavaObject* meth = NULL;
+  llvm_gcroot(meth, 0);
+  llvm_gcroot(methObj, 0);
   
   BEGIN_JNI_EXCEPTION
  
   // Local object references. 
-  JavaObject* meth = *(JavaObject**)method;
-  llvm_gcroot(meth, 0);
+  meth = *(JavaObject**)method;
 
   Jnjvm* vm = myVM(env);
   Classpath* upcalls = vm->upcalls;
@@ -119,7 +124,7 @@ jmethodID FromReflectedMethod(JNIEnv *en
     jmethodID res = (jmethodID)JavaObjectMethod::getInternalMethod((JavaObjectMethod*)meth);
     RETURN_FROM_JNI(res);
   } else if (cl == upcalls->newMethod) {
-    jmethodID res = (jmethodID)JavaObjectConstructor::getInternalMethod((JavaObjectConstructor*)meth);
+    jmethodID res = (jmethodID)JavaObjectConstructor::getInternalMethod(methObj = (JavaObjectConstructor*)meth);
     RETURN_FROM_JNI(res);
   }
   
@@ -130,13 +135,15 @@ jmethodID FromReflectedMethod(JNIEnv *en
 
 
 jclass GetSuperclass(JNIEnv *env, jclass sub) {
-  BEGIN_JNI_EXCEPTION
-
   jclass res = 0;
-  JavaObject* Cl = *(JavaObject**)sub;
+  JavaObject* Cl = NULL;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(res, 0);
 
+  BEGIN_JNI_EXCEPTION
+
+  Cl = *(JavaObject**)sub;
+
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
   if (!cl->isInterface() && cl->getSuper() != NULL) {
@@ -151,14 +158,16 @@ jclass GetSuperclass(JNIEnv *env, jclass
   
  
 jboolean IsSubclassOf(JNIEnv *env, jclass _sub, jclass _sup) {
+  JavaObject* sub = NULL;
+  JavaObject* sup = NULL;
+  llvm_gcroot(sub, 0);
+  llvm_gcroot(sup, 0);
   
   BEGIN_JNI_EXCEPTION
  
   // Local object references.
-  JavaObject* sub = *(JavaObject**)_sub;
-  JavaObject* sup = *(JavaObject**)_sup;
-  llvm_gcroot(sub, 0);
-  llvm_gcroot(sup, 0);
+  sub = *(JavaObject**)_sub;
+  sup = *(JavaObject**)_sup;
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl2 = 
@@ -189,18 +198,19 @@ jint Throw(JNIEnv *env, jthrowable obj)
 
 
 jint ThrowNew(JNIEnv* env, jclass _Cl, const char *msg) {
-  
-  BEGIN_JNI_EXCEPTION
- 
-  verifyNull(_Cl);
-  // Local object references.
-  JavaObject* Cl = *(JavaObject**)_Cl;
+  JavaObject* Cl = NULL;
   JavaObject* res = 0;
   JavaString* str = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(res, 0);
   llvm_gcroot(str, 0);
   
+  BEGIN_JNI_EXCEPTION
+
+  // Local object references.
+  verifyNull(_Cl);
+  Cl = *(JavaObject**)_Cl;
+
   Jnjvm* vm = JavaThread::get()->getJVM();
   
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
@@ -224,11 +234,12 @@ jint ThrowNew(JNIEnv* env, jclass _Cl, c
 
 
 jthrowable ExceptionOccurred(JNIEnv *env) {
+  JavaObject* obj = NULL;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
 
-  JavaObject* obj = JavaThread::get()->pendingException;
-  llvm_gcroot(obj, 0);
+  obj = JavaThread::get()->pendingException;
   if (obj == NULL) RETURN_FROM_JNI(NULL);
   jthrowable res = (jthrowable)th->pushJNIRef(obj);
   RETURN_FROM_JNI(res);
@@ -277,13 +288,15 @@ void DeleteLocalRef(JNIEnv *env, jobject
 
 
 jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2) {
+  JavaObject* Ref1 = NULL;
+  JavaObject* Ref2 = NULL;
+  llvm_gcroot(Ref1, 0);
+  llvm_gcroot(Ref2, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  JavaObject* Ref1 = ref1 ? *(JavaObject**)ref1 : NULL;
-  JavaObject* Ref2 = ref2 ? *(JavaObject**)ref2 : NULL;
-  llvm_gcroot(Ref1, 0);
-  llvm_gcroot(Ref2, 0);
+  Ref1 = ref1 ? *(JavaObject**)ref1 : NULL;
+  Ref2 = ref2 ? *(JavaObject**)ref2 : NULL;
 
   RETURN_FROM_JNI(Ref1 == Ref2);
   
@@ -306,14 +319,15 @@ jint EnsureLocalCapacity(JNIEnv* env, ji
 
 
 jobject AllocObject(JNIEnv *env, jclass _clazz) {
+  JavaObject* clazz = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(clazz, 0);
+  llvm_gcroot(res, 0);
   
   BEGIN_JNI_EXCEPTION
  
   // Local object references.  
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  JavaObject* res = 0;
-  llvm_gcroot(clazz, 0);
-  llvm_gcroot(res, 0);
+  clazz = *(JavaObject**)_clazz;
 
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
@@ -333,14 +347,16 @@ jobject AllocObject(JNIEnv *env, jclass
 
 
 jobject NewObject(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(clazz, 0);
+  llvm_gcroot(res, 0);
+
   BEGIN_JNI_EXCEPTION
   
  
   // Local object references
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  JavaObject* res = 0;
-  llvm_gcroot(clazz, 0);
-  llvm_gcroot(res, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   JavaThread* th = JavaThread::get();
@@ -366,14 +382,16 @@ jobject NewObject(JNIEnv *env, jclass _c
 
 jobject NewObjectV(JNIEnv* env, jclass _clazz, jmethodID methodID,
                    va_list args) {
-  BEGIN_JNI_EXCEPTION
-
-  // Local object references
-  JavaObject* clazz = *(JavaObject**)_clazz;
+  JavaObject* clazz = 0;
   JavaObject* res = 0;
   llvm_gcroot(clazz, 0);
   llvm_gcroot(res, 0);
 
+  BEGIN_JNI_EXCEPTION
+
+  // Local object references
+  clazz = *(JavaObject**)_clazz;
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   JavaMethod* meth = (JavaMethod*)methodID;
@@ -393,14 +411,16 @@ jobject NewObjectV(JNIEnv* env, jclass _
 
 jobject NewObjectA(JNIEnv* env, jclass _clazz, jmethodID methodID,
                    const jvalue *args) {
+  JavaObject* clazz = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(clazz, 0);
+  llvm_gcroot(res, 0);
+
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  JavaObject* res = 0;
-  llvm_gcroot(clazz, 0);
-  llvm_gcroot(res, 0);
+  clazz = *(JavaObject**)_clazz;
 
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
@@ -421,12 +441,13 @@ jobject NewObjectA(JNIEnv* env, jclass _
 
 
 jclass GetObjectClass(JNIEnv *env, jobject _obj) {
+  JavaObject* obj = NULL;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
 
   // Local object references
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
@@ -488,12 +509,13 @@ jobject ToReflectedField(JNIEnv* env, jc
 
 jmethodID GetMethodID(JNIEnv* env, jclass _clazz, const char *aname,
 		                  const char *atype) {
+  JavaObject* clazz = NULL;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
  
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
@@ -515,6 +537,10 @@ jmethodID GetMethodID(JNIEnv* env, jclas
 
 
 jobject CallObjectMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(res, 0);
 
   BEGIN_JNI_EXCEPTION
 
@@ -524,10 +550,7 @@ jobject CallObjectMethod(JNIEnv *env, jo
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  JavaObject* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(res, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   JavaThread* th = JavaThread::get();
@@ -547,16 +570,17 @@ jobject CallObjectMethod(JNIEnv *env, jo
 
 jobject CallObjectMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                           va_list args) {
+  JavaObject* obj = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(res, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
  
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  JavaObject* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(res, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   JavaThread* th = JavaThread::get();
@@ -577,15 +601,17 @@ jobject CallObjectMethodV(JNIEnv *env, j
 
 jobject CallObjectMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                           const jvalue * args) {
+  JavaObject* obj = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(res, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  JavaObject* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(res, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -602,6 +628,8 @@ jobject CallObjectMethodA(JNIEnv *env, j
 
 
 jboolean CallBooleanMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* self = 0;
+  llvm_gcroot(self, 0);
 
   BEGIN_JNI_EXCEPTION
   
@@ -611,8 +639,7 @@ jboolean CallBooleanMethod(JNIEnv *env,
   va_start(ap, methodID);
   
   // Local object references.  
-  JavaObject* self = *(JavaObject**)_obj;
-  llvm_gcroot(self, 0);
+  self = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -631,14 +658,15 @@ jboolean CallBooleanMethod(JNIEnv *env,
 
 jboolean CallBooleanMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                             va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -654,13 +682,15 @@ jboolean CallBooleanMethodV(JNIEnv *env,
 
 jboolean CallBooleanMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                             const jvalue * args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -683,14 +713,15 @@ jbyte CallByteMethod(JNIEnv *env, jobjec
 
 jbyte CallByteMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                       va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
  
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -706,13 +737,15 @@ jbyte CallByteMethodV(JNIEnv *env, jobje
 
 jbyte CallByteMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                       const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -736,14 +769,15 @@ jchar CallCharMethod(JNIEnv *env, jobjec
 
 jchar CallCharMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                       va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
  
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -759,13 +793,15 @@ jchar CallCharMethodV(JNIEnv *env, jobje
 
 jchar CallCharMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                       const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -789,14 +825,15 @@ jshort CallShortMethod(JNIEnv *env, jobj
 
 jshort CallShortMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                         va_list args) {
-  
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -812,13 +849,15 @@ jshort CallShortMethodV(JNIEnv *env, job
 
 jshort CallShortMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                         const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -835,6 +874,8 @@ jshort CallShortMethodA(JNIEnv *env, job
 
 
 jint CallIntMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
@@ -844,8 +885,7 @@ jint CallIntMethod(JNIEnv *env, jobject
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -863,14 +903,15 @@ jint CallIntMethod(JNIEnv *env, jobject
 
 jint CallIntMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                     va_list args) {
-  
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -887,13 +928,15 @@ jint CallIntMethodV(JNIEnv *env, jobject
 
 jint CallIntMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                     const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -910,6 +953,9 @@ jint CallIntMethodA(JNIEnv *env, jobject
 
 
 jlong CallLongMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
@@ -918,8 +964,7 @@ jlong CallLongMethod(JNIEnv *env, jobjec
   va_start(ap, methodID);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -937,14 +982,15 @@ jlong CallLongMethod(JNIEnv *env, jobjec
 
 jlong CallLongMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                       va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -960,13 +1006,15 @@ jlong CallLongMethodV(JNIEnv *env, jobje
 
 jlong CallLongMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                       const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -983,6 +1031,8 @@ jlong CallLongMethodA(JNIEnv *env, jobje
 
 
 jfloat CallFloatMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -992,8 +1042,7 @@ jfloat CallFloatMethod(JNIEnv *env, jobj
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1009,14 +1058,15 @@ jfloat CallFloatMethod(JNIEnv *env, jobj
 
 jfloat CallFloatMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                         va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
  
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1032,13 +1082,15 @@ jfloat CallFloatMethodV(JNIEnv *env, job
 
 jfloat CallFloatMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                         const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1055,6 +1107,8 @@ jfloat CallFloatMethodA(JNIEnv *env, job
 
 
 jdouble CallDoubleMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -1064,8 +1118,7 @@ jdouble CallDoubleMethod(JNIEnv *env, jo
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1081,14 +1134,15 @@ jdouble CallDoubleMethod(JNIEnv *env, jo
 
 jdouble CallDoubleMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                           va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1104,13 +1158,15 @@ jdouble CallDoubleMethodV(JNIEnv *env, j
 
 jdouble CallDoubleMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                           const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1127,6 +1183,8 @@ jdouble CallDoubleMethodA(JNIEnv *env, j
 
 
 void CallVoidMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
 
@@ -1136,8 +1194,7 @@ void CallVoidMethod(JNIEnv *env, jobject
   va_start(ap, methodID);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1155,14 +1212,15 @@ void CallVoidMethod(JNIEnv *env, jobject
 
 void CallVoidMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
                      va_list args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
   verifyNull(_obj);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1179,13 +1237,15 @@ void CallVoidMethodV(JNIEnv *env, jobjec
 
 void CallVoidMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
                      const jvalue *args) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+
   BEGIN_JNI_EXCEPTION
 
   verifyNull(_obj);
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1428,6 +1488,8 @@ jdouble CallNonvirtualDoubleMethodA(JNIE
 
 void CallNonvirtualVoidMethod(JNIEnv *env, jobject _obj, jclass clazz,
                               jmethodID methodID, ...) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -1437,8 +1499,7 @@ void CallNonvirtualVoidMethod(JNIEnv *en
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1470,12 +1531,13 @@ void CallNonvirtualVoidMethodA(JNIEnv *e
 
 jfieldID GetFieldID(JNIEnv *env, jclass _clazz, const char *aname,
 		    const char *sig)  {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
@@ -1499,14 +1561,15 @@ jfieldID GetFieldID(JNIEnv *env, jclass
 
 
 jobject GetObjectField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(res, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  JavaObject* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(res, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
 
@@ -1523,12 +1586,13 @@ jobject GetObjectField(JNIEnv *env, jobj
 
 
 jboolean GetBooleanField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   uint8 res = (uint8)field->getInstanceInt8Field(obj);
@@ -1540,12 +1604,13 @@ jboolean GetBooleanField(JNIEnv *env, jo
 
 
 jbyte GetByteField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   sint8 res = (sint8)field->getInstanceInt8Field(obj);
@@ -1557,12 +1622,13 @@ jbyte GetByteField(JNIEnv *env, jobject
 
 
 jchar GetCharField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   uint16 res = (uint16)field->getInstanceInt16Field(obj);
@@ -1574,12 +1640,13 @@ jchar GetCharField(JNIEnv *env, jobject
 
 
 jshort GetShortField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   sint16 res = (sint16)field->getInstanceInt16Field(obj);
@@ -1591,12 +1658,13 @@ jshort GetShortField(JNIEnv *env, jobjec
 
 
 jint GetIntField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   sint32 res = (sint32)field->getInstanceInt32Field(obj);
@@ -1608,12 +1676,13 @@ jint GetIntField(JNIEnv *env, jobject _o
 
 
 jlong GetLongField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   sint64 res = (sint64)field->getInstanceLongField(obj);
@@ -1625,12 +1694,13 @@ jlong GetLongField(JNIEnv *env, jobject
 
 
 jfloat GetFloatField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   jfloat res = (jfloat)field->getInstanceFloatField(obj);
@@ -1642,12 +1712,13 @@ jfloat GetFloatField(JNIEnv *env, jobjec
 
 
 jdouble GetDoubleField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   jdouble res = (jdouble)field->getInstanceDoubleField(obj);
@@ -1659,14 +1730,16 @@ jdouble GetDoubleField(JNIEnv *env, jobj
 
 
 void SetObjectField(JNIEnv *env, jobject _obj, jfieldID fieldID, jobject _value) {
+  JavaObject* obj = 0;
+  JavaObject* value = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(value, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  JavaObject* value = *(JavaObject**)_value;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(value, 0);
+  obj = *(JavaObject**)_obj;
+  value = *(JavaObject**)_value;
 
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceObjectField(obj, value);
@@ -1681,12 +1754,13 @@ void SetObjectField(JNIEnv *env, jobject
 
 void SetBooleanField(JNIEnv *env, jobject _obj, jfieldID fieldID,
                      jboolean value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceInt8Field(obj, (uint8)value);
@@ -1700,12 +1774,13 @@ void SetBooleanField(JNIEnv *env, jobjec
 
 
 void SetByteField(JNIEnv *env, jobject _obj, jfieldID fieldID, jbyte value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceInt8Field(obj, (uint8)value);
@@ -1719,12 +1794,13 @@ void SetByteField(JNIEnv *env, jobject _
 
 
 void SetCharField(JNIEnv *env, jobject _obj, jfieldID fieldID, jchar value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
 
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceInt16Field(obj, (uint16)value);
@@ -1738,12 +1814,13 @@ void SetCharField(JNIEnv *env, jobject _
 
 
 void SetShortField(JNIEnv *env, jobject _obj, jfieldID fieldID, jshort value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceInt16Field(obj, (sint16)value);
@@ -1757,12 +1834,13 @@ void SetShortField(JNIEnv *env, jobject
 
 
 void SetIntField(JNIEnv *env, jobject _obj, jfieldID fieldID, jint value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceInt32Field(obj, (sint32)value);
@@ -1776,12 +1854,13 @@ void SetIntField(JNIEnv *env, jobject _o
 
 
 void SetLongField(JNIEnv *env, jobject _obj, jfieldID fieldID, jlong value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceLongField(obj, (sint64)value);
@@ -1795,12 +1874,13 @@ void SetLongField(JNIEnv *env, jobject _
 
 
 void SetFloatField(JNIEnv *env, jobject _obj, jfieldID fieldID, jfloat value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceFloatField(obj, (float)value);
@@ -1814,12 +1894,13 @@ void SetFloatField(JNIEnv *env, jobject
 
 
 void SetDoubleField(JNIEnv *env, jobject _obj, jfieldID fieldID, jdouble value) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* obj = *(JavaObject**)_obj;
-  llvm_gcroot(obj, 0);
+  obj = *(JavaObject**)_obj;
   
   JavaField* field = (JavaField*)fieldID;
   field->setInstanceDoubleField(obj, (float)value);
@@ -1834,12 +1915,13 @@ void SetDoubleField(JNIEnv *env, jobject
 
 jmethodID GetStaticMethodID(JNIEnv *env, jclass _clazz, const char *aname,
 			    const char *atype) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
@@ -1863,6 +1945,10 @@ jmethodID GetStaticMethodID(JNIEnv *env,
 
 jobject CallStaticObjectMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                ...) {
+  JavaObject* clazz = 0;
+  JavaObject* res = 0;
+  llvm_gcroot(clazz, 0);
+  llvm_gcroot(res, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -1870,10 +1956,7 @@ jobject CallStaticObjectMethod(JNIEnv *e
   va_start(ap, methodID);
  
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  JavaObject* res = 0;
-  llvm_gcroot(clazz, 0);
-  llvm_gcroot(res, 0);
+  clazz = *(JavaObject**)_clazz;
 
 
   JavaMethod* meth = (JavaMethod*)methodID;
@@ -1895,13 +1978,15 @@ jobject CallStaticObjectMethod(JNIEnv *e
 
 jobject CallStaticObjectMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                      va_list args) {
-  BEGIN_JNI_EXCEPTION
-  
-  // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
+  JavaObject* clazz = 0;
   JavaObject* res = 0;
   llvm_gcroot(clazz, 0);
   llvm_gcroot(res, 0);
+
+  BEGIN_JNI_EXCEPTION
+  
+  // Local object references.
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   JavaThread* th = JavaThread::get();
@@ -1921,14 +2006,16 @@ jobject CallStaticObjectMethodV(JNIEnv *
 
 jobject CallStaticObjectMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                 const jvalue *args) {
-  BEGIN_JNI_EXCEPTION
-
-  // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
+  JavaObject* clazz = 0;
   JavaObject* res = 0;
   llvm_gcroot(clazz, 0);
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
+  // Local object references.
+  clazz = *(JavaObject**)_clazz;
+
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserClass* cl = getClassFromStaticMethod(vm, meth, clazz); 
@@ -1945,6 +2032,8 @@ jobject CallStaticObjectMethodA(JNIEnv *
 
 jboolean CallStaticBooleanMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                  ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -1952,8 +2041,7 @@ jboolean CallStaticBooleanMethod(JNIEnv
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1969,12 +2057,13 @@ jboolean CallStaticBooleanMethod(JNIEnv
 
 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                   va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1989,11 +2078,13 @@ jboolean CallStaticBooleanMethodV(JNIEnv
 
 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                   const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2008,12 +2099,13 @@ jboolean CallStaticBooleanMethodA(JNIEnv
 
 
 jbyte CallStaticByteMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   va_list ap;
   va_start(ap, methodID);
@@ -2031,12 +2123,13 @@ jbyte CallStaticByteMethod(JNIEnv *env,
 
 jbyte CallStaticByteMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                             va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2051,11 +2144,13 @@ jbyte CallStaticByteMethodV(JNIEnv *env,
 
 jbyte CallStaticByteMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                             const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2070,6 +2165,8 @@ jbyte CallStaticByteMethodA(JNIEnv *env,
 
 
 jchar CallStaticCharMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2077,8 +2174,7 @@ jchar CallStaticCharMethod(JNIEnv *env,
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2094,11 +2190,13 @@ jchar CallStaticCharMethod(JNIEnv *env,
 
 jchar CallStaticCharMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                             va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2113,11 +2211,13 @@ jchar CallStaticCharMethodV(JNIEnv *env,
 
 jchar CallStaticCharMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                             const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2133,6 +2233,8 @@ jchar CallStaticCharMethodA(JNIEnv *env,
 
 jshort CallStaticShortMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
                              ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2140,8 +2242,7 @@ jshort CallStaticShortMethod(JNIEnv *env
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2157,12 +2258,13 @@ jshort CallStaticShortMethod(JNIEnv *env
 
 jshort CallStaticShortMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                               va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2177,11 +2279,13 @@ jshort CallStaticShortMethodV(JNIEnv *en
 
 jshort CallStaticShortMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                               const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2196,6 +2300,8 @@ jshort CallStaticShortMethodA(JNIEnv *en
 
 
 jint CallStaticIntMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2203,8 +2309,7 @@ jint CallStaticIntMethod(JNIEnv *env, jc
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2220,11 +2325,13 @@ jint CallStaticIntMethod(JNIEnv *env, jc
 
 jint CallStaticIntMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                           va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2240,11 +2347,13 @@ jint CallStaticIntMethodV(JNIEnv *env, j
 
 jint CallStaticIntMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                           const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2259,6 +2368,8 @@ jint CallStaticIntMethodA(JNIEnv *env, j
 
 
 jlong CallStaticLongMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2266,8 +2377,7 @@ jlong CallStaticLongMethod(JNIEnv *env,
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2283,12 +2393,13 @@ jlong CallStaticLongMethod(JNIEnv *env,
 
 jlong CallStaticLongMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
 			    va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2304,11 +2415,13 @@ jlong CallStaticLongMethodV(JNIEnv *env,
 
 jlong CallStaticLongMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                             const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2325,6 +2438,8 @@ jlong CallStaticLongMethodA(JNIEnv *env,
 
 jfloat CallStaticFloatMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
                              ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2332,8 +2447,7 @@ jfloat CallStaticFloatMethod(JNIEnv *env
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2349,12 +2463,13 @@ jfloat CallStaticFloatMethod(JNIEnv *env
 
 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                               va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2370,11 +2485,13 @@ jfloat CallStaticFloatMethodV(JNIEnv *en
 
 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                               const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2390,6 +2507,8 @@ jfloat CallStaticFloatMethodA(JNIEnv *en
 
 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2397,8 +2516,7 @@ jdouble CallStaticDoubleMethod(JNIEnv *e
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2414,11 +2532,13 @@ jdouble CallStaticDoubleMethod(JNIEnv *e
 
 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                 va_list args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2434,11 +2554,13 @@ jdouble CallStaticDoubleMethodV(JNIEnv *
 
 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                                 const jvalue *args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2453,6 +2575,8 @@ jdouble CallStaticDoubleMethodA(JNIEnv *
 
 
 void CallStaticVoidMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
@@ -2460,8 +2584,7 @@ void CallStaticVoidMethod(JNIEnv *env, j
   va_start(ap, methodID);
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
 
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2479,12 +2602,13 @@ void CallStaticVoidMethod(JNIEnv *env, j
 
 void CallStaticVoidMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
                            va_list args) {
-  
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2501,11 +2625,13 @@ void CallStaticVoidMethodV(JNIEnv *env,
 
 void CallStaticVoidMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
                            const jvalue * args) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -2522,12 +2648,13 @@ void CallStaticVoidMethodA(JNIEnv *env,
 
 jfieldID GetStaticFieldID(JNIEnv *env, jclass _clazz, const char *aname,
                           const char *sig) {
+  JavaObject* clazz = 0;
+  llvm_gcroot(clazz, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* clazz = *(JavaObject**)_clazz;
-  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
@@ -2550,13 +2677,11 @@ jfieldID GetStaticFieldID(JNIEnv *env, j
 
 
 jobject GetStaticObjectField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
-
-  BEGIN_JNI_EXCEPTION
-  
-  // Local object references.
   JavaObject* obj = 0;
   llvm_gcroot(obj, 0);
 
+  BEGIN_JNI_EXCEPTION
+  
   JavaThread* th = JavaThread::get();
   JavaField* field = (JavaField*)fieldID;
   obj = field->getStaticObjectField();
@@ -2674,12 +2799,13 @@ jdouble GetStaticDoubleField(JNIEnv *env
 
 void SetStaticObjectField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
                           jobject _value) {
+  JavaObject* value = 0;
+  llvm_gcroot(value, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* value = *(JavaObject**)_value;
-  llvm_gcroot(value, 0);
+  value = *(JavaObject**)_value;
 
   JavaField* field = (JavaField*)fieldID;
   field->setStaticObjectField(value);
@@ -2821,13 +2947,13 @@ void SetStaticDoubleField(JNIEnv *env, j
 
 
 jstring NewString(JNIEnv *env, const jchar *buf, jsize len) {
-  BEGIN_JNI_EXCEPTION
-
   JavaString* obj = NULL;
   ArrayUInt16* tmp = NULL;
   llvm_gcroot(obj, 0);
   llvm_gcroot(tmp, 0);
 
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
 
@@ -2848,11 +2974,13 @@ jstring NewString(JNIEnv *env, const jch
 
 
 jsize GetStringLength(JNIEnv *env, jstring _str) {
+  JavaString* str = 0;
+  llvm_gcroot(str, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaString* str = *(JavaString**)_str;
-  llvm_gcroot(str, 0);
+  str = *(JavaString**)_str;
 
   RETURN_FROM_JNI(str->count);
 
@@ -2875,12 +3003,11 @@ void ReleaseStringChars(JNIEnv *env, jst
 
 
 jstring NewStringUTF(JNIEnv *env, const char *bytes) {
-
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* obj = NULL;
   llvm_gcroot(obj, 0);
 
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   obj = vm->asciizToStr(bytes);
@@ -2893,11 +3020,14 @@ jstring NewStringUTF(JNIEnv *env, const
 
 
 jsize GetStringUTFLength (JNIEnv *env, jstring string) {
+  JavaString* s = NULL;
+  llvm_gcroot(s, 0);
+
   BEGIN_JNI_EXCEPTION
   JavaThread* th = JavaThread::get();
 
-  JavaString * s = *(JavaString**)string;
-  llvm_gcroot(s, 0);
+  s = *(JavaString**)string;
+
   RETURN_FROM_JNI(s->count);
   END_JNI_EXCEPTION
 
@@ -2906,12 +3036,13 @@ jsize GetStringUTFLength (JNIEnv *env, j
 
 
 const char *GetStringUTFChars(JNIEnv *env, jstring _string, jboolean *isCopy) {
+  JavaString* string = 0;
+  llvm_gcroot(string, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaString* string = *(JavaString**)_string;
-  llvm_gcroot(string, 0);
+  string = *(JavaString**)_string;
 
   if (isCopy != 0) (*isCopy) = true;
   const char* res = JavaString::strToAsciiz(string);
@@ -2928,12 +3059,13 @@ void ReleaseStringUTFChars(JNIEnv *env,
 
 
 jsize GetArrayLength(JNIEnv *env, jarray _array) {
+  JavaObject* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  JavaObject* array = *(JavaObject**)_array;
-  llvm_gcroot(array, 0);
+  array = *(JavaObject**)_array;
 
   RETURN_FROM_JNI(JavaArray::getSize(array));
 
@@ -2944,17 +3076,20 @@ jsize GetArrayLength(JNIEnv *env, jarray
 
 jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass _elementClass,
                             jobject _initialElement) {
-  BEGIN_JNI_EXCEPTION
-  
-  // Local object references.
-  JavaObject* elementClass = *(JavaObject**)_elementClass;
-  JavaObject* initialElement = _initialElement ? 
-    *(JavaObject**)_initialElement : 0;
+  JavaObject* elementClass = 0;
+  JavaObject* initialElement = 0;
   ArrayObject* res = 0;
   llvm_gcroot(elementClass, 0);
   llvm_gcroot(initialElement, 0);
   llvm_gcroot(res, 0);
 
+  BEGIN_JNI_EXCEPTION
+  
+  // Local object references.
+  elementClass = *(JavaObject**)_elementClass;
+  initialElement = _initialElement ?
+    *(JavaObject**)_initialElement : 0;
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
 
@@ -2983,15 +3118,15 @@ jobjectArray NewObjectArray(JNIEnv *env,
 
 
 jobject GetObjectArrayElement(JNIEnv *env, jobjectArray _array, jsize index) {
-  
-  BEGIN_JNI_EXCEPTION
-  
-  // Local object references.
-  ArrayObject* array = *(ArrayObject**)_array;
+  ArrayObject* array = 0;
   JavaObject* res = 0;
   llvm_gcroot(array, 0);
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
+  // Local object references.
+  array = *(ArrayObject**)_array;
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   
@@ -3013,14 +3148,16 @@ jobject GetObjectArrayElement(JNIEnv *en
 
 void SetObjectArrayElement(JNIEnv *env, jobjectArray _array, jsize index,
                            jobject _val) {
-  
+  ArrayObject* array = 0;
+  JavaObject* val = 0;
+  llvm_gcroot(array, 0);
+  llvm_gcroot(val, 0);
+
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArrayObject* array = *(ArrayObject**)_array;
-  JavaObject* val = *(JavaObject**)_val;
-  llvm_gcroot(array, 0);
-  llvm_gcroot(val, 0);
+  array = *(ArrayObject**)_array;
+  val = *(JavaObject**)_val;
 
   if (index >= ArrayObject::getSize(array)) {
     JavaThread::get()->getJVM()->indexOutOfBounds(array, index);
@@ -3038,12 +3175,11 @@ void SetObjectArrayElement(JNIEnv *env,
 
 
 jbooleanArray NewBooleanArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-  
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+  
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfBool->doNew(len, vm);
@@ -3057,12 +3193,11 @@ jbooleanArray NewBooleanArray(JNIEnv *en
 
 
 jbyteArray NewByteArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-  
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
 
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfByte->doNew(len, vm);
@@ -3075,12 +3210,11 @@ jbyteArray NewByteArray(JNIEnv *env, jsi
 
 
 jcharArray NewCharArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfChar->doNew(len, vm);
@@ -3093,12 +3227,11 @@ jcharArray NewCharArray(JNIEnv *env, jsi
 
 
 jshortArray NewShortArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfShort->doNew(len, vm);
@@ -3111,12 +3244,11 @@ jshortArray NewShortArray(JNIEnv *env, j
 
 
 jintArray NewIntArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfInt->doNew(len, vm);
@@ -3129,12 +3261,11 @@ jintArray NewIntArray(JNIEnv *env, jsize
 
 
 jlongArray NewLongArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfLong->doNew(len, vm);
@@ -3147,12 +3278,11 @@ jlongArray NewLongArray(JNIEnv *env, jsi
 
 
 jfloatArray NewFloatArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfFloat->doNew(len, vm);
@@ -3165,12 +3295,11 @@ jfloatArray NewFloatArray(JNIEnv *env, j
 
 
 jdoubleArray NewDoubleArray(JNIEnv *env, jsize len) {
-  
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   res = vm->upcalls->ArrayOfDouble->doNew(len, vm);
@@ -3184,12 +3313,13 @@ jdoubleArray NewDoubleArray(JNIEnv *env,
 
 jboolean* GetBooleanArrayElements(JNIEnv *env, jbooleanArray _array,
 				                          jboolean *isCopy) {
+  ArrayUInt8* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
  
   // Local object references.
-  ArrayUInt8* array = *(ArrayUInt8**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayUInt8**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3205,12 +3335,13 @@ jboolean* GetBooleanArrayElements(JNIEnv
 
 
 jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray _array, jboolean *isCopy) {
+  ArraySInt8* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  ArraySInt8* array = *(ArraySInt8**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt8**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3226,12 +3357,13 @@ jbyte *GetByteArrayElements(JNIEnv *env,
 
 
 jchar *GetCharArrayElements(JNIEnv *env, jcharArray _array, jboolean *isCopy) {
+  ArrayUInt16* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArrayUInt16* array = *(ArrayUInt16**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayUInt16**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3248,12 +3380,13 @@ jchar *GetCharArrayElements(JNIEnv *env,
 
 jshort *GetShortArrayElements(JNIEnv *env, jshortArray _array,
                               jboolean *isCopy) {
+  ArraySInt16* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArraySInt16* array = *(ArraySInt16**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt16**)_array;
   
   if (isCopy) (*isCopy) = true;
 
@@ -3269,12 +3402,13 @@ jshort *GetShortArrayElements(JNIEnv *en
 
 
 jint *GetIntArrayElements(JNIEnv *env, jintArray _array, jboolean *isCopy) {
+  ArraySInt32* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArraySInt32* array = *(ArraySInt32**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt32**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3290,12 +3424,13 @@ jint *GetIntArrayElements(JNIEnv *env, j
 
 
 jlong *GetLongArrayElements(JNIEnv *env, jlongArray _array, jboolean *isCopy) {
+  ArrayLong* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArrayLong* array = *(ArrayLong**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayLong**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3312,12 +3447,13 @@ jlong *GetLongArrayElements(JNIEnv *env,
 
 jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray _array,
                               jboolean *isCopy) {
+  ArrayFloat* array = 0;
+  llvm_gcroot(array, 0);
 
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArrayFloat* array = *(ArrayFloat**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayFloat**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3334,12 +3470,13 @@ jfloat *GetFloatArrayElements(JNIEnv *en
 
 jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray _array,
 				jboolean *isCopy) {
+  ArrayDouble* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
   
   // Local object references.
-  ArrayDouble* array = *(ArrayDouble**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayDouble**)_array;
   
   if (isCopy) (*isCopy) = true;
 
@@ -3356,11 +3493,12 @@ jdouble *GetDoubleArrayElements(JNIEnv *
 
 void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray _array,
 				 jboolean *elems, jint mode) {
+  ArrayUInt8* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayUInt8* array = *(ArrayUInt8**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayUInt8**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3379,11 +3517,12 @@ void ReleaseBooleanArrayElements(JNIEnv
 
 void ReleaseByteArrayElements(JNIEnv *env, jbyteArray _array, jbyte *elems,
 			      jint mode) {
+  ArraySInt16* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
 
-  ArraySInt16* array = *(ArraySInt16**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt16**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3402,11 +3541,12 @@ void ReleaseByteArrayElements(JNIEnv *en
 
 void ReleaseCharArrayElements(JNIEnv *env, jcharArray _array, jchar *elems,
 			      jint mode) {
+  ArrayUInt16* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
 
-  ArrayUInt16* array = *(ArrayUInt16**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayUInt16**)_array;
 
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3425,11 +3565,12 @@ void ReleaseCharArrayElements(JNIEnv *en
 
 void ReleaseShortArrayElements(JNIEnv *env, jshortArray _array, jshort *elems,
 			       jint mode) {
+  ArraySInt16* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
 
-  ArraySInt16* array = *(ArraySInt16**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt16**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3448,11 +3589,12 @@ void ReleaseShortArrayElements(JNIEnv *e
 
 void ReleaseIntArrayElements(JNIEnv *env, jintArray _array, jint *elems,
 			     jint mode) {
+  ArraySInt32* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
     
-  ArraySInt32* array = *(ArraySInt32**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArraySInt32**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3471,11 +3613,12 @@ void ReleaseIntArrayElements(JNIEnv *env
 
 void ReleaseLongArrayElements(JNIEnv *env, jlongArray _array, jlong *elems,
 			      jint mode) {
+  ArrayLong* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
     
-  ArrayLong* array = *(ArrayLong**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayLong**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3494,10 +3637,12 @@ void ReleaseLongArrayElements(JNIEnv *en
 
 void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray _array, jfloat *elems,
 			       jint mode) {
+  ArrayFloat* array = 0;
+  llvm_gcroot(array, 0);
+
   BEGIN_JNI_EXCEPTION
     
-  ArrayFloat* array = *(ArrayFloat**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayFloat**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3516,11 +3661,12 @@ void ReleaseFloatArrayElements(JNIEnv *e
 
 void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray _array,
 				jdouble *elems, jint mode) {
+  ArrayDouble* array = 0;
+  llvm_gcroot(array, 0);
   
   BEGIN_JNI_EXCEPTION
     
-  ArrayDouble* array = *(ArrayDouble**)_array;
-  llvm_gcroot(array, 0);
+  array = *(ArrayDouble**)_array;
   
   if (mode == JNI_ABORT) {
     free(elems);
@@ -3539,10 +3685,12 @@ void ReleaseDoubleArrayElements(JNIEnv *
 
 void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 			   jsize len, jboolean *buf) {
+  ArrayUInt8* Array = 0;
+  llvm_gcroot(Array, 0);
+
   BEGIN_JNI_EXCEPTION
   
-  ArrayUInt8* Array = *(ArrayUInt8**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayUInt8**)array;
   memcpy(buf, ArrayUInt8::getElements(Array) + start, len * sizeof(uint8));
   
   END_JNI_EXCEPTION
@@ -3553,11 +3701,12 @@ void GetBooleanArrayRegion(JNIEnv *env,
 
 void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 			jbyte *buf) {
+  ArraySInt8* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt8* Array = *(ArraySInt8**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt8**)array;
   memcpy(buf, ArraySInt8::getElements(Array) + start, len * sizeof(uint8));
   
   END_JNI_EXCEPTION
@@ -3568,11 +3717,12 @@ void GetByteArrayRegion(JNIEnv *env, jby
 
 void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
 			jchar *buf) {
+  ArrayUInt16* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayUInt16* Array = *(ArrayUInt16**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayUInt16**)array;
   memcpy(buf, ArrayUInt16::getElements(Array) + start, len * sizeof(uint16));
   
   END_JNI_EXCEPTION
@@ -3583,11 +3733,12 @@ void GetCharArrayRegion(JNIEnv *env, jch
 
 void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 			 jsize len, jshort *buf) {
+  ArraySInt16* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt16* Array = *(ArraySInt16**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt16**)array;
   memcpy(buf, ArraySInt16::getElements(Array) + start, len * sizeof(sint16));
   
   END_JNI_EXCEPTION
@@ -3598,11 +3749,12 @@ void GetShortArrayRegion(JNIEnv *env, js
 
 void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
 		       jint *buf) {
+  ArraySInt32* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt32* Array = *(ArraySInt32**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt32**)array;
   memcpy(buf, ArraySInt32::getElements(Array) + start, len * sizeof(sint32));
   
   END_JNI_EXCEPTION
@@ -3613,11 +3765,12 @@ void GetIntArrayRegion(JNIEnv *env, jint
 
 void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
 		        jlong *buf) {
+  ArrayLong* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayLong* Array = *(ArrayLong**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayLong**)array;
   memcpy(buf, ArrayLong::getElements(Array) + start, len * sizeof(sint64));
   
   END_JNI_EXCEPTION
@@ -3628,11 +3781,12 @@ void GetLongArrayRegion(JNIEnv *env, jlo
 
 void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
 			 jsize len, jfloat *buf) {
+  ArrayFloat* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayFloat* Array = *(ArrayFloat**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayFloat**)array;
   memcpy(buf, ArrayFloat::getElements(Array) + start, len * sizeof(float));
   
   END_JNI_EXCEPTION
@@ -3643,11 +3797,12 @@ void GetFloatArrayRegion(JNIEnv *env, jf
 
 void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 			  jsize len, jdouble *buf) {
+  ArrayDouble* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayDouble* Array = *(ArrayDouble**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayDouble**)array;
   memcpy(buf, ArrayDouble::getElements(Array) + start, len * sizeof(double));
   
   END_JNI_EXCEPTION
@@ -3658,11 +3813,12 @@ void GetDoubleArrayRegion(JNIEnv *env, j
 
 void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 			   jsize len, const jboolean *buf) {
+  ArrayUInt8* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayUInt8* Array = *(ArrayUInt8**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayUInt8**)array;
   memcpy(ArrayUInt8::getElements(Array) + start, buf, len * sizeof(uint8));
   
   END_JNI_EXCEPTION
@@ -3673,11 +3829,12 @@ void SetBooleanArrayRegion(JNIEnv *env,
 
 void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 			                  const jbyte *buf) {
+  ArraySInt8* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt8* Array = *(ArraySInt8**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt8**)array;
   memcpy(ArraySInt8::getElements(Array) + start, buf, len * sizeof(sint8));
   
   END_JNI_EXCEPTION
@@ -3688,11 +3845,12 @@ void SetByteArrayRegion(JNIEnv *env, jby
 
 void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
 			                  const jchar *buf) {
+  ArrayUInt16* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayUInt16* Array = *(ArrayUInt16**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayUInt16**)array;
   memcpy(ArrayUInt16::getElements(Array) + start, buf, len * sizeof(uint16));
   
   END_JNI_EXCEPTION
@@ -3703,11 +3861,12 @@ void SetCharArrayRegion(JNIEnv *env, jch
 
 void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 			                   jsize len, const jshort *buf) {
+  ArraySInt16* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt16* Array = *(ArraySInt16**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt16**)array;
   memcpy(ArraySInt16::getElements(Array) + start, buf, len * sizeof(sint16));
   
   END_JNI_EXCEPTION
@@ -3718,11 +3877,12 @@ void SetShortArrayRegion(JNIEnv *env, js
 
 void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
 		                   const jint *buf) {
+  ArraySInt32* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArraySInt32* Array = *(ArraySInt32**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArraySInt32**)array;
   memcpy(ArraySInt32::getElements(Array) + start, buf, len * sizeof(sint32));
   
   END_JNI_EXCEPTION
@@ -3733,11 +3893,12 @@ void SetIntArrayRegion(JNIEnv *env, jint
 
 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len,
 			                  const jlong *buf) {
+  ArrayLong* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayLong* Array = *(ArrayLong**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayLong**)array;
   memcpy(ArrayLong::getElements(Array) + start, buf, len * sizeof(sint64));
   
   END_JNI_EXCEPTION
@@ -3748,11 +3909,12 @@ void SetLongArrayRegion(JNIEnv* env, jlo
 
 void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
 			                   jsize len, const jfloat *buf) {
+  ArrayFloat* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayFloat* Array = *(ArrayFloat**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayFloat**)array;
   memcpy(ArrayFloat::getElements(Array) + start, buf, len * sizeof(float));
   
   END_JNI_EXCEPTION
@@ -3763,11 +3925,12 @@ void SetFloatArrayRegion(JNIEnv *env, jf
 
 void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 			                    jsize len, const jdouble *buf) {
+  ArrayDouble* Array = 0;
+  llvm_gcroot(Array, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  ArrayDouble* Array = *(ArrayDouble**)array;
-  llvm_gcroot(Array, 0);
+  Array = *(ArrayDouble**)array;
   memcpy(ArrayDouble::getElements(Array) + start, buf, len * sizeof(double));
   
   END_JNI_EXCEPTION
@@ -3778,10 +3941,11 @@ void SetDoubleArrayRegion(JNIEnv *env, j
 
 jint RegisterNatives(JNIEnv *env, jclass _clazz, const JNINativeMethod *methods,
 		     jint nMethods) {
-  BEGIN_JNI_EXCEPTION
-
   JavaObject * clazz = 0;
   llvm_gcroot(clazz, 0);
+
+  BEGIN_JNI_EXCEPTION
+
   clazz = *(JavaObject**)_clazz;
 
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -3822,11 +3986,12 @@ jint UnregisterNatives(JNIEnv *env, jcla
 }
 
 jint MonitorEnter(JNIEnv *env, jobject _obj) {
+  JavaObject* Obj = 0;
+  llvm_gcroot(Obj, 0);
   
   BEGIN_JNI_EXCEPTION
   
-  JavaObject* Obj = *(JavaObject**)_obj;
-  llvm_gcroot(Obj, 0);
+  Obj = *(JavaObject**)_obj;
   
   if (Obj != NULL) {
     JavaObject::acquire(Obj);
@@ -3842,11 +4007,12 @@ jint MonitorEnter(JNIEnv *env, jobject _
 
 
 jint MonitorExit(JNIEnv *env, jobject _obj) {
+  JavaObject* Obj = 0;
+  llvm_gcroot(Obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
-  JavaObject* Obj = *(JavaObject**)_obj;
-  llvm_gcroot(Obj, 0);
+  Obj = *(JavaObject**)_obj;
  
   if (Obj != NULL) {
 
@@ -3878,10 +4044,12 @@ jint GetJavaVM(JNIEnv *env, JavaVM **vm)
 
 void GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                      jchar *buf) {
+  JavaString * s = 0;
+  llvm_gcroot(s, 0);
+
   BEGIN_JNI_EXCEPTION
 
-  JavaString * s = *(JavaString**)str;
-  llvm_gcroot(s, 0);
+  s = *(JavaString**)str;
   UserClass * cl = JavaObject::getClass(s)->asClass();
   const UTF8 * utf = JavaString::javaToInternal(s, cl->classLoader->hashUTF8);
 
@@ -3906,10 +4074,12 @@ void GetStringRegion(JNIEnv* env, jstrin
 
 void GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                         char *buf) {
+  JavaString * s = 0;
+  llvm_gcroot(s, 0);
+
   BEGIN_JNI_EXCEPTION
 
-  JavaString * s = *(JavaString**)str;
-  llvm_gcroot(s, 0);
+  s = *(JavaString**)str;
 
   int end = start+len;
   if (end > s->count) {
@@ -3927,10 +4097,12 @@ void GetStringUTFRegion(JNIEnv* env, jst
 
 
 void *GetPrimitiveArrayCritical(JNIEnv *env, jarray _array, jboolean *isCopy) {
+  JavaObject* array = 0;
+  llvm_gcroot(array, 0);
+
   BEGIN_JNI_EXCEPTION
   
-  JavaObject* array = *(JavaObject**)_array;
-  llvm_gcroot(array, 0);
+  array = *(JavaObject**)_array;
 
   if (isCopy) (*isCopy) = true;
 
@@ -3949,11 +4121,12 @@ void *GetPrimitiveArrayCritical(JNIEnv *
 
 void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray _array, void *carray,
 				   jint mode) {
-  
+  JavaObject* array = 0;
+  llvm_gcroot(array, 0);
+
   BEGIN_JNI_EXCEPTION
   
-  JavaObject* array = *(JavaObject**)_array;
-  llvm_gcroot(array, 0);
+  array = *(JavaObject**)_array;
 
   if (mode == JNI_ABORT) {
     free(carray);
@@ -3999,16 +4172,14 @@ void DeleteWeakGlobalRef(JNIEnv* env, jw
 
 
 jobject NewGlobalRef(JNIEnv* env, jobject obj) {
-  
-  BEGIN_JNI_EXCEPTION
-    
   JavaObject* Obj = NULL;
   llvm_gcroot(Obj, 0);
   
+  BEGIN_JNI_EXCEPTION
+    
   // Local object references.
   if (obj) {
     Obj = *(JavaObject**)obj;
-    llvm_gcroot(Obj, 0);
 
     Jnjvm* vm = JavaThread::get()->getJVM();
 
@@ -4094,12 +4265,13 @@ jint DetachCurrentThread(JavaVM *vm) {
 
 
 jint GetEnv(JavaVM *vm, void **env, jint version) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
 
   BEGIN_JNI_EXCEPTION
 
   JavaThread* _th = JavaThread::get();
-  JavaObject* obj = _th->currentThread();
-  llvm_gcroot(obj, 0);
+  obj = _th->currentThread();
 
   Jnjvm* myvm = _th->getJVM();
   if (obj != 0) {

Modified: vmkit/trunk/lib/j3/VMCore/JniClasspath.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JniClasspath.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JniClasspath.inc (original)
+++ vmkit/trunk/lib/j3/VMCore/JniClasspath.inc Thu Apr 25 12:05:01 2013
@@ -1,13 +1,14 @@
 // GNUClasspath-specific JNI implementation
 
 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) {
-
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = 0;
   JavaObject* p = 0;
+  jobject ret = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(p, 0);
+  llvm_gcroot(ret, 0);
+
+  BEGIN_JNI_EXCEPTION
 
   JavaThread* th = JavaThread::get();
   Jnjvm* myvm = th->getJVM();
@@ -29,7 +30,7 @@ jobject NewDirectByteBuffer(JNIEnv *env,
                                                         (uint32)capacity,
                                                         (uint32)capacity, 0);
 
-  jobject ret = (jobject)th->pushJNIRef(res);
+  ret = (jobject)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
   END_JNI_EXCEPTION
 
@@ -38,14 +39,15 @@ jobject NewDirectByteBuffer(JNIEnv *env,
 
 
 void *GetDirectBufferAddress(JNIEnv *env, jobject _buf) {
+  JavaObject* buf = 0;
+  JavaObject* address = 0;
+  llvm_gcroot(buf, 0);
+  llvm_gcroot(address, 0);
 
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* buf = *(JavaObject**)_buf;
-  JavaObject* address = 0;
-  llvm_gcroot(buf, 0);
-  llvm_gcroot(address, 0);
+  buf = *(JavaObject**)_buf;
 
   Jnjvm* vm = myVM(env);
   address = vm->upcalls->bufferAddress->getInstanceObjectField(buf);

Modified: vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc Thu Apr 25 12:05:01 2013
@@ -1,11 +1,11 @@
 // OpenJDK-specific JNI implementation
 
 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) {
-  BEGIN_JNI_EXCEPTION
-
   JavaObject* res = 0;
   llvm_gcroot(res, 0);
 
+  BEGIN_JNI_EXCEPTION
+
   JavaThread* th = JavaThread::get();
   Jnjvm* myvm = th->getJVM();
   UserClass* BB = myvm->upcalls->newDirectByteBuffer;
@@ -23,11 +23,13 @@ jobject NewDirectByteBuffer(JNIEnv *env,
 }
 
 void *GetDirectBufferAddress(JNIEnv *env, jobject _buf) {
+  JavaObject* buf = 0;
+  llvm_gcroot(buf, 0);
+
   BEGIN_JNI_EXCEPTION
 
   // Local object references.
-  JavaObject* buf = *(JavaObject**)_buf;
-  llvm_gcroot(buf, 0);
+  buf = *(JavaObject**)_buf;
   jlong address;
 
   Jnjvm* vm = myVM(env);

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Thu Apr 25 12:05:01 2013
@@ -355,10 +355,10 @@ JavaObject* Jnjvm::CreateOutOfMemoryErro
 
 JavaObject* Jnjvm::CreateStackOverflowError() {
   // Don't call init, or else we'll get a new stack overflow error.
-  JavaObject* obj = NULL;
+  JavaObjectThrowable* obj = NULL;
   llvm_gcroot(obj, 0);
-  obj = upcalls->StackOverflowError->doNew(this);
-  JavaObjectThrowable::fillInStackTrace((JavaObjectThrowable*)obj);
+  obj = (JavaObjectThrowable*)upcalls->StackOverflowError->doNew(this);
+  JavaObjectThrowable::fillInStackTrace(obj);
   return obj;
 }
 
@@ -1282,7 +1282,8 @@ void Jnjvm::mainJavaStart(JavaThread* th
     UserClassArray* array = vm->bootstrapLoader->upcalls->ArrayOfString;
     args = (ArrayObject*)array->doNew(info.argc - 2, vm);
     for (int i = 2; i < info.argc; ++i) {
-      ArrayObject::setElement(args, (JavaObject*)vm->asciizToStr(info.argv[i]), i - 2);
+      str = vm->asciizToStr(info.argv[i]);
+      ArrayObject::setElement(args, str, i - 2);
     }
 
     vm->executeClass(info.className, args);
@@ -1399,7 +1400,7 @@ void Jnjvm::setType(gc* header, void* ty
 	JavaObject* src = 0;
 	llvm_gcroot(src, 0);
 	llvm_gcroot(header, 0);
-	src = (JavaObject*) header;
+	src = (JavaObject*)header;
 	src->setVirtualTable((JavaVirtualTable*)type);
 }
 
@@ -1407,14 +1408,16 @@ void* Jnjvm::getType(gc* header) {
 	JavaObject* src = 0;
 	llvm_gcroot(src, 0);
 	llvm_gcroot(header, 0);
-	src = (JavaObject*) header;
+	src = (JavaObject*)header;
 	return src->getVirtualTable();
 }
 
 // This method is called during GC so no llvm_gcroot needed.
 void Jnjvm::traceObject(gc* _obj, word_t closure) {
-	JavaObject* obj = 0;
-	obj = (JavaObject*)_obj;
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(_obj, 0);
+  obj = (JavaObject*)_obj;
   assert(obj && "No object to trace");
   assert(obj->getVirtualTable() && "No virtual table");
   assert(obj->getVirtualTable()->tracer && "No tracer in VT");
@@ -1423,7 +1426,11 @@ void Jnjvm::traceObject(gc* _obj, word_t
 
 // This method is called during GC so no llvm_gcroot needed.
 bool Jnjvm::isCorruptedType(gc* obj) {
-	return ((JavaObject*)obj)->getVirtualTable();
+	JavaObject* _obj = 0;
+	llvm_gcroot(_obj, 0);
+	llvm_gcroot(obj, 0);
+	_obj = (JavaObject*)obj;
+	return _obj->getVirtualTable();
 }
 
 size_t Jnjvm::getObjectSize(gc* object) {
@@ -1431,7 +1438,10 @@ size_t Jnjvm::getObjectSize(gc* object)
   // llvm_gcroot. For clarity, it may be useful to have a special type
   // in this case.
   size_t size = 0;
-  JavaObject* src = (JavaObject*)object;
+  JavaObject* src = 0;
+  llvm_gcroot(object, 0);
+  llvm_gcroot(src, 0);
+  src = (JavaObject*)object;
   if (VMClassLoader::isVMClassLoader(src)) {
     size = sizeof(VMClassLoader);
   } else if (VMStaticInstance::isVMStaticInstance(src)) {
@@ -1455,7 +1465,10 @@ size_t Jnjvm::getObjectSize(gc* object)
 }
 
 const char* Jnjvm::getObjectTypeName(gc* object) {
-  JavaObject* src = (JavaObject*)object;
+  JavaObject* src = 0;
+  llvm_gcroot(object, 0);
+  llvm_gcroot(src, 0);
+  src = (JavaObject*)object;
   if (VMClassLoader::isVMClassLoader(src)) {
     return "VMClassLoader";
   } else if (VMStaticInstance::isVMStaticInstance(src)) {

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 12:05:01 2013
@@ -337,9 +337,11 @@ UserClass* JnjvmBootstrapLoader::interna
 
 UserCommonClass* JnjvmClassLoader::internalLoadCreateClass(const UTF8* name, JavaString* strName)
 {
+  JavaObjectClass* jcl = 0;
   JavaObject* obj = 0;
   llvm_gcroot(strName, 0);
   llvm_gcroot(obj, 0);
+  llvm_gcroot(jcl, 0);
 
   UserClass* forCtp = loadClass;
   if (strName == NULL) {
@@ -347,7 +349,7 @@ UserCommonClass* JnjvmClassLoader::inter
   }
 
   obj = loadClassMethod->invokeJavaObjectVirtual(vm, forCtp, javaLoader, &strName);
-  return JavaObjectClass::getClass(((JavaObjectClass*)obj));
+  return JavaObjectClass::getClass(jcl = (JavaObjectClass*)obj);
 }
 
 UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve,

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 12:05:01 2013
@@ -27,9 +27,15 @@ void Jnjvm::resetReferencesToBundle(int6
 
 void Jnjvm::resetReferenceIfStale(const void* source, void** ref)
 {
+	JavaObject *src = NULL;
+	llvm_gcroot(src, 0);
+
 	if (!ref || !(*ref)) return;	// Invalid or null reference
-	const JavaObject* src = reinterpret_cast<const JavaObject*>(source);
-	JavaObject** objRef = reinterpret_cast<JavaObject**>(ref);
+
+	src = const_cast<JavaObject*>(reinterpret_cast<const JavaObject*>(source));
+	JavaObject **objRef = reinterpret_cast<JavaObject**>(ref);
+
+	return;
 
 	// Check the type of Java object. Some Java objects are not real object, but
 	// are bridges between Java and the VM objects.
@@ -43,6 +49,8 @@ void Jnjvm::resetReferenceIfStale(const
 
 void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMClassLoader** ref)
 {
+	llvm_gcroot(source, 0);
+
 	// Don't touch fake Java objects that exist only as bridges between the
 	// Java object model and the C++ object model.
 
@@ -60,6 +68,8 @@ void Jnjvm::resetReferenceIfStale(const
 
 void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMStaticInstance** ref)
 {
+	llvm_gcroot(source, 0);
+
 	// Don't touch fake Java objects that exist only as bridges between the
 	// Java object model and the C++ object model.
 
@@ -77,6 +87,8 @@ void Jnjvm::resetReferenceIfStale(const
 
 void Jnjvm::resetReferenceIfStale(const JavaObject *source, JavaObject** ref)
 {
+	llvm_gcroot(source, 0);
+
 #if DEBUG_VERBOSE_STALE_REF
 
 	if (source) {

Modified: vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp Thu Apr 25 12:05:01 2013
@@ -80,10 +80,12 @@ VirtualTable VMStaticInstance::VT((word_
 
 /// Scanning java.lang.Object and primitive arrays.
 extern "C" void JavaObjectTracer(JavaObject* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
 }
 
 /// Method for scanning regular objects.
 extern "C" void RegularObjectTracer(JavaObject* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   Class* cl = JavaObject::getClass(obj)->asClass();
   assert(cl && "Not a class in regular tracer");
   vmkit::Collector::markAndTraceRoot(obj,
@@ -104,6 +106,9 @@ extern "C" void RegularObjectTracer(Java
 /// Method for scanning an array whose elements are JavaObjects. This method is
 /// called for all non-native Java arrays.
 extern "C" void ArrayObjectTracer(ArrayObject* obj, word_t closure) {
+  JavaObject* elt = 0;
+  llvm_gcroot(elt, 0);
+  llvm_gcroot(obj, 0);
   CommonClass* cl = JavaObject::getClass(obj);
   assert(cl && "No class");
   vmkit::Collector::markAndTraceRoot(obj,
@@ -111,7 +116,8 @@ extern "C" void ArrayObjectTracer(ArrayO
   
 
   for (sint32 i = 0; i < ArrayObject::getSize(obj); i++) {
-    if (ArrayObject::getElement(obj, i) != NULL) {
+    elt = ArrayObject::getElement(obj, i);
+    if (elt != NULL) {
       vmkit::Collector::markAndTrace(
           obj, ArrayObject::getElements(obj) + i, closure);
     }
@@ -121,6 +127,7 @@ extern "C" void ArrayObjectTracer(ArrayO
 /// Method for scanning Java java.lang.ref.Reference objects.
 extern "C" void ReferenceObjectTracer(
     JavaObjectReference* obj, word_t closure) {
+  llvm_gcroot(obj, 0);
   Class* cl = JavaObject::getClass(obj)->asClass();
   assert(cl && "Not a class in reference tracer");
   vmkit::Collector::markAndTraceRoot(obj,

Modified: vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Apr 25 12:05:01 2013
@@ -91,6 +91,8 @@ FatLock* ThinLock::changeToFatlock(gc* o
 }
 
 void printDebugMessage(gc* object, LockSystem& table) {
+  gc* assObj = NULL;
+  llvm_gcroot(assObj, 0);
   llvm_gcroot(object, 0);
   fprintf(stderr,
       "WARNING: [%p] has been waiting really long for %p (header = %p)\n",
@@ -104,7 +106,7 @@ void printDebugMessage(gc* object, LockS
         "Its associated object is %p. The owner is %p\n",
         (void*)vmkit::Thread::get(),
         (void*)obj,
-        (void*)obj->getAssociatedObject(),
+        (void*)(assObj = obj->getAssociatedObject()),
         (void*)obj->owner());
   }
 }
@@ -265,8 +267,8 @@ FatLock* ThinLock::getFatLock(gc* object
 }
 
 void FatLock::acquireAll(gc* object, word_t nb) {
-  assert(associatedObject == object);
   llvm_gcroot(object, 0);
+  assert(associatedObject == object);
   internalLock.lockAll(nb);
 }
 

Modified: vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp (original)
+++ vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp Thu Apr 25 12:05:01 2013
@@ -20,7 +20,8 @@ std::set<gc*> __InternalSet__;
 int Collector::verbose = 0;
 
 extern "C" void* prealloc(uint32_t sz) {
-	gc* res = 0;
+  gc* res = 0;
+  llvm_gcroot(res, 0);
   gcHeader* head = 0;
 
   sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
@@ -36,11 +37,13 @@ extern "C" void* prealloc(uint32_t sz) {
 }
 
 extern "C" void postalloc(gc* obj, void* type, uint32_t size) {
+	llvm_gcroot(obj, 0);
 	vmkit::Thread::get()->MyVM->setType(obj, type);
 }
 
 extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) {
   gc* res = 0;
+  llvm_gcroot(res, 0);
   sz += gcHeader::hiddenHeaderSize();
   res = (gc*) prealloc(sz);
   postalloc(res, type, sz);
@@ -48,7 +51,9 @@ extern "C" void* vmkitgcmalloc(uint32_t
 }
 
 extern "C" void* vmkitgcmallocUnresolved(uint32_t sz, void* type) {
-	gc* res = (gc*)vmkitgcmalloc(sz, type);
+	gc* res = NULL;
+	llvm_gcroot(res, 0);
+	res = (gc*)vmkitgcmalloc(sz, type);
 	vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
 	return res;
 }
@@ -59,6 +64,7 @@ extern "C" void* vmkitgcmallocUnresolved
 
 extern "C" void* VTgcmalloc(uint32_t sz, VirtualTable* VT) {
   gc* res = 0;
+  llvm_gcroot(res, 0);
   gcHeader* head = 0;
   sz += gcHeader::hiddenHeaderSize();
   sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
@@ -75,7 +81,9 @@ extern "C" void* VTgcmalloc(uint32_t sz,
 }
 
 extern "C" void* VTgcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
-	gc* res = (gc*)VTgcmalloc(sz, VT);
+	gc* res = NULL;
+	llvm_gcroot(res, 0);
+	res = (gc*)VTgcmalloc(sz, VT);
 	if (VT->hasDestructor())
 		vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
 	return res;
@@ -85,21 +93,24 @@ extern "C" void* VTgcmallocUnresolved(ui
 
 // Do not insert MagicArray ref to InternalSet of references.
 extern "C" void* AllocateMagicArray(int32_t sz, void* length) {
+	gc* res = 0;
+	llvm_gcroot(res, 0);
 	gcHeader* head = 0;
-  gc* res = 0;
 	sz += gcHeader::hiddenHeaderSize();
 	head = (gcHeader*)malloc(sz);
 	memset((void*)head, 0, sz);
 	res = head->toReference();
 	vmkit::Thread::get()->MyVM->setType(res, length);
-  return res;
+	return res;
 }
 
 extern "C" void addFinalizationCandidate(gc* obj) {
+  llvm_gcroot(obj, 0);
   vmkit::Thread::get()->MyVM->addFinalizationCandidate(obj);
 }
 
 void* Collector::begOf(gc* obj) {
+  llvm_gcroot(obj, 0);
   lock.acquire();
   std::set<gc*>::iterator I = __InternalSet__.find(obj);
   std::set<gc*>::iterator E = __InternalSet__.end();
@@ -170,19 +181,29 @@ extern "C" void nonHeapWriteBarrier(void
 
 
 void Collector::objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   *slot = value;
 }
 
 void Collector::objectReferenceArrayWriteBarrier(gc* ref, gc** slot, gc* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   *slot = value;
 }
 
 void Collector::objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) {
+  llvm_gcroot(value, 0);
   *slot = value;
 }
 
 bool Collector::objectReferenceTryCASBarrier(gc*ref, gc** slot, gc* old, gc* value) {
-  gc* res = __sync_val_compare_and_swap(slot, old, value);
+  gc* res = NULL;
+  llvm_gcroot(res, 0);
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(old, 0);
+  llvm_gcroot(value, 0);
+  res = __sync_val_compare_and_swap(slot, old, value);
   return (old == res);
 }
 

Modified: vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h (original)
+++ vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h Thu Apr 25 12:05:01 2013
@@ -147,12 +147,14 @@ class VirtualTable {
   /// getVirtualTable - Returns the virtual table of this reference.
   ///
   static const VirtualTable* getVirtualTable(gc* ref) {
+    llvm_gcroot(ref, 0);
     return ((VirtualTable**)(ref))[0];
   }
 
   /// setVirtualTable - Sets the virtual table of this reference.
   ///
   static void setVirtualTable(gc* ref, VirtualTable* VT) {
+    llvm_gcroot(ref, 0);
     ((VirtualTable**)(ref))[0] = VT;
   }
 

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Thu Apr 25 12:05:01 2013
@@ -82,7 +82,8 @@ extern "C" void* vmkitgcmalloc(uint32_t
 }
 */
 extern "C" void* prealloc(uint32_t size) {
-	gc* res = 0;
+  gc* res = 0;
+  llvm_gcroot(res, 0);
   gcHeader* head = 0;
   llvm_gcroot(res, 0);
   size = llvm::RoundUpToAlignment(size, sizeof(void*));
@@ -92,13 +93,14 @@ extern "C" void* prealloc(uint32_t size)
 }
 
 extern "C" void postalloc(gc* obj, void* type, uint32_t size) {
+	llvm_gcroot(obj, 0);
 	vmkit::Thread::get()->MyVM->setType(obj, type);
 	JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(obj, type, size);
 }
 
 extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) {
-  gc* res = 0;
-  llvm_gcroot(res, 0);
+	gc* res = 0;
+	llvm_gcroot(res, 0);
 	sz += gcHeader::hiddenHeaderSize();
 	sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
 	res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_vmkitgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, type))->toReference();
@@ -118,8 +120,8 @@ extern "C" void* vmkitgcmallocUnresolved
  *****************************************************************************/
 
 extern "C" void* VTgcmalloc(uint32_t sz, VirtualTable* VT) {
-  gc* res = 0;
-  llvm_gcroot(res, 0);
+	gc* res = 0;
+	llvm_gcroot(res, 0);
 	sz += gcHeader::hiddenHeaderSize();
 	sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
 	res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_VTgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, VT))->toReference();
@@ -142,18 +144,23 @@ extern "C" void addFinalizationCandidate
 }
 
 extern "C" void arrayWriteBarrier(void* ref, void** ptr, void* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   JnJVM_org_j3_bindings_Bindings_arrayWriteBarrier__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2(
       (gc*)ref, (gc**)ptr, (gc*)value);
   if (vmkit::Thread::get()->doYield) vmkit::Collector::collect();
 }
 
 extern "C" void fieldWriteBarrier(void* ref, void** ptr, void* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   JnJVM_org_j3_bindings_Bindings_fieldWriteBarrier__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2(
       (gc*)ref, (gc**)ptr, (gc*)value);
   if (vmkit::Thread::get()->doYield) vmkit::Collector::collect();
 }
 
 extern "C" void nonHeapWriteBarrier(void** ptr, void* value) {
+  llvm_gcroot(value, 0);
   JnJVM_org_j3_bindings_Bindings_nonHeapWriteBarrier__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2((gc**)ptr, (gc*)value);
   if (vmkit::Thread::get()->doYield) vmkit::Collector::collect();
 }
@@ -169,6 +176,7 @@ void MutatorThread::init(Thread* _th) {
 }
 
 bool Collector::isLive(gc* ptr, word_t closure) {
+  llvm_gcroot(ptr, 0);
   return JnJVM_org_j3_bindings_Bindings_isLive__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, ptr);
 }
 
@@ -176,43 +184,62 @@ void Collector::scanObject(void** ptr, w
   if ((*ptr) != NULL) {
     assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr)));
   }
+#if RESET_STALE_REFERENCES
+  // Allow the VM to reset references if needed
+  vmkit::Thread::get()->MyVM->resetReferenceIfStale(NULL, ptr);
+#endif
   JnJVM_org_j3_bindings_Bindings_reportDelayedRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2(closure, ptr);
 }
  
 void Collector::markAndTrace(void* source, void* ptr, word_t closure) {
-  void** ptr_ = (void**)ptr;
-  if ((*ptr_) != NULL) {
-    assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr_)));
-  }
-  if ((*(void**)ptr) != NULL) assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*(void**)ptr)));
-  JnJVM_org_j3_bindings_Bindings_processEdge__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr);
+	llvm_gcroot(source, 0);
+	void** ptr_ = (void**)ptr;
+	if ((*ptr_) != NULL) {
+		assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr_)));
+	}
+	if ((*(void**)ptr) != NULL) assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*(void**)ptr)));
+#if RESET_STALE_REFERENCES
+	// Allow the VM to reset references if needed
+	vmkit::Thread::get()->MyVM->resetReferenceIfStale(source, ptr_);
+#endif
+	JnJVM_org_j3_bindings_Bindings_processEdge__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr);
 }
   
-void Collector::markAndTraceRoot(void* ptr, word_t closure) {
+void Collector::markAndTraceRoot(void* source, void* ptr, word_t closure) {
+  llvm_gcroot(source, 0);
   void** ptr_ = (void**)ptr;
   if ((*ptr_) != NULL) {
     assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr_)));
   }
+#if RESET_STALE_REFERENCES
+  // Allow the VM to reset references if needed
+  vmkit::Thread::get()->MyVM->resetReferenceIfStale(source, ptr_);
+#endif
   JnJVM_org_j3_bindings_Bindings_processRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2Z(closure, ptr, true);
 }
 
 gc* Collector::retainForFinalize(gc* val, word_t closure) {
+  llvm_gcroot(val, 0);
   return JnJVM_org_j3_bindings_Bindings_retainForFinalize__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
 gc* Collector::retainReferent(gc* val, word_t closure) {
+  llvm_gcroot(val, 0);
   return JnJVM_org_j3_bindings_Bindings_retainReferent__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
 gc* Collector::getForwardedFinalizable(gc* val, word_t closure) {
+  llvm_gcroot(val, 0);
   return JnJVM_org_j3_bindings_Bindings_getForwardedFinalizable__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
 gc* Collector::getForwardedReference(gc* val, word_t closure) {
+  llvm_gcroot(val, 0);
   return JnJVM_org_j3_bindings_Bindings_getForwardedReference__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
   
 gc* Collector::getForwardedReferent(gc* val, word_t closure) {
+  llvm_gcroot(val, 0);
   return JnJVM_org_j3_bindings_Bindings_getForwardedReferent__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, val);
 }
 
@@ -266,24 +293,34 @@ void Collector::initialise(int argc, cha
 }
 
 extern "C" void* MMTkMutatorAllocate(uint32_t size, void* type) {
-  gc* val = (gc*)MutatorThread::get()->Allocator.Allocate(size);
+  gc* val = NULL;
+  llvm_gcroot(val, 0);
+  val = (gc*)MutatorThread::get()->Allocator.Allocate(size);
   vmkit::Thread::get()->MyVM->setType(val, type);
   return val;
 }
 
 void Collector::objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   fieldWriteBarrier((void*)ref, (void**)slot, (void*)value);
 }
 
 void Collector::objectReferenceArrayWriteBarrier(gc* ref, gc** slot, gc* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(value, 0);
   arrayWriteBarrier((void*)ref, (void**)slot, (void*)value);
 }
 
 void Collector::objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) {
+  llvm_gcroot(value, 0);
   nonHeapWriteBarrier((void**)slot, (void*)value);
 }
 
 bool Collector::objectReferenceTryCASBarrier(gc* ref, gc** slot, gc* old, gc* value) {
+  llvm_gcroot(ref, 0);
+  llvm_gcroot(old, 0);
+  llvm_gcroot(value, 0);
   bool res = JnJVM_org_j3_bindings_Bindings_writeBarrierCAS__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2(ref, slot, old, value);
   if (vmkit::Thread::get()->doYield) vmkit::Collector::collect();
   return res;

Modified: vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp?rev=180391&r1=180390&r2=180391&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp Thu Apr 25 12:05:01 2013
@@ -28,22 +28,27 @@ extern "C" word_t Java_org_j3_mmtk_Objec
 
 extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2 (
     MMTkObject* OM, gc* obj, word_t val) {
+  llvm_gcroot(obj, 0);
   obj->header() = val;
 }
 
 extern "C" gcHeader* Java_org_j3_mmtk_ObjectModel_objectStartRef__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
+	llvm_gcroot(obj, 0);
 	return obj ? obj->toHeader() : 0;
 }
 
 extern "C" gcHeader* Java_org_j3_mmtk_ObjectModel_refToAddress__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
+	llvm_gcroot(obj, 0);
 	return obj ? obj->toHeader() : 0;
 }
 
 extern "C" uint8_t Java_org_j3_mmtk_ObjectModel_readAvailableByte__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
+  llvm_gcroot(obj, 0);
   return *vmkit::System::GetLastBytePtr(reinterpret_cast<word_t>(&(obj->header())));
 }
 
 extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableByte__Lorg_vmmagic_unboxed_ObjectReference_2B (MMTkObject* OM, gc* obj, uint8_t val) {
+  llvm_gcroot(obj, 0);
   *vmkit::System::GetLastBytePtr(reinterpret_cast<word_t>(&(obj->header()))) = val;
 }
 
@@ -52,12 +57,14 @@ extern "C" gc* Java_org_j3_mmtk_ObjectMo
 }
 
 extern "C" word_t Java_org_j3_mmtk_ObjectModel_prepareAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
+  llvm_gcroot(obj, 0);
   return obj->header();
 }
 
 extern "C" uint8_t
 Java_org_j3_mmtk_ObjectModel_attemptAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2(
     MMTkObject* OM, gc* obj, word_t oldValue, word_t newValue) { 
+  llvm_gcroot(obj, 0);
   word_t val = __sync_val_compare_and_swap(&(obj->header()), oldValue, newValue);
   return (val == oldValue);
 }
@@ -67,6 +74,7 @@ extern "C" void Java_org_j3_bindings_Bin
 
 extern "C" void Java_org_j3_bindings_Bindings_setType__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2(
                     gc* obj, void* type) {
+	llvm_gcroot(obj, 0);
 	vmkit::Thread::get()->MyVM->setType(obj, type);
 }
 
@@ -101,9 +109,12 @@ extern "C" word_t Java_org_j3_mmtk_Objec
 
 extern "C" word_t Java_org_j3_mmtk_ObjectModel_copy__Lorg_vmmagic_unboxed_ObjectReference_2I (
     MMTkObject* OM, gc* src, int allocator) {
+  gc* res = NULL;
+  llvm_gcroot(res, 0);
+  llvm_gcroot(src, 0);
   size_t size = vmkit::Thread::get()->MyVM->getObjectSize(src);
   size = llvm::RoundUpToAlignment(size, sizeof(void*));
-  gc* res = (gc*)JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(
+  res = (gc*)JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(
       src, vmkit::Thread::get()->MyVM->getType(src), size, allocator);
   assert((res->header() & ~vmkit::GCBitMask) == (src->header() & ~vmkit::GCBitMask));
   return (word_t)res;
@@ -117,6 +128,7 @@ extern "C" void Java_org_j3_mmtk_ObjectM
 
 extern "C" word_t Java_org_j3_mmtk_ObjectModel_getObjectEndAddress__Lorg_vmmagic_unboxed_ObjectReference_2 (
     MMTkObject* OM, gc* object) {
+  llvm_gcroot(object, 0);
   size_t size = vmkit::Thread::get()->MyVM->getObjectSize(object);
   size = llvm::RoundUpToAlignment(size, sizeof(void*));
   return reinterpret_cast<word_t>(object) + size;
@@ -157,6 +169,7 @@ class FakeByteArray : public MMTkObject
 
 extern "C" FakeByteArray* Java_org_j3_mmtk_ObjectModel_getTypeDescriptor__Lorg_vmmagic_unboxed_ObjectReference_2 (
     MMTkObject* OM, gc* src) {
+  llvm_gcroot(src, 0);
   const char* name = vmkit::Thread::get()->MyVM->getObjectTypeName(src);
   // This code is only used for debugging on a fatal error. It is fine to
   // allocate in the C++ heap.





More information about the vmkit-commits mailing list