[vmkit-commits] [vmkit] r115424 - in /vmkit/trunk/lib/J3/VMCore: JavaClass.cpp JavaClass.h Jni.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Oct 2 14:48:51 PDT 2010


Author: geoffray
Date: Sat Oct  2 16:48:51 2010
New Revision: 115424

URL: http://llvm.org/viewvc/llvm-project?rev=115424&view=rev
Log:
Set the resolution to be only loading exceptions used by methods in the class. Now constructing a class creates the VT.


Modified:
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.h
    vmkit/trunk/lib/J3/VMCore/Jni.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sat Oct  2 16:48:51 2010
@@ -705,19 +705,6 @@
 
 }
 
-void UserClass::loadParents() {
-  if (super == 0) {
-    virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
-  } else  {
-    super->resolveClass();
-    virtualTableSize = super->virtualTableSize;
-  }
-
-  for (unsigned i = 0; i < nbInterfaces; i++)
-    interfaces[i]->resolveClass(); 
-}
-
-
 void internalLoadExceptions(JavaMethod& meth) {
   
   Attribut* codeAtt = meth.lookupAttribut(Attribut::codeAttribut);
@@ -742,7 +729,7 @@
       reader.readU2();
 
       uint16 catche = reader.readU2();
-      if (catche) meth.classDef->ctpInfo->loadClass(catche);
+      if (catche) meth.classDef->ctpInfo->loadClass(catche, false);
     }
   }
 }
@@ -815,6 +802,11 @@
 }
 
 void Class::makeVT() {
+  if (super == NULL) {
+    virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
+  } else  {
+    virtualTableSize = super->virtualTableSize;
+  }
   
   for (uint32 i = 0; i < nbVirtualMethods; ++i) {
     JavaMethod& meth = virtualMethods[i];
@@ -837,11 +829,6 @@
     }
   }
 
-  if (super) {
-    assert(virtualTableSize >= super->virtualTableSize &&
-           "Size of virtual table less than super!");
-  }
-
   mvm::BumpPtrAllocator& allocator = classLoader->allocator;
   virtualVT = new(allocator, virtualTableSize) JavaVirtualTable(this);
 }
@@ -948,24 +935,24 @@
   readFields(reader);
   readMethods(reader);
   attributs = readAttributs(reader, nbAttributs);
-  setIsRead();
 }
 
+void UserClass::resolveParents() {
+  if (super != NULL) {
+    super->resolveClass();
+  }
+
+  for (unsigned i = 0; i < nbInterfaces; i++)
+    interfaces[i]->resolveClass(); 
+}
+
+
 #ifndef ISOLATE_SHARING
 void Class::resolveClass() {
   if (isResolved() || isErroneous()) return;
-  readClass();
-  loadParents();
-  makeVT();
-  JavaCompiler *Comp = classLoader->getCompiler();
-  Comp->resolveVirtualClass(this);
-  Comp->resolveStaticClass(this);
+  resolveParents();
   loadExceptions();
   setResolved();
-  if (!needsInitialisationCheck()) {
-    setInitializationState(ready);
-  }
-  assert(virtualVT && "No virtual VT after resolution");
 }
 #else
 void Class::resolveClass() {
@@ -1339,8 +1326,6 @@
 
 bool UserClass::needsInitialisationCheck() {
   
-  if (!isClassRead()) return true;
-
   if (isReady()) return false;
 
   if (super && super->needsInitialisationCheck())

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sat Oct  2 16:48:51 2010
@@ -50,7 +50,7 @@
 /// and accessing static fields of the class) when it is in the ready state.
 ///
 #define loaded 0       /// The .class file has been found.
-#define classRead 1    /// The .class file has been read.
+#define resolving 1    /// The .class file is being resolved.
 #define resolved 2     /// The class has been resolved.
 #define vmjc 3         /// The class is defined in a shared library.
 #define inClinit 4     /// The class is cliniting.
@@ -627,11 +627,6 @@
   ///
   void readParents(Reader& reader);
 
-  /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
-  /// of the class.
-  ///
-  void loadParents();
-  
   /// loadExceptions - Loads and resolves the exception classes used in catch 
   /// clauses of methods defined in this class.
   ///
@@ -676,6 +671,7 @@
   /// resolveClass - If the class has not been resolved yet, resolve it.
   ///
   void resolveClass();
+  void resolveParents();
 
   /// initialiseClass - If the class has not been initialized yet,
   /// initialize it.
@@ -726,10 +722,10 @@
     getCurrentTaskClassMirror().status = erroneous;
   }
   
-  /// setIsRead - The class file has been read.
+  /// setIsResolving - The class file is being resolved.
   ///
-  void setIsRead() {
-    getCurrentTaskClassMirror().status = classRead;
+  void setIsResolving() {
+    getCurrentTaskClassMirror().status = resolving;
   }
   
 
@@ -747,9 +743,9 @@
     }
   }
   
