[vmkit-commits] [vmkit] r55185 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp.inc Classpath/ClasspathMethod.cpp.inc Classpath/ClasspathVMClass.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaRuntimeJIT.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Aug 22 10:19:54 PDT 2008


Author: geoffray
Date: Fri Aug 22 12:19:53 2008
New Revision: 55185

URL: http://llvm.org/viewvc/llvm-project?rev=55185&view=rev
Log:
A class knows how to read itself.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Fri Aug 22 12:19:53 2008
@@ -67,7 +67,7 @@
     CommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false);
     if (!_cl->isArray) {
       Class* cl = (Class*)_cl;
-      cl->initialiseClass();
+      vm->initialiseClass(cl);
 
       JavaObject* res = cl->doNew(vm);
       JavaObject** ptr = (JavaObject**)(void*)(args->elements);

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Fri Aug 22 12:19:53 2008
@@ -84,7 +84,7 @@
       }
 
     } else {
-      cl->initialiseClass();
+      vm->initialiseClass(cl);
     }
 
     JavaObject** ptr = (JavaObject**)(void*)(args->elements);     

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 22 12:19:53 2008
@@ -58,7 +58,7 @@
                                                    true, false);
   if (cl != 0) {
     if (clinit) {
-      cl->initialiseClass();
+      JavaThread::get()->isolate->initialiseClass(cl);
     }
     return (jclass)(cl->getClassDelegatee());
   } else {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 12:19:53 2008
@@ -7,11 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
+#define JNJVM_LOAD 0
+
 #include <vector>
 
 #include <string.h>
 
 #include "mvm/JIT.h"
+#include "debug.h"
 #include "types.h"
 
 #include "JavaArray.h"
@@ -532,10 +535,6 @@
   classLoader->resolveClass(this);
 }
 
-void CommonClass::initialiseClass() {
-  return JavaThread::get()->isolate->initialiseClass(this);
-}
-
 #ifdef MULTIPLE_VM
 JavaObject* Class::staticInstance() {
   std::pair<JavaState, JavaObject*>* val = 
@@ -629,3 +628,104 @@
   }
 }
 
+void Class::readParents(Reader& reader) {
+  unsigned short int superEntry = reader.readU2();
+  const UTF8* super = superEntry ? 
+        ctpInfo->resolveClassName(superEntry) : 0;
+
+  unsigned short int nbI = reader.readU2();
+  superUTF8 = super;
+  for (int i = 0; i < nbI; i++)
+    interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2()));
+
+}
+
+void Class::loadParents() {
+  int nbI = interfacesUTF8.size();
+  if (superUTF8 == 0) {
+    depth = 0;
+    display = (CommonClass**)malloc(sizeof(CommonClass*));
+    display[0] = this;
+    virtualTableSize = VT_SIZE / sizeof(void*);
+  } else {
+    super = classLoader->loadName(superUTF8, true, true);
+    depth = super->depth + 1;
+    virtualTableSize = super->virtualTableSize;
+    display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*));
+    memcpy(display, super->display, depth * sizeof(CommonClass*));
+    display[depth] = this;
+  }
+
+  for (int i = 0; i < nbI; i++)
+    interfaces.push_back((Class*)classLoader->loadName(interfacesUTF8[i],
+                                                       true, true));
+}
+
+void Class::readAttributs(Reader& reader, std::vector<Attribut*>& attr) {
+  unsigned short int nba = reader.readU2();
+  
+  for (int i = 0; i < nba; i++) {
+    const UTF8* attName = ctpInfo->UTF8At(reader.readU2());
+    uint32 attLen = reader.readU4();
+    Attribut* att = new Attribut(attName, attLen, reader.cursor);
+    attr.push_back(att);
+    reader.seek(attLen, Reader::SeekCur);
+  }
+}
+
+void Class::readFields(Reader& reader) {
+  uint16 nbFields = reader.readU2();
+  uint32 sindex = 0;
+  uint32 vindex = 0;
+  for (int i = 0; i < nbFields; i++) {
+    uint16 access = reader.readU2();
+    const UTF8* name = ctpInfo->UTF8At(reader.readU2());
+    const UTF8* type = ctpInfo->UTF8At(reader.readU2());
+    JavaField* field = constructField(name, type, access);
+    isStatic(access) ?
+      field->num = sindex++ :
+      field->num = vindex++;
+    readAttributs(reader, field->attributs);
+  }
+}
+
+void Class::readMethods(Reader& reader) {
+  uint16 nbMethods = reader.readU2();
+  for (int i = 0; i < nbMethods; i++) {
+    uint16 access = reader.readU2();
+    const UTF8* name = ctpInfo->UTF8At(reader.readU2());
+    const UTF8* type = ctpInfo->UTF8At(reader.readU2());
+    JavaMethod* meth = constructMethod(name, type, access);
+    readAttributs(reader, meth->attributs);
+  }
+}
+
+void Class::readClass() {
+
+  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());
+
+  Reader reader(bytes);
+  uint32 magic = reader.readU4();
+  if (magic != Jnjvm::Magic) {
+    JavaThread::get()->isolate->classFormatError("bad magic number %p", magic);
+  }
+  minor = reader.readU2();
+  major = reader.readU2();
+  ctpInfo = new JavaConstantPool(this, reader);
+  access = reader.readU2();
+  
+  const UTF8* thisClassName = 
+    ctpInfo->resolveClassName(reader.readU2());
+  
+  if (!(thisClassName->equals(name))) {
+    JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s",
+          printString(), thisClassName->printString());
+  }
+
+  readParents(reader);
+  readFields(reader);
+  readMethods(reader);
+  readAttributs(reader, attributs);
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 12:19:53 2008
@@ -380,10 +380,6 @@
   ///
   JavaObject* getClassDelegatee(JavaObject* pd = 0);
 
