[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