[vmkit-commits] [vmkit] r107643 - in /vmkit/trunk/lib/J3/Classpath: Classpath.inc ClasspathConstructor.inc ClasspathField.inc ClasspathMethod.inc ClasspathReflect.h ClasspathVMClass.inc ClasspathVMClassLoader.inc ClasspathVMStackWalker.inc ClasspathVMThread.inc ClasspathVMThrowable.inc JavaUpcalls.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Jul 5 22:59:04 PDT 2010


Author: geoffray
Date: Tue Jul  6 00:59:04 2010
New Revision: 107643

URL: http://llvm.org/viewvc/llvm-project?rev=107643&view=rev
Log:
Added some missing llvm_gcroot.
Also fixed a latent bug when initializaing the vmdata of the initial thread.


Modified:
    vmkit/trunk/lib/J3/Classpath/Classpath.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp

Modified: vmkit/trunk/lib/J3/Classpath/Classpath.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/Classpath.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/Classpath.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/Classpath.inc Tue Jul  6 00:59:04 2010
@@ -27,21 +27,21 @@
 JNIEnv *env,
 jclass clazz,
 #endif
-jclass Cl) {
+JavaObject* Cl) {
   
+  llvm_gcroot(Cl, 0);
   bool res = false;
   BEGIN_NATIVE_EXCEPTION(0)
 
   verifyNull(Cl);
   Jnjvm* vm = JavaThread::get()->getJVM();
-  UserCommonClass* cl = 
-    UserCommonClass::resolvedImplClass(vm, (JavaObject*)Cl, true);
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
   
   if (cl->isClass() && 
       cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
                                            vm->bootstrapLoader->clinitType, 
                                            true, false, 0))
-    res = true;
+  res = true;
 
   END_NATIVE_EXCEPTION
 
@@ -226,6 +226,7 @@
   llvm_gcroot(res, 0);
   llvm_gcroot(target, 0);
   llvm_gcroot(constr, 0);
+  llvm_gcroot(cons, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
   

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc Tue Jul  6 00:59:04 2010
@@ -96,7 +96,7 @@
   if (isAbstract(cl->access)) vm->instantiationException(cl);
 
   // Allocate a buffer to store the arguments.
-  jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
+  jvalue* buf = size ? new jvalue[size] : NULL;
   if (size) memset(buf, 0, size * sizeof(jvalue));
 
   if (nbArgs == size) {
@@ -123,6 +123,7 @@
         excp = th->getJavaException();
       } END_CATCH;
       if (excp) {
+        if (size) delete[] buf;
         if (JavaObject::getClass(excp)->isAssignableFrom(vm->upcalls->newException)) {
           th->clearException();
           // If it's an exception, we encapsule it in an
@@ -135,12 +136,17 @@
         return NULL;
       }
     } else {
+      if (size) delete[] buf;
       vm->illegalArgumentException("class is not a regular class");
+      return NULL;
     }
   } else {
+    if (size) delete[] buf;
     vm->illegalArgumentException("wrong number of arguments");
+    return NULL;
   }
  
+  if (size) delete[] buf;
   return res;
 }
 
@@ -159,7 +165,6 @@
   
   BEGIN_NATIVE_EXCEPTION(0)
 
-  // Proceed in another function because we are using alloca.
   res = proceedConstructor(cons, args, Clazz, index);
   
   END_NATIVE_EXCEPTION

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathField.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathField.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathField.inc Tue Jul  6 00:59:04 2010
@@ -573,44 +573,37 @@
                           field->getInstanceInt8Field(obj);
       res = vm->upcalls->boolClass->doNew(vm);
       vm->upcalls->boolValue->setInstanceInt8Field(res, val);
