[vmkit-commits] [vmkit] r69281 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JnjvmClassLoader.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Apr 16 03:53:39 PDT 2009


Author: geoffray
Date: Thu Apr 16 05:53:29 2009
New Revision: 69281

URL: http://llvm.org/viewvc/llvm-project?rev=69281&view=rev
Log:
Move resolution of classes to initialiseVT, when java.lang.Object gets
resolved.



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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Apr 16 05:53:29 2009
@@ -739,11 +739,11 @@
   // interfaces is not used if super is null.
   interfaces = (Class**)
     classLoader->allocator.Allocate(nbI * sizeof(Class*));
-  nbInterfaces = nbI;
   for (int i = 0; i < nbI; i++) {
     const UTF8* name = ctpInfo->resolveClassName(reader.readU2());
     interfaces[i] = classLoader->loadName(name, false, true);
   }
+  nbInterfaces = nbI;
 
 }
 
@@ -932,7 +932,7 @@
       if (!needsInitialisationCheck()) {
         setInitializationState(ready);
       }
-      if (!super) ClassArray::initialiseVT();
+      if (!super) ClassArray::initialiseVT(this);
       setOwnerClass(0);
       broadcastClass();
       release();
@@ -1240,8 +1240,20 @@
 }
 
 
-void ClassArray::initialiseVT() {
- 
+void ClassArray::initialiseVT(Class* javaLangObject) {
+
+  ClassArray::SuperArray = javaLangObject;
+  JnjvmClassLoader* JCL = javaLangObject->classLoader;
+  
+  // Initialize interfaces of array classes.
+  ClassArray::InterfacesArray[0] = 
+    JCL->loadName(JCL->asciizConstructUTF8("java/lang/Cloneable"),
+                  false, false);
+  
+  ClassArray::InterfacesArray[1] = 
+    JCL->loadName(JCL->asciizConstructUTF8("java/io/Serializable"),
+                  false, false);
+  
   Class* cl = ClassArray::SuperArray;
   assert(cl && "Initializing array VT without a super for arrays");
   assert(cl->virtualVT->init && "Initializing array VT before JavaObjectVT");
@@ -1275,7 +1287,6 @@
 
 #undef COPY
  
-  JnjvmClassLoader* JCL = cl->classLoader;
   // Load array classes that JnJVM internally uses.
   upcalls->ArrayOfString = 
     JCL->constructArray(JCL->asciizConstructUTF8("[Ljava/lang/String;"));

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Apr 16 05:53:29 2009
@@ -935,7 +935,7 @@
   /// initialiseVT - Initialise the primitive and reference array VT.
   /// super is the java/lang/Object class.
   ///
-  static void initialiseVT();
+  static void initialiseVT(Class* javaLangObject);
   
 };
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Apr 16 05:53:29 2009
@@ -77,14 +77,7 @@
   
   upcalls = new(allocator) Classpath();
   bootstrapLoader = this;
-  
-  // Allocate interfaces.
-  InterfacesArray = 
-    (Class**)allocator.Allocate(2 * sizeof(UserClass*));
-  
-  ClassArray::InterfacesArray = 
-    (Class**)allocator.Allocate(2 * sizeof(UserClass*));
-  
+   
   // Try to find if we have a pre-compiled rt.jar
   if (dlLoad) {
     SuperArray = (Class*)dlsym(SELF_HANDLE, "java.lang.Object");
@@ -124,11 +117,17 @@
       upcalls->ArrayOfObject = 
         constructArray(asciizConstructUTF8("[Ljava/lang/Object;"));
       
+      InterfacesArray = upcalls->ArrayOfObject->interfaces;
+      ClassArray::InterfacesArray = InterfacesArray;
 
     }
   }
    
   if (!upcalls->OfChar) {
+    // Allocate interfaces.
+    InterfacesArray = (Class**)allocator.Allocate(2 * sizeof(UserClass*));
+    ClassArray::InterfacesArray = InterfacesArray;
+
     // Create the primitive classes.
     upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2);
     upcalls->OfBool = UPCALL_PRIMITIVE_CLASS(this, "boolean", 1);
@@ -191,31 +190,7 @@
   // hold the .zip file, we call the function after creation of the
   // array classes.
   analyseClasspathEnv(bootClasspathEnv);
-
- 
-  // We haven't found a pre-compiled rt.jar, load the root class ourself.
-  if (!SuperArray) {
-   
-    // We can not resolve java.lang.Object yet, because we may not be
-    // running in a Java thread, and we may not have a compiler
-    // available.
-    SuperArray = loadName(asciizConstructUTF8("java/lang/Object"), false,
-                          false);
-    ClassArray::SuperArray = (Class*)SuperArray->getInternal();
-    
-  }
-  
-  // Initialize interfaces of array classes.
-  InterfacesArray[0] = loadName(asciizConstructUTF8("java/lang/Cloneable"),
-                                false, false);
   
-  InterfacesArray[1] = loadName(asciizConstructUTF8("java/io/Serializable"),
-                                false, false);
-  
-  ClassArray::InterfacesArray[0] = (Class*)InterfacesArray[0]->getInternal();
-  ClassArray::InterfacesArray[1] = (Class*)(InterfacesArray[1]->getInternal()); 
-  
- 
   Attribut::codeAttribut = asciizConstructUTF8("Code");
   Attribut::exceptionsAttribut = asciizConstructUTF8("Exceptions");
   Attribut::constantAttribut = asciizConstructUTF8("ConstantValue");





More information about the vmkit-commits mailing list