[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