[vmkit-commits] [vmkit] r61803 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jan 6 02:23:59 PST 2009


Author: geoffray
Date: Tue Jan  6 04:23:40 2009
New Revision: 61803

URL: http://llvm.org/viewvc/llvm-project?rev=61803&view=rev
Log:
Reorganize intialisation of native classes: first primitive types, then
native array types and finally java.lang.Object.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jan  6 04:23:40 2009
@@ -88,69 +88,15 @@
   upcalls = new(allocator) Classpath();
   bootstrapLoader = this;
   
-
-  // First, try to find if we have a pre-compiled rt.jar
-  void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL);
-  if (handle) {
-    // Found it!
-    Class* ptr = (Class*)dlsym(handle, "java/lang/Object");
-    if (ptr) {
-      // We have the java/lang/Object class, execute the static initializer.
-      static_init_t init = (static_init_t)(uintptr_t)ptr->classLoader;
-      assert(init && "Loaded the wrong boot library");
-      init(this);
-    }
-  } 
-
-  // Create the name of char arrays.
-  const UTF8* utf8OfChar = asciizConstructUTF8("[C");
-
-  // Create the base class of char arrays.
-  upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2);
-  
-  // Create the char array.
-  upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar, utf8OfChar,
-                                                 upcalls->OfChar);
-
-  // Alright, now we can repair the damage: set the class to the UTF8s created
-  // and set the array class of UTF8s.
-  ((UTF8*)utf8OfChar)->classOf = upcalls->ArrayOfChar;
-  ((UTF8*)upcalls->OfChar->name)->classOf = upcalls->ArrayOfChar;
-  hashUTF8->array = upcalls->ArrayOfChar;
- 
-  // Create the byte array, so that bytes for classes can be created.
-  upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1);
-  upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte,
-                                                 asciizConstructUTF8("[B"),
-                                                 upcalls->OfByte);
-
+  // Allocate interfaces.
   InterfacesArray = 
     (Class**)allocator.Allocate(2 * sizeof(UserClass*));
-
-  // Now we can create the super and interfaces of arrays.
-  InterfacesArray[0] = loadName(asciizConstructUTF8("java/lang/Cloneable"),
-                                false, false);
   
-  InterfacesArray[1] = loadName(asciizConstructUTF8("java/io/Serializable"),
-                                false, false);
-  
-  SuperArray = loadName(asciizConstructUTF8("java/lang/Object"), false,
-                        false);
-   
-  ClassArray::SuperArray = (Class*)SuperArray->getInternal();
   ClassArray::InterfacesArray = 
     (Class**)allocator.Allocate(2 * sizeof(UserClass*));
-  ClassArray::InterfacesArray[0] = (Class*)InterfacesArray[0]->getInternal();
-  ClassArray::InterfacesArray[1] = (Class*)(InterfacesArray[1]->getInternal());
-  
-  // And repair the damage: set the interfaces and super of array classes already
-  // created.
-  upcalls->ArrayOfChar->setInterfaces(InterfacesArray);
-  upcalls->ArrayOfChar->setSuper(SuperArray);
-  upcalls->ArrayOfByte->setInterfaces(InterfacesArray);
-  upcalls->ArrayOfByte->setSuper(SuperArray);
   
-  // Yay, create the other primitive types.
+  // Create the primitive classes.
+  upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2);
   upcalls->OfBool = UPCALL_PRIMITIVE_CLASS(this, "boolean", 1);
   upcalls->OfShort = UPCALL_PRIMITIVE_CLASS(this, "short", 2);
   upcalls->OfInt = UPCALL_PRIMITIVE_CLASS(this, "int", 4);
@@ -158,8 +104,17 @@
   upcalls->OfFloat = UPCALL_PRIMITIVE_CLASS(this, "float", 4);
   upcalls->OfDouble = UPCALL_PRIMITIVE_CLASS(this, "double", 8);
   upcalls->OfVoid = UPCALL_PRIMITIVE_CLASS(this, "void", 0);
+  upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1);
+  
+  // Create the primitive arrays.
+  upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar,
+                                                 asciizConstructUTF8("[C"),
+                                                 upcalls->OfChar);
+
+  upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte,
+                                                 asciizConstructUTF8("[B"),
+                                                 upcalls->OfByte);
   
-  // And finally create the primitive arrays.
   upcalls->ArrayOfInt = constructPrimitiveArray(ArrayOfInt,
                                                 asciizConstructUTF8("[I"),
                                                 upcalls->OfInt);
@@ -184,13 +139,84 @@
                                                   asciizConstructUTF8("[S"),
                                                   upcalls->OfShort);
   
