[vmkit-commits] [vmkit] r115424 - in /vmkit/trunk/lib/J3/VMCore: JavaClass.cpp JavaClass.h Jni.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sat Oct 2 14:48:51 PDT 2010
Author: geoffray
Date: Sat Oct 2 16:48:51 2010
New Revision: 115424
URL: http://llvm.org/viewvc/llvm-project?rev=115424&view=rev
Log:
Set the resolution to be only loading exceptions used by methods in the class. Now constructing a class creates the VT.
Modified:
vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.h
vmkit/trunk/lib/J3/VMCore/Jni.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sat Oct 2 16:48:51 2010
@@ -705,19 +705,6 @@
}
-void UserClass::loadParents() {
- if (super == 0) {
- virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
- } else {
- super->resolveClass();
- virtualTableSize = super->virtualTableSize;
- }
-
- for (unsigned i = 0; i < nbInterfaces; i++)
- interfaces[i]->resolveClass();
-}
-
-
void internalLoadExceptions(JavaMethod& meth) {
Attribut* codeAtt = meth.lookupAttribut(Attribut::codeAttribut);
@@ -742,7 +729,7 @@
reader.readU2();
uint16 catche = reader.readU2();
- if (catche) meth.classDef->ctpInfo->loadClass(catche);
+ if (catche) meth.classDef->ctpInfo->loadClass(catche, false);
}
}
}
@@ -815,6 +802,11 @@
}
void Class::makeVT() {
+ if (super == NULL) {
+ virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
+ } else {
+ virtualTableSize = super->virtualTableSize;
+ }
for (uint32 i = 0; i < nbVirtualMethods; ++i) {
JavaMethod& meth = virtualMethods[i];
@@ -837,11 +829,6 @@
}
}
- if (super) {
- assert(virtualTableSize >= super->virtualTableSize &&
- "Size of virtual table less than super!");
- }
-
mvm::BumpPtrAllocator& allocator = classLoader->allocator;
virtualVT = new(allocator, virtualTableSize) JavaVirtualTable(this);
}
@@ -948,24 +935,24 @@
readFields(reader);
readMethods(reader);
attributs = readAttributs(reader, nbAttributs);
- setIsRead();
}
+void UserClass::resolveParents() {
+ if (super != NULL) {
+ super->resolveClass();
+ }
+
+ for (unsigned i = 0; i < nbInterfaces; i++)
+ interfaces[i]->resolveClass();
+}
+
+
#ifndef ISOLATE_SHARING
void Class::resolveClass() {
if (isResolved() || isErroneous()) return;
- readClass();
- loadParents();
- makeVT();
- JavaCompiler *Comp = classLoader->getCompiler();
- Comp->resolveVirtualClass(this);
- Comp->resolveStaticClass(this);
+ resolveParents();
loadExceptions();
setResolved();
- if (!needsInitialisationCheck()) {
- setInitializationState(ready);
- }
- assert(virtualVT && "No virtual VT after resolution");
}
#else
void Class::resolveClass() {
@@ -1339,8 +1326,6 @@
bool UserClass::needsInitialisationCheck() {
- if (!isClassRead()) return true;
-
if (isReady()) return false;
if (super && super->needsInitialisationCheck())
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sat Oct 2 16:48:51 2010
@@ -50,7 +50,7 @@
/// and accessing static fields of the class) when it is in the ready state.
///
#define loaded 0 /// The .class file has been found.
-#define classRead 1 /// The .class file has been read.
+#define resolving 1 /// The .class file is being resolved.
#define resolved 2 /// The class has been resolved.
#define vmjc 3 /// The class is defined in a shared library.
#define inClinit 4 /// The class is cliniting.
@@ -627,11 +627,6 @@
///
void readParents(Reader& reader);
- /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
- /// of the class.
- ///
- void loadParents();
-
/// loadExceptions - Loads and resolves the exception classes used in catch
/// clauses of methods defined in this class.
///
@@ -676,6 +671,7 @@
/// resolveClass - If the class has not been resolved yet, resolve it.
///
void resolveClass();
+ void resolveParents();
/// initialiseClass - If the class has not been initialized yet,
/// initialize it.
@@ -726,10 +722,10 @@
getCurrentTaskClassMirror().status = erroneous;
}
- /// setIsRead - The class file has been read.
+ /// setIsResolving - The class file is being resolved.
///
- void setIsRead() {
- getCurrentTaskClassMirror().status = classRead;
+ void setIsResolving() {
+ getCurrentTaskClassMirror().status = resolving;
}
@@ -747,9 +743,9 @@
}
}
- void setIsRead() {
+ void setIsResolving() {
for (uint32 i = 0; i < NR_ISOLATES; ++i) {
- IsolateInfo[i].status = classRead;
+ IsolateInfo[i].status = resolving;
}
}
@@ -815,15 +811,9 @@
/// isResolving - Is the class currently being resolved?
///
bool isResolving() {
- return getCurrentTaskClassMirror().status == classRead;
+ return getCurrentTaskClassMirror().status == resolving;
}
- /// isClassRead - Has the .class file been read?
- ///
- bool isClassRead() {
- return getCurrentTaskClassMirror().status >= classRead;
- }
-
/// isNativeOverloaded - Is the method overloaded with a native function?
///
bool isNativeOverloaded(JavaMethod* meth);
@@ -837,8 +827,6 @@
///
void fillIMT(std::set<JavaMethod*>* meths);
-private:
-
/// makeVT - Create the virtual table of this class.
///
void makeVT();
Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Sat Oct 2 16:48:51 2010
@@ -73,7 +73,10 @@
else loader = vm->appClassLoader;
UserCommonClass* cl = loader->loadClassFromAsciiz(asciiz, true, true);
- if (cl && cl->asClass()) cl->asClass()->initialiseClass(vm);
+ if (cl && cl->asClass()) {
+ assert(cl->asClass()->isResolved());
+ cl->asClass()->initialiseClass(vm);
+ }
jclass res = (jclass)cl->getClassDelegateePtr(vm);
RETURN_FROM_JNI(res);
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sat Oct 2 16:48:51 2010
@@ -528,7 +528,7 @@
return loadName(name, doResolve, doThrow, strName);
}
- return 0;
+ return NULL;
}
UserCommonClass* JnjvmClassLoader::loadClassFromAsciiz(const char* asciiz,
@@ -536,6 +536,7 @@
bool doThrow) {
const UTF8* name = hashUTF8->lookupAsciiz(asciiz);
mvm::ThreadAllocator threadAllocator;
+ UserCommonClass* result = NULL;
if (!name) name = bootstrapLoader->hashUTF8->lookupAsciiz(asciiz);
if (!name) {
uint32 size = strlen(asciiz);
@@ -549,12 +550,15 @@
name = temp;
}
- UserCommonClass* temp = lookupClass(name);
- if (temp) return temp;
-
- if (this != bootstrapLoader) {
- temp = bootstrapLoader->lookupClassOrArray(name);
- if (temp) return temp;
+ result = lookupClass(name);
+ if ((result == NULL) && (this != bootstrapLoader)) {
+ result = bootstrapLoader->lookupClassOrArray(name);
+ if (result != NULL) {
+ if (result->isClass() && doResolve) {
+ result->asClass()->resolveClass();
+ }
+ return result;
+ }
}
return loadClassFromUserUTF8(name, doResolve, doThrow, NULL);
@@ -679,7 +683,10 @@
TRY {
const UTF8* internalName = readerConstructUTF8(name->elements, name->size);
res = new(allocator, "Class") UserClass(this, internalName, bytes);
- res->resolveClass();
+ res->readClass();
+ res->makeVT();
+ getCompiler()->resolveVirtualClass(res);
+ getCompiler()->resolveStaticClass(res);
classes->lock.lock();
bool success = classes->map.insert(std::make_pair(internalName, res)).second;
classes->lock.unlock();
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=115424&r1=115423&r2=115424&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Sat Oct 2 16:48:51 2010
@@ -302,6 +302,7 @@
///
Class* loadClassFromSelf(Jnjvm* vm, const char* name);
+ friend class Class;
};
/// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which
More information about the vmkit-commits
mailing list