-  /// initialiseClass - If the class has a static initializer and has not been
-  /// initialized yet, call it.
-  void initialiseClass();
-
   /// resolveClass - If the class has not been resolved yet, resolve it.
   ///
   void resolveClass();
@@ -552,6 +548,30 @@
   /// name.
   Class(JnjvmClassLoader* loader, const UTF8* name);
   
+  /// readParents - Reads the parents, i.e. super and interfaces, of the class.
+  ///
+  void readParents(Reader& reader);
+
+  /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
+  /// of the class.
+  ///
+  void loadParents();
+
+  /// readAttributs - Reads the attributs of the class.
+  ///
+  void readAttributs(Reader& reader, std::vector<Attribut*> & attr);
+
+  /// readFields - Reads the fields of the class.
+  ///
+  void readFields(Reader& reader);
+
+  /// readMethods - Reads the methods of the class.
+  ///
+  void readMethods(Reader& reader);
+  
+  /// readClass - Reads the class.
+  ///
+  void readClass();
 };
 
 /// ClassArray - This class represents Java array classes.

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 12:19:53 2008
@@ -180,7 +180,7 @@
 extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) {
   std::pair<JavaState, JavaObject*>* val = vm->statics->lookup(cl);
   if (!val || !(val->second)) {
-    cl->initialiseClass();
+    vm->initialiseClass(cl);
     val = vm->statics->lookup(cl);
   }
   return val->second;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 12:19:53 2008
@@ -101,7 +101,7 @@
       *status = clinitParent;
       cl->release();
       if (cl->super) {
-        cl->super->initialiseClass();
+        initialiseClass(cl->super);
       }
 
       cl->classLoader->TheModule->resolveStaticClass((Class*)cl);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 12:19:53 2008
@@ -99,116 +99,6 @@
 
 }
 
