[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