-  void setIsRead() {
+  void setIsResolving() {
     for (uint32 i = 0; i < NR_ISOLATES; ++i) {
-      IsolateInfo[i].status = classRead;
+      IsolateInfo[i].status = resolving;
     }
   }
   
@@ -815,15 +811,9 @@
   /// isResolving - Is the class currently being resolved?
   ///
   bool isResolving() {
-    return getCurrentTaskClassMirror().status == classRead;
+    return getCurrentTaskClassMirror().status == resolving;
   }
 
-  /// isClassRead - Has the .class file been read?
-  ///
-  bool isClassRead() {
-    return getCurrentTaskClassMirror().status >= classRead;
-  }
- 
   /// isNativeOverloaded - Is the method overloaded with a native function?
   ///
   bool isNativeOverloaded(JavaMethod* meth);
@@ -837,8 +827,6 @@
   ///
   void fillIMT(std::set<JavaMethod*>* meths);
 
-private:
-
   /// makeVT - Create the virtual table of this class.
   ///
   void makeVT();

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Sat Oct  2 16:48:51 2010
@@ -73,7 +73,10 @@
   else loader = vm->appClassLoader;
 
   UserCommonClass* cl = loader->loadClassFromAsciiz(asciiz, true, true);
-  if (cl && cl->asClass()) cl->asClass()->initialiseClass(vm);
+  if (cl && cl->asClass()) {
+    assert(cl->asClass()->isResolved());
+    cl->asClass()->initialiseClass(vm);
+  }
   jclass res = (jclass)cl->getClassDelegateePtr(vm);
   RETURN_FROM_JNI(res);
 

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sat Oct  2 16:48:51 2010
@@ -528,7 +528,7 @@
     return loadName(name, doResolve, doThrow, strName);
   }
 
-  return 0;
+  return NULL;
 }
 
 UserCommonClass* JnjvmClassLoader::loadClassFromAsciiz(const char* asciiz,
@@ -536,6 +536,7 @@
                                                        bool doThrow) {
   const UTF8* name = hashUTF8->lookupAsciiz(asciiz);
   mvm::ThreadAllocator threadAllocator;
+  UserCommonClass* result = NULL;
   if (!name) name = bootstrapLoader->hashUTF8->lookupAsciiz(asciiz);
   if (!name) {
     uint32 size = strlen(asciiz);
@@ -549,12 +550,15 @@
     name = temp;
   }
   
-  UserCommonClass* temp = lookupClass(name);
-  if (temp) return temp;
-  
-  if (this != bootstrapLoader) {
-    temp = bootstrapLoader->lookupClassOrArray(name);
-    if (temp) return temp;
+  result = lookupClass(name);
+  if ((result == NULL) && (this != bootstrapLoader)) {
+    result = bootstrapLoader->lookupClassOrArray(name);
+    if (result != NULL) {
+      if (result->isClass() && doResolve) {
+        result->asClass()->resolveClass();
+      }
+      return result;
+    }
   }
  
   return loadClassFromUserUTF8(name, doResolve, doThrow, NULL);
@@ -679,7 +683,10 @@
     TRY {
       const UTF8* internalName = readerConstructUTF8(name->elements, name->size);
       res = new(allocator, "Class") UserClass(this, internalName, bytes);
-      res->resolveClass();
+      res->readClass();
+      res->makeVT();
+      getCompiler()->resolveVirtualClass(res);
+      getCompiler()->resolveStaticClass(res);
       classes->lock.lock();
       bool success = classes->map.insert(std::make_pair(internalName, res)).second;
       classes->lock.unlock();

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Sat Oct  2 16:48:51 2010
@@ -302,6 +302,7 @@
   ///
   Class* loadClassFromSelf(Jnjvm* vm, const char* name);
 
+  friend class Class;
 };
 
 /// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which





More information about the vmkit-commits mailing list