[vmkit-commits] [vmkit] r61544 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaJIT.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu Jan 1 10:46:12 PST 2009
Author: geoffray
Date: Thu Jan 1 12:46:12 2009
New Revision: 61544
URL: http://llvm.org/viewvc/llvm-project?rev=61544&view=rev
Log:
Resolve exceptions of a method when resolving a class, so that we don't need
to resolve the exceptions when compiling.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61544&r1=61543&r2=61544&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Jan 1 12:46:12 2009
@@ -780,6 +780,44 @@
true, true));
}
+
+static void internalLoadExceptions(JavaMethod& meth) {
+
+ Attribut* codeAtt = meth.lookupAttribut(Attribut::codeAttribut);
+
+ if (codeAtt) {
+ Reader reader(codeAtt, meth.classDef->bytes);
+ //uint16 maxStack =
+ reader.readU2();
+ //uint16 maxLocals =
+ reader.readU2();
+ uint16 codeLen = reader.readU4();
+
+ reader.seek(codeLen, Reader::SeekCur);
+
+ uint16 nbe = reader.readU2();
+ for (uint16 i = 0; i < nbe; ++i) {
+ //startpc =
+ reader.readU2();
+ //endpc=
+ reader.readU2();
+ //handlerpc =
+ reader.readU2();
+
+ uint16 catche = reader.readU2();
+ if (catche) meth.classDef->ctpInfo->loadClass(catche);
+ }
+ }
+}
+
+void UserClass::loadExceptions() {
+ for (uint32 i = 0; i < nbVirtualMethods; ++i)
+ internalLoadExceptions(virtualMethods[i]);
+
+ for (uint32 i = 0; i < nbStaticMethods; ++i)
+ internalLoadExceptions(staticMethods[i]);
+}
+
Attribut* Class::readAttributs(Reader& reader, uint16& size) {
uint16 nba = reader.readU2();
@@ -888,9 +926,11 @@
if (isResolved()) {
release();
} else if (!isResolving()) {
+ setOwnerClass(JavaThread::get());
readClass();
release();
loadParents();
+ loadExceptions();
acquire();
JnjvmModule *Mod = classLoader->getModule();
Mod->resolveVirtualClass(this);
@@ -899,9 +939,10 @@
if (!needsInitialisationCheck()) {
setInitializationState(ready);
}
+ setOwnerClass(0);
broadcastClass();
release();
- } else {
+ } else if (JavaThread::get() != getOwnerClass()) {
while (!isResolved()) {
waitClass();
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61544&r1=61543&r2=61544&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Jan 1 12:46:12 2009
@@ -651,6 +651,11 @@
/// of the class.
///
void loadParents();
+
+ /// loadExceptions - Loads and resolves the exception classes used in catch
+ /// clauses of methods defined in this class.
+ ///
+ void loadExceptions();
/// readAttributs - Reads the attributs of the class.
///
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61544&r1=61543&r2=61544&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Thu Jan 1 12:46:12 2009
@@ -910,6 +910,7 @@
if (ex->catche) {
UserClass* cl =
(UserClass*)(compilingClass->ctpInfo->isClassLoaded(ex->catche));
+ assert(cl && "exception class has not been loaded");
ex->catchClass = cl;
} else {
ex->catchClass = Classpath::newThrowable;
More information about the vmkit-commits
mailing list