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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue May 5 12:56:41 PDT 2009


Author: geoffray
Date: Tue May  5 14:56:16 2009
New Revision: 71007

URL: http://llvm.org/viewvc/llvm-project?rev=71007&view=rev
Log:
Lookup a class array before looking for his base class.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    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=71007&r1=71006&r2=71007&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue May  5 14:56:16 2009
@@ -1400,13 +1400,14 @@
      
       bool newSecondaryTypes = false;
       bool intf = base->isInterface();
-      const UTF8* superName = 0;
-
+      ClassArray* super = 0;
+      
       if (base->isPrimitive()) {
         // If the base class is primitive, then the super is one
         // dimension below, e.g. the super of int[][] is Object[].
         --dim;
-        superName = JCL->constructArrayName(dim, C->super->name);
+        const UTF8* superName = JCL->constructArrayName(dim, C->super->name);
+        super = JCL->constructArray(superName);
       } else if (base == C->super) {
         // If the base class is java.lang.Object, then the super is one
         // dimension below, e.g. the super of Object[][] is Object[].
@@ -1414,17 +1415,17 @@
         // so it must create a new secondary type list.
         --dim;
         newSecondaryTypes = true;
-        superName = JCL->constructArrayName(dim, C->super->name);
+        super = C->baseClass()->asArrayClass();
       } else {
         // If the base class is any other class, interface or not,
         // the super is of the dimension of the current array class,
         // and whose base class is the super of this base class.
-        superName = JCL->constructArrayName(dim, base->super->name);
+        const UTF8* superName = JCL->constructArrayName(dim, base->super->name);
+        JnjvmClassLoader* superLoader = base->super->classLoader;
+        super = superLoader->constructArray(superName);
       }
-     
-      // Construct the super array class, e.g. java.lang.Object[] for
-      // java.lang.Class[].
-      ClassArray* super = JCL->constructArray(superName);
+    
+      assert(super && "No super found");
       JavaVirtualTable* superVT = super->virtualVT;
       depth = superVT->depth + 1;
       

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue May  5 14:56:16 2009
@@ -545,7 +545,7 @@
     UserCommonClass* baseClass = loadBaseClass(name, start + 1, len - 1);
     JnjvmClassLoader* loader = baseClass->classLoader;
     const UTF8* arrayName = name->extract(loader->hashUTF8, start, start + len);
-    return loader->constructArray(arrayName);
+    return loader->constructArray(arrayName, baseClass);
   } else if (name->elements[start] == I_REF) {
     const UTF8* componentName = name->extract(hashUTF8,
                                               start + 1, start + len - 1);
@@ -562,10 +562,13 @@
 
 
 UserClassArray* JnjvmClassLoader::constructArray(const UTF8* name) {
+  ClassArray* res = (ClassArray*)lookupClass(name);
+  if (res) return res;
+
   UserCommonClass* cl = loadBaseClass(name, 1, name->size - 1);
   assert(cl && "no base class for an array");
   JnjvmClassLoader* ld = cl->classLoader;
-  UserClassArray* res = ld->constructArray(name, cl);
+  res = ld->constructArray(name, cl);
   
   if (res && res->classLoader != this) {
     classes->lock.lock();





More information about the vmkit-commits mailing list