+  // Fill the maps.
+  primitiveMap[I_VOID] = upcalls->OfVoid;
+  primitiveMap[I_BOOL] = upcalls->OfBool;
+  primitiveMap[I_BYTE] = upcalls->OfByte;
+  primitiveMap[I_CHAR] = upcalls->OfChar;
+  primitiveMap[I_SHORT] = upcalls->OfShort;
+  primitiveMap[I_INT] = upcalls->OfInt;
+  primitiveMap[I_FLOAT] = upcalls->OfFloat;
+  primitiveMap[I_LONG] = upcalls->OfLong;
+  primitiveMap[I_DOUBLE] = upcalls->OfDouble;
+
+  arrayTable[JavaArray::T_BOOLEAN - 4] = upcalls->ArrayOfBool;
+  arrayTable[JavaArray::T_BYTE - 4] = upcalls->ArrayOfByte;
+  arrayTable[JavaArray::T_CHAR - 4] = upcalls->ArrayOfChar;
+  arrayTable[JavaArray::T_SHORT - 4] = upcalls->ArrayOfShort;
+  arrayTable[JavaArray::T_INT - 4] = upcalls->ArrayOfInt;
+  arrayTable[JavaArray::T_FLOAT - 4] = upcalls->ArrayOfFloat;
+  arrayTable[JavaArray::T_LONG - 4] = upcalls->ArrayOfLong;
+  arrayTable[JavaArray::T_DOUBLE - 4] = upcalls->ArrayOfDouble;
+
+
+  // Now that native types have been loaded, try to find if we have a
+  // pre-compiled rt.jar
+  void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL);
+  if (handle) {
+    // Found it!
+    SuperArray = (Class*)dlsym(handle, "java.lang.Object");
+    
+    if (SuperArray) {
+      ClassArray::SuperArray = (Class*)SuperArray->getInternal();
+      // We have the java/lang/Object class, execute the static initializer.
+      static_init_t init = (static_init_t)(uintptr_t)SuperArray->classLoader;
+      assert(init && "Loaded the wrong boot library");
+      init(this);
+    } 
+  }
+    
+  // We haven't found a pre-compiled rt.jar, load the root class ourself.
+  if (!SuperArray) {
+    
+    SuperArray = loadName(asciizConstructUTF8("java/lang/Object"), false,
+                          false);
+    ClassArray::SuperArray = (Class*)SuperArray->getInternal();
+    
+  }
+  
+  // Set the super of array classes.
+#define SET_PARENT(CLASS) \
+  CLASS.setSuper(SuperArray); \
+
+  SET_PARENT(ArrayOfBool)
+  SET_PARENT(ArrayOfByte)
+  SET_PARENT(ArrayOfChar)
+  SET_PARENT(ArrayOfShort)
+  SET_PARENT(ArrayOfInt)
+  SET_PARENT(ArrayOfFloat)
+  SET_PARENT(ArrayOfDouble)
+  SET_PARENT(ArrayOfLong)
+#undef SET_PARENT
+  
+  // 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()); 
+ 
+  // Load array classes that JnJVM internally uses.
   upcalls->ArrayOfString = 
     constructArray(asciizConstructUTF8("[Ljava/lang/String;"));
   
   upcalls->ArrayOfObject = 
     constructArray(asciizConstructUTF8("[Ljava/lang/Object;"));
   
-  
+ 
   Attribut::codeAttribut = asciizConstructUTF8("Code");
   Attribut::exceptionsAttribut = asciizConstructUTF8("Exceptions");
   Attribut::constantAttribut = asciizConstructUTF8("ConstantValue");
@@ -242,24 +268,6 @@
 
 #undef DEF_UTF8
   
-  primitiveMap[I_VOID] = upcalls->OfVoid;
-  primitiveMap[I_BOOL] = upcalls->OfBool;
-  primitiveMap[I_BYTE] = upcalls->OfByte;
-  primitiveMap[I_CHAR] = upcalls->OfChar;
-  primitiveMap[I_SHORT] = upcalls->OfShort;
-  primitiveMap[I_INT] = upcalls->OfInt;
-  primitiveMap[I_FLOAT] = upcalls->OfFloat;
-  primitiveMap[I_LONG] = upcalls->OfLong;
-  primitiveMap[I_DOUBLE] = upcalls->OfDouble;
-
-  arrayTable[JavaArray::T_BOOLEAN - 4] = upcalls->ArrayOfBool;
-  arrayTable[JavaArray::T_BYTE - 4] = upcalls->ArrayOfByte;
-  arrayTable[JavaArray::T_CHAR - 4] = upcalls->ArrayOfChar;
-  arrayTable[JavaArray::T_SHORT - 4] = upcalls->ArrayOfShort;
-  arrayTable[JavaArray::T_INT - 4] = upcalls->ArrayOfInt;
-  arrayTable[JavaArray::T_FLOAT - 4] = upcalls->ArrayOfFloat;
-  arrayTable[JavaArray::T_LONG - 4] = upcalls->ArrayOfLong;
-  arrayTable[JavaArray::T_DOUBLE - 4] = upcalls->ArrayOfDouble;
 }
 
 JnjvmClassLoader::JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader,





More information about the vmkit-commits mailing list