[vmkit-commits] [vmkit] r79155 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Aug 15 17:16:50 PDT 2009


Author: geoffray
Date: Sat Aug 15 19:16:50 2009
New Revision: 79155

URL: http://llvm.org/viewvc/llvm-project?rev=79155&view=rev
Log:
Bugfix when a class can not be resolved: set it erroneous and throw
an exception.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=79155&r1=79154&r2=79155&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sat Aug 15 19:16:50 2009
@@ -817,6 +817,8 @@
 
 void Class::readClass() {
 
+  assert(getInitializationState() == loaded && "Wrong init state");
+  
   PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0);
   PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0);
   PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString());
@@ -850,16 +852,45 @@
 
 #ifndef ISOLATE_SHARING
 void Class::resolveClass() {
-  if (!isResolved()) {
+  if (!isResolved() && !isErroneous()) {
     acquire();
-    if (isResolved()) {
+    if (isResolved() || isErroneous()) {
       release();
     } else if (!isResolving()) {
       setOwnerClass(JavaThread::get());
-      readClass();
+      
+      JavaObject* exc = 0;
+      try {
+        readClass();
+      } catch (...) {
+        exc = JavaThread::get()->pendingException;
+        JavaThread::get()->clearException();
+      }
+
+      if (exc) {
+        setErroneous();        
+        setOwnerClass(0);
+        broadcastClass();
+        release();
+        JavaThread::get()->throwException(exc);
+      }
+ 
       release();
+
+      try {
+        loadParents();
+      } catch (...) {
+        setInitializationState(loaded);
+        exc = JavaThread::get()->pendingException;
+        JavaThread::get()->clearException();
+      }
+      
+      if (exc) {
+        setErroneous();        
+        setOwnerClass(0);
+        JavaThread::get()->throwException(exc);
+      }
       
-      loadParents();
       makeVT();
       JavaCompiler *Comp = classLoader->getCompiler();
       Comp->resolveVirtualClass(this);
@@ -881,10 +912,21 @@
     } else if (JavaThread::get() != getOwnerClass()) {
       while (!isResolved()) {
         waitClass();
+        if (isErroneous()) break;
       }
       release();
+
     }
   }
+  
+  if (isErroneous()) {
+    JavaThread* th = JavaThread::get();
+    JavaObject* exc = th->getJVM()->CreateLinkageError("");
+    th->throwException(exc);
+
+  }
+  
+  assert(virtualVT && "No virtual VT after resolution");
 }
 #else
 void Class::resolveClass() {
@@ -1029,6 +1071,7 @@
   llvm_gcroot(clazz, 0);
 
   UserCommonClass* cl = ((JavaObjectClass*)clazz)->getClass();
+  assert(cl && "No class in Class object");
   if (cl->isClass()) {
     cl->asClass()->resolveClass();
     if (doClinit) cl->asClass()->initialiseClass(vm);
@@ -1315,6 +1358,8 @@
 JavaVirtualTable::JavaVirtualTable(Class* C) {
    
   if (C->super) {
+    
+    assert(C->super->virtualVT && "Super has no VT");
 
     // Set the regular object tracer, destructor and delete.
     tracer = (uintptr_t)RegularObjectTracer;

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=79155&r1=79154&r2=79155&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sat Aug 15 19:16:50 2009
@@ -851,7 +851,8 @@
   /// isResolved - Has this class been resolved?
   ///
   bool isResolved() {
-    return getCurrentTaskClassMirror().status >= resolved;
+    uint8 stat = getCurrentTaskClassMirror().status;
+    return (stat >= resolved && stat != erroneous);
   }
   
   /// isErroneous - Is the class in an erroneous state.





More information about the vmkit-commits mailing list