-    }
-    else if (prim->isByte()) {
+    } else if (prim->isByte()) {
       sint8 val =  stat ? field->getStaticInt8Field() :
                           field->getInstanceInt8Field(obj);
       res = vm->upcalls->byteClass->doNew(vm);
       vm->upcalls->byteValue->setInstanceInt8Field(res, val);
-    }
-    else if (prim->isChar()) {
+    } else if (prim->isChar()) {
       uint16 val =  stat ? field->getStaticInt16Field() :
                            field->getInstanceInt16Field(obj);
       res = vm->upcalls->charClass->doNew(vm);
       vm->upcalls->charValue->setInstanceInt16Field(res, val);
-    }
-    else if (prim->isShort()) {
+    } else if (prim->isShort()) {
       sint16 val =  stat ? field->getStaticInt16Field() :
                            field->getInstanceInt16Field(obj);
       res = vm->upcalls->shortClass->doNew(vm);
       vm->upcalls->shortValue->setInstanceInt16Field(res, val);
-    }
-    else if (prim->isInt()) {
+    } else if (prim->isInt()) {
       sint64 val =  stat ? field->getStaticInt32Field() :
                            field->getInstanceInt32Field(obj);
       res = vm->upcalls->intClass->doNew(vm);
       vm->upcalls->intValue->setInstanceInt32Field(res, val);
-    }
-    else if (prim->isLong()) {
+    } else if (prim->isLong()) {
       sint64 val =  stat ? field->getStaticLongField() :
                            field->getInstanceLongField(obj);
       res = vm->upcalls->longClass->doNew(vm);
       vm->upcalls->longValue->setInstanceLongField(res, val);
-    }
-    else if (prim->isFloat()) {
+    } else if (prim->isFloat()) {
       float val =  stat ? field->getStaticFloatField() :
                           field->getInstanceFloatField(obj);
       res = vm->upcalls->floatClass->doNew(vm);
       vm->upcalls->floatValue->setInstanceFloatField(res, val);
-    }
-    else if (prim->isDouble()) {
+    } else if (prim->isDouble()) {
       double val =  stat ? field->getStaticDoubleField() :
                            field->getInstanceDoubleField(obj);
       res = vm->upcalls->doubleClass->doNew(vm);

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc Tue Jul  6 00:59:04 2010
@@ -83,7 +83,7 @@
   JavaMethod* meth = JavaObjectMethod::getInternalMethod(Meth);
   JnjvmClassLoader* loader = cl->classLoader;
   
-  res = (meth->getParameterTypes(loader));
+  res = meth->getParameterTypes(loader);
 
   END_NATIVE_EXCEPTION
 
@@ -115,7 +115,7 @@
   Signdef* sign = meth->getSignature();
   sint32 size = sign->nbArguments;
 
-  jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
+  jvalue* buf = size ? new jvalue[size] : 0;
   if (size) memset(buf, 0, size * sizeof(jvalue));
   
   if (nbArgs == size) {
@@ -167,6 +167,7 @@
       exc = th->getJavaException();                                            \
     } END_CATCH;                                                               \
     if (exc) {                                                                 \
+      if (size) delete[] buf;                                                  \
       if (JavaObject::getClass(exc)->isAssignableFrom(                         \
               vm->upcalls->newException)) {                                    \
         th->clearException();                                                  \
@@ -229,10 +230,12 @@
       RUN_METH(JavaObject, res);
     } 
   } else {
+    if (size) delete[] buf;
     vm->illegalArgumentException("wrong number of arguments");
     return NULL;
   }
 
+  if (size) delete[] buf;
   return res;
 }
 
@@ -253,7 +256,6 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  // Create a new function because we use alloca.
   res = proceedMethod(Meth, obj, args, Cl, index);
   
   END_NATIVE_EXCEPTION

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul  6 00:59:04 2010
@@ -158,8 +158,10 @@
     mvm::Collector::markAndTrace(obj, &obj->thread, closure);
   }
 
