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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Nov 25 07:35:07 PST 2008


Author: geoffray
Date: Tue Nov 25 09:34:51 2008
New Revision: 60028

URL: http://llvm.org/viewvc/llvm-project?rev=60028&view=rev
Log:
Create the array class if a constant pool needs it and the
base class is already loaded.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Tue Nov 25 09:34:51 2008
@@ -305,9 +305,7 @@
     JnjvmClassLoader* loader = classDef->classLoader;
     assert(loader && "Class has no loader?");
     const UTF8* name = UTF8At(ctpDef[index]);
-    temp = loader->lookupClass(name);
-    if (!temp && loader != loader->bootstrapLoader)
-      temp = loader->bootstrapLoader->lookupClass(name);
+    temp = loader->lookupClassOrArray(name);
   }
 #endif
   return temp;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Nov 25 09:34:51 2008
@@ -418,6 +418,70 @@
   }
 }
 
+UserCommonClass* JnjvmClassLoader::lookupClassOrArray(const UTF8* name) {
+  UserCommonClass* temp = lookupClass(name);
+  if (temp) return temp;
+
+  if (this != bootstrapLoader) {
+    temp = bootstrapLoader->lookupClassOrArray(name);
+
+    if (temp) return temp;
+  }
+
+  uint32 len = name->size;
+  uint32 start = 0;
+  uint32 origLen = len;
+  bool doLoop = true;
+
+  if (name->elements[0] == I_TAB) {
+    
+    while (doLoop) {
+      --len;
+      if (len == 0) {
+        doLoop = false;
+      } else {
+        ++start;
+        if (name->elements[start] != I_TAB) {
+          if (name->elements[start] == I_REF) {
+            uint32 size = (uint32)name->size;
+            if ((size == (start + 1)) || (size == (start + 2)) || 
+                 (name->elements[start + 1] == I_TAB) || 
+                 (name->elements[origLen - 1] != I_END_REF)) {
+              doLoop = false; 
+            } else {
+              const UTF8* componentName = name->javaToInternal(isolate,
+                                                               start + 1,
+                                                               len - 2);
+              if (lookupClassOrArray(componentName)) {
+                temp = constructArray(name);
+                doLoop = false;
+              } else {
+                doLoop = false;
+              }
+            }
+          } else {
+            uint16 cur = name->elements[start];
+            if ((cur == I_BOOL || cur == I_BYTE ||
+                 cur == I_CHAR || cur == I_SHORT ||
+                 cur == I_INT || cur == I_FLOAT || 
+                 cur == I_DOUBLE || cur == I_LONG)
+                && ((uint32)name->size) == start + 1) {
+
+              temp = constructArray(name);
+              doLoop = false;
+            } else {
+              doLoop = false;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  return temp;
+}
+
+
 UserCommonClass* 
 JnjvmClassLoader::lookupClassFromJavaString(JavaString* str, Jnjvm* vm,
                                             bool doResolve, bool doThrow) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue Nov 25 09:34:51 2008
@@ -161,10 +161,17 @@
   UserCommonClass* lookupClassFromJavaString(JavaString* str, Jnjvm* vm, 
                                              bool doResolve, bool doThrow);
    
-  /// lookupClass - Finds the class of th given name in the class loader's
+  /// lookupClass - Finds the class of the given name in the class loader's
   /// table.
   ///
   UserCommonClass* lookupClass(const UTF8* utf8);
+  
+  /// lookupClassOrArray - Finds the class of the given name in the class
+  /// loader's table. If the class has not been loaded, and if it's an
+  /// array whose base class is loaded, then this function loads the array class
+  /// and returns it.
+  ///
+  UserCommonClass* lookupClassOrArray(const UTF8* utf8);
 
   /// constructArray - Hashes a runtime representation of a class with
   /// the given name.





More information about the vmkit-commits mailing list