[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