-  void setVmdata(JavaThread* internal_thread) {
-    vmdata = internal_thread;
+  static void setVmdata(JavaObjectVMThread* vmthread,
+                        JavaThread* internal_thread) {
+    llvm_gcroot(vmthread, 0);
+    vmthread->vmdata = internal_thread;
   }
 
 };

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc Tue Jul  6 00:59:04 2010
@@ -58,7 +58,7 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   verifyNull(str);
-  Jnjvm* vm = JavaThread::get()->getJVM(); 
+  Jnjvm* vm = JavaThread::get()->getJVM();
   JnjvmClassLoader* JCL = 
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
   UserCommonClass* cl = JCL->loadClassFromJavaString(str, true, false);
@@ -67,7 +67,7 @@
     if (clinit && cl->asClass()) {
       cl->asClass()->initialiseClass(vm);
     }
-    res =cl->getClassDelegatee(vm);
+    res = cl->getClassDelegatee(vm);
   } else {
     vm->classNotFoundException(str);
   }
@@ -535,7 +535,6 @@
 #endif
 JavaObject* Cl, bool publicOnly) {
 
-
   ArrayObject* result = 0;
   llvm_gcroot(result, 0);
   llvm_gcroot(Cl, 0);

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc Tue Jul  6 00:59:04 2010
@@ -120,10 +120,13 @@
 JavaObject* pd) {
   
   JavaObject* res = 0;
+  JavaObject* excp = 0;
   llvm_gcroot(loader, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(bytes, 0);
   llvm_gcroot(pd, 0);
+  llvm_gcroot(res, 0);
+  llvm_gcroot(excp, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -148,8 +151,8 @@
 
     res = cl->getClassDelegatee(vm, pd);
   } else {
-    JavaObject* obj = vm->CreateLinkageError("duplicate class definition");
-    JavaThread::get()->throwException(obj);
+    excp = vm->CreateLinkageError("duplicate class definition");
+    JavaThread::get()->throwException(excp);
   }
 
   END_NATIVE_EXCEPTION

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc Tue Jul  6 00:59:04 2010
@@ -39,21 +39,22 @@
   Jnjvm* vm = th->getJVM();
   uint32 length = th->getFrameContextLength();
   
-  void** buffer = (void**)alloca(length * sizeof(void*));
+  uintptr_t* buffer = new uintptr_t[length];
   
-  uint32 finalSize = th->getJavaFrameContext(buffer);
+  uint32 finalSize = th->getJavaFrameContext((void**)buffer);
   
   result = (ArrayObject*)
     vm->upcalls->stackTraceArray->doNew(finalSize, vm);
    
   for (uint32 i = 0; i != finalSize; ++i) {
-    JavaMethod* meth = (JavaMethod*)buffer[i];
+    JavaMethod* meth = ((JavaMethod**)buffer)[i];
     assert(meth && "Wrong stack trace");
     ArrayObject::setElement(result, meth->classDef->getClassDelegatee(vm), i);
   }
+  delete[] buffer;
   
   END_NATIVE_EXCEPTION
-
+  
   return result;
 }
 

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc Tue Jul  6 00:59:04 2010
@@ -45,7 +45,7 @@
   // which is the JavaThread object.
   vmThread = (JavaObjectVMThread*)thread->vmThread;
   assert(vmThread && "Didn't fix the vmThread of a j3 thread");
-  vmThread->setVmdata(thread);
+  JavaObjectVMThread::setVmdata(vmThread, thread);
   
   UserClass* vmthClass = (UserClass*)JavaObject::getClass(vmThread); 
   
@@ -188,9 +188,10 @@
 #ifdef NATIVE_JNI
 JNIEnv *env,
 #endif
-JavaObject* vmthread, jobject exc) {
+JavaObject* vmthread, JavaObject* exc) {
   // Currently not implemented
   llvm_gcroot(vmthread, 0);
+  llvm_gcroot(exc, 0);
 }
 
 // Never throws.

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc Tue Jul  6 00:59:04 2010
@@ -28,22 +28,34 @@
 JavaObject* internalFillInStackTrace(JavaObject* throwable) {
   
   JavaObject* vmThrowable = 0;
+  ArrayPtr* result = 0;
   llvm_gcroot(throwable, 0);
   llvm_gcroot(vmThrowable, 0);
+  llvm_gcroot(result, 0);
 
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
  
   uint32 length = th->getFrameContextLength();
 
-  ClassArray* cl = sizeof(void*) == 4 ? vm->upcalls->ArrayOfInt : 
-                                        vm->upcalls->ArrayOfLong;
-  JavaObject* result = (JavaObject*) cl->doNew(length, vm);
-  void** tab = (void**)JavaArray::getElements(result);
-  
-  // Get the frame context.
-  th->getFrameContext(tab);
+  if (sizeof(void*) == 4) {
+    ClassArray* cl = vm->upcalls->ArrayOfInt;
+    result = (ArrayPtr*) cl->doNew(length, vm);
+  } else {
+    ClassArray* cl = vm->upcalls->ArrayOfLong;
+    result = (ArrayPtr*) cl->doNew(length, vm);
+  }
   
+  // Don't call th->getFrameContext because it is not GC-safe.
+  mvm::StackWalker Walker(th);
+  uint32_t i = 0;
+
+  while (void* ip = *Walker) {
+    ArrayPtr::setElement(result, ip, i);
+    ++i;
+    ++Walker;
+  }
+
   // Set the tempory data in the new VMThrowable object.
   vmThrowable = vm->upcalls->newVMThrowable->doNew(vm);
   vm->upcalls->vmDataVMThrowable->setInstanceObjectField(vmThrowable, result);

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul  6 00:59:04 2010
@@ -229,16 +229,17 @@
 
 void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,
                                  const char* thName, JavaObject* Group) {
-  JavaObject* vmth = NULL;
+  JavaObjectVMThread* vmth = NULL;
   JavaObject* th = NULL;
   JavaObject* name = NULL;
   llvm_gcroot(Group, 0);
   llvm_gcroot(vmth, 0);
   llvm_gcroot(th, 0);
+  llvm_gcroot(name, 0);
 
   th = newThread->doNew(vm);
   myth->javaThread = th;
-  vmth = newVMThread->doNew(vm);
+  vmth = (JavaObjectVMThread*)newVMThread->doNew(vm);
   name = vm->asciizToStr(thName);
   
   threadName->setInstanceObjectField(th, name);
@@ -247,7 +248,7 @@
   vmThread->setInstanceObjectField(th, vmth);
   assocThread->setInstanceObjectField(vmth, th);
   running->setInstanceInt8Field(vmth, (uint32)1);
-  ((JavaObjectVMThread*)vmdataVMThread)->setVmdata(myth);
+  JavaObjectVMThread::setVmdata(vmth, myth);
   
   group->setInstanceObjectField(th, Group);
   groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);
@@ -422,7 +423,7 @@
 
 extern "C" JavaObject* nativeGetCallingClassLoader() {
   
-  JavaObject *res = 0;
+  JavaObject* res = 0;
   llvm_gcroot(res, 0);
   
   BEGIN_NATIVE_EXCEPTION(0)
@@ -437,7 +438,7 @@
 }
 
 extern "C" JavaObject* nativeFirstNonNullClassLoader() {
-  JavaObject *res = 0;
+  JavaObject* res = 0;
   llvm_gcroot(res, 0);
   
   BEGIN_NATIVE_EXCEPTION(0)
@@ -452,7 +453,7 @@
 
 extern "C" JavaObject* nativeGetCallerClass(uint32 index) {
   
-  JavaObject *res = 0;
+  JavaObject* res = 0;
   llvm_gcroot(res, 0);
   
   BEGIN_NATIVE_EXCEPTION(0)





More information about the vmkit-commits mailing list