-void JnjvmClassLoader::readParents(Class* cl, Reader& reader) {
-  JavaConstantPool* ctpInfo = cl->ctpInfo;
-  unsigned short int superEntry = reader.readU2();
-  const UTF8* super = superEntry ? 
-        ctpInfo->resolveClassName(superEntry) : 0;
-
-  unsigned short int nbI = reader.readU2();
-  cl->superUTF8 = super;
-  for (int i = 0; i < nbI; i++)
-    cl->interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2()));
-
-}
-
-void JnjvmClassLoader::loadParents(Class* cl) {
-  const UTF8* super = cl->superUTF8;
-  int nbI = cl->interfacesUTF8.size();
-  if (super == 0) {
-    cl->depth = 0;
-    cl->display = (CommonClass**)malloc(sizeof(CommonClass*));
-    cl->display[0] = cl;
-    cl->virtualTableSize = VT_SIZE / sizeof(void*);
-  } else {
-    cl->super = loadName(super, true, true);
-    int depth = cl->super->depth + 1;
-    cl->depth = depth;
-    cl->virtualTableSize = cl->super->virtualTableSize;
-    cl->display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*));
-    memcpy(cl->display, cl->super->display, depth * sizeof(CommonClass*));
-    cl->display[cl->depth] = cl;
-  }
-
-  for (int i = 0; i < nbI; i++)
-    cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i],
-                                              true, true));
-}
-
-void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader,
-                           std::vector<Attribut*>& attr) {
-  JavaConstantPool* ctpInfo = cl->ctpInfo;
-  unsigned short int nba = reader.readU2();
-  
-  for (int i = 0; i < nba; i++) {
-    const UTF8* attName = ctpInfo->UTF8At(reader.readU2());
-    uint32 attLen = reader.readU4();
-    Attribut* att = new Attribut(attName, attLen, reader.cursor);
-    attr.push_back(att);
-    reader.seek(attLen, Reader::SeekCur);
-  }
-}
-
-void JnjvmClassLoader::readFields(Class* cl, Reader& reader) {
-  uint16 nbFields = reader.readU2();
-  JavaConstantPool* ctpInfo = cl->ctpInfo;
-  uint32 sindex = 0;
-  uint32 vindex = 0;
-  for (int i = 0; i < nbFields; i++) {
-    uint16 access = reader.readU2();
-    const UTF8* name = ctpInfo->UTF8At(reader.readU2());
-    const UTF8* type = ctpInfo->UTF8At(reader.readU2());
-    JavaField* field = cl->constructField(name, type, access);
-    isStatic(access) ?
-      field->num = sindex++ :
-      field->num = vindex++;
-    readAttributs(cl, reader, field->attributs);
-  }
-}
-
-void JnjvmClassLoader::readMethods(Class* cl, Reader& reader) {
-  uint16 nbMethods = reader.readU2();
-  JavaConstantPool* ctpInfo = cl->ctpInfo;
-  for (int i = 0; i < nbMethods; i++) {
-    uint16 access = reader.readU2();
-    const UTF8* name = ctpInfo->UTF8At(reader.readU2());
-    const UTF8* type = ctpInfo->UTF8At(reader.readU2());
-    JavaMethod* meth = cl->constructMethod(name, type, access);
-    readAttributs(cl, reader, meth->attributs);
-  }
-}
-
-void JnjvmClassLoader::readClass(Class* cl) {
-
-  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::%s\n", printString(),
-              cl->printString());
-
-  Reader reader(cl->bytes);
-  uint32 magic = reader.readU4();
-  if (magic != Jnjvm::Magic) {
-    JavaThread::get()->isolate->classFormatError("bad magic number %p", magic);
-  }
-  cl->minor = reader.readU2();
-  cl->major = reader.readU2();
-  cl->ctpInfo = new JavaConstantPool(cl, reader);
-  cl->access = reader.readU2();
-  
-  const UTF8* thisClassName = 
-    cl->ctpInfo->resolveClassName(reader.readU2());
-  
-  if (!(thisClassName->equals(cl->name))) {
-    JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s",
-          cl->printString(), thisClassName->printString());
-  }
-
-  readParents(cl, reader);
-  readFields(cl, reader);
-  readMethods(cl, reader);
-  readAttributs(cl, reader, cl->attributs);
-}
-
 ArrayUInt8* JnjvmBootstrapLoader::openName(const UTF8* utf8) {
   char* asciiz = utf8->UTF8ToAsciiz();
   uint32 alen = strlen(asciiz);
@@ -255,14 +145,15 @@
         baseClass->resolveClass();
         cl->status = resolved;
       } else {
-        readClass((Class*)cl);
-        cl->status = classRead;
-        cl->release();
-        loadParents((Class*)cl);
-        cl->acquire(); 
-        cl->status = prepared;
-        TheModule->resolveVirtualClass((Class*)cl);
-        cl->status = resolved;
+        Class* regCl = (Class*)cl;
+        regCl->readClass();
+        regCl->status = classRead;
+        regCl->release();
+        regCl->loadParents();
+        regCl->acquire(); 
+        regCl->status = prepared;
+        TheModule->resolveVirtualClass(regCl);
+        regCl->status = resolved;
       }
       cl->release();
       cl->broadcastClass();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 12:19:53 2008
@@ -66,31 +66,6 @@
   ///
   virtual CommonClass* internalLoad(const UTF8* utf8);
   
-  /// readParents - Reads the parents, i.e. super and interfaces, of the class.
-  ///
-  void readParents(Class* cl, Reader& reader);
-
-  /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
-  /// of the class.
-  ///
-  void loadParents(Class* cl);
-
-  /// readAttributs - Reads the attributs of the class.
-  ///
-  void readAttributs(Class* cl, Reader& reader, std::vector<Attribut*> & attr);
-
-  /// readFields - Reads the fields of the class.
-  ///
-  void readFields(Class* cl, Reader& reader);
-
-  /// readMethods - Reads the methods of the class.
-  ///
-  void readMethods(Class* cl, Reader& reader);
-  
-  /// readClass - Reads the class.
-  ///
-  void readClass(Class* cl);
-  
   /// JnjvmClassLoader - Allocate a user-defined class loader. Called on
   /// first use of a Java class loader.
   ///





More information about the vmkit-commits mailing list