[vmkit-commits] [vmkit] r55183 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClass.cpp.inc Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/JavaJIT.cpp VMCore/JavaMetaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JavaTypes.cpp VMCore/JavaUpcalls.cpp VMCore/Jni.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h VMCore/JnjvmModuleProvider.cpp VMCore/NativeUtil.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Aug 22 09:46:58 PDT 2008
Author: geoffray
Date: Fri Aug 22 11:46:57 2008
New Revision: 55183
URL: http://llvm.org/viewvc/llvm-project?rev=55183&view=rev
Log:
A class knows how to resolve itself, but not how to initialise
itself. A virtual machine knows how to initialise a class.
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 22 11:46:57 2008
@@ -55,7 +55,7 @@
JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader);
CommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str,
- true, false, false);
+ true, false);
if (cl != 0) {
if (clinit) {
cl->initialiseClass();
@@ -244,7 +244,7 @@
CommonClass* cl2 =
(CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl2);
- cl2->resolveClass(false);
+ cl2->resolveClass();
return cl2->isAssignableFrom(cl1);
}
@@ -260,7 +260,7 @@
if (isInterface(cl->access))
return 0;
else {
- cl->resolveClass(false);
+ cl->resolveClass();
if (cl->super) return (jobject)JavaThread::get()->isolate->getClassDelegatee(cl->super);
else return 0;
}
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Fri Aug 22 11:46:57 2008
@@ -69,7 +69,7 @@
JavaString* str = (JavaString*)_str;
JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader;
- CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false, false);
+ CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false);
if (cl != 0) {
return (jclass)cl->getClassDelegatee();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 11:46:57 2008
@@ -275,7 +275,7 @@
} else if (name->elements[start] == AssessorDesc::I_REF) {
const UTF8* componentName = name->javaToInternal(loader->hashUTF8, start + 1,
len - 2);
- CommonClass* cl = loader->loadName(componentName, false, false, true);
+ CommonClass* cl = loader->loadName(componentName, false, true);
return cl->classLoader;
} else {
return JnjvmClassLoader::bootstrapLoader;
@@ -428,7 +428,7 @@
while (res && Tname->elements[prof] == AssessorDesc::I_TAB) {
CommonClass* cl = ((ClassArray*)curS)->baseClass();
++prof;
- classLoader->resolveClass(cl, false);
+ classLoader->resolveClass(cl);
res = curS->isArray && cl && (prof < len);
curS = cl;
}
@@ -528,8 +528,8 @@
return JavaThread::get()->isolate->getClassDelegatee(this, pd);
}
-void CommonClass::resolveClass(bool doClinit) {
- classLoader->resolveClass(this, doClinit);
+void CommonClass::resolveClass() {
+ classLoader->resolveClass(this);
}
void CommonClass::initialiseClass() {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 11:46:57 2008
@@ -386,7 +386,7 @@
/// resolveClass - If the class has not been resolved yet, resolve it.
///
- void resolveClass(bool doClinit);
+ void resolveClass();
#ifndef MULTIPLE_VM
/// getStatus - Get the resolution/initialization status of this class.
@@ -397,12 +397,12 @@
/// isReady - Has this class been initialized?
///
bool isReady() {
- return status == ready;
+ return status >= inClinit;
}
#else
JavaState* getStatus();
bool isReady() {
- return *getStatus() == ready;
+ return *getStatus() >= inClinit;
}
#endif
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 22 11:46:57 2008
@@ -272,10 +272,10 @@
const UTF8* name = UTF8At(ctpDef[index]);
if (name->elements[0] == AssessorDesc::I_TAB) {
temp = loader->constructArray(name);
- loader->resolveClass(temp, false);
+ loader->resolveClass(temp);
} else {
// Put into ctpRes because there is only one representation of the class
- temp = loader->loadName(name, true, false, false);
+ temp = loader->loadName(name, true, false);
}
ctpRes[index] = temp;
}
@@ -429,7 +429,7 @@
assert(sign && "No cached signature after JITting");
utf8 = UTF8At(ctpDef[ntIndex] >> 16);
cl = loadClass(entry >> 16);
- cl->resolveClass(true);
+ cl->resolveClass();
}
void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl,
@@ -440,7 +440,7 @@
assert(sign && "No cached Typedef after JITting");
utf8 = UTF8At(ctpDef[ntIndex] >> 16);
cl = loadClass(entry >> 16);
- cl->resolveClass(true);
+ cl->resolveClass();
}
JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 22 11:46:57 2008
@@ -1655,9 +1655,14 @@
VT = LCI->getVirtualTable(this);
Cl = LCI->getVar(this);
#ifndef MULTIPLE_VM
- if (!cl->isReady())
+ if (!cl->isReady()) {
+#endif
+ Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
+ CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "",
+ currentBlock);
+#ifndef MULTIPLE_VM
+ }
#endif
- Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
}
std::vector<Value*> args;
args.push_back(Size);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Fri Aug 22 11:46:57 2008
@@ -30,8 +30,9 @@
char const* sign, int access, ...) {
CommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className),
- true, true, true);
+ true, true);
+ vm->initialiseClass(cl);
bool stat = access == ACC_STATIC ? true : false;
JavaMethod* method = cl->lookupMethod(loader->asciizConstructUTF8(func),
loader->asciizConstructUTF8(sign), stat,
@@ -91,9 +92,10 @@
#define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
\
TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
- if (!classDef->isReady()) \
- classDef->classLoader->loadName(classDef->name, true, true, true); \
- \
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
verifyNull(obj); \
Signdef* sign = getSignature(); \
void** buf = (void**)alloca(sign->args.size() * sizeof(uint64)); \
@@ -104,8 +106,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
Signdef* sign = getSignature(); \
@@ -117,8 +121,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
Signdef* sign = getSignature(); \
void** buf = (void**)alloca(sign->args.size() * sizeof(uint64)); \
@@ -129,8 +135,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
JavaMethod* meth = obj->classOf->lookupMethod(name, type, false, true);\
@@ -141,8 +149,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
@@ -151,8 +161,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
@@ -188,8 +200,10 @@
#define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
\
TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
- if (!classDef->isReady()) \
- classDef->classLoader->loadName(classDef->name, true, true, true); \
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj); \
void* func = (((void***)obj)[0])[offset];\
@@ -198,8 +212,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
@@ -208,8 +224,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
@@ -217,8 +235,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
void* func = (((void***)obj)[0])[offset];\
@@ -227,8 +247,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
@@ -237,8 +259,10 @@
}\
\
TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
- if (!classDef->isReady())\
- classDef->classLoader->loadName(classDef->name, true, true, true);\
+ if (!classDef->isReady()) { \
+ classDef->classLoader->loadName(classDef->name, true, true); \
+ vm->initialiseClass(classDef); \
+ } \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 11:46:57 2008
@@ -48,6 +48,7 @@
uint32 index = enveloppe->index;
ctpInfo->resolveMethod(index, cl, utf8, sign);
+ assert(obj->classOf->isReady() && "Class not ready in a virtual lookup.");
enveloppe->cacheLock->lock();
CacheNode* rcache = 0;
@@ -66,6 +67,8 @@
if (!rcache) {
JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true);
+ assert(dmeth->classDef->isReady() &&
+ "Class not ready in a virtual lookup.");
if (cache->methPtr) {
rcache = new CacheNode(enveloppe);
} else {
@@ -103,11 +106,12 @@
ctpInfo->resolveField(index, cl, utf8, sign);
JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true);
- field->classDef->initialiseClass();
void* ptr = 0;
if (stat) {
- ptr = (void*)(((uint64)((Class*)cl)->staticInstance()) + field->ptrOffset);
+ Class* fieldCl = field->classDef;
+ JavaThread::get()->isolate->initialiseClass(fieldCl);
+ ptr = (void*)((uint64)(fieldCl->staticInstance()) + field->ptrOffset);
#ifndef MULTIPLE_VM
ctpInfo->ctpRes[index] = ptr;
#endif
@@ -208,6 +212,7 @@
caller->ctpInfo->resolveMethod(index, cl, utf8, sign);
JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false,
true);
+ assert(obj->classOf->isReady() && "Class not ready in a virtual lookup.");
if (!dmeth) {
// Arg, it should have been an invoke interface.... Perform the lookup
// on the object class and do not update offset.
@@ -216,6 +221,8 @@
caller->ctpInfo->ctpRes[index] = (void*)dmeth->offset;
}
+ assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup.");
+
return dmeth->offset;
}
#endif
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Fri Aug 22 11:46:57 2008
@@ -302,15 +302,16 @@
analyseIntern(utf8, start, 1, funcs, intern);
if (funcs != dTab) {
- JavaThread::get()->isolate->unknownError("%s isn't an array", utf8->printString());
+ Jnjvm* vm = JavaThread::get()->isolate;
+ vm->unknownError("%s isn't an array", utf8->printString());
}
analyseIntern(utf8, intern, 0, funcs, pos);
if (funcs == dRef) {
ass = dRef;
- res = loader->loadName(utf8->extract(loader->hashUTF8, intern + 1, pos - 1), false,
- false, true);
+ const UTF8* temp = utf8->extract(loader->hashUTF8, intern + 1, pos - 1);
+ res = loader->loadName(temp, false, true);
} else if (funcs == dTab) {
ass = dTab;
res = loader->constructArray(utf8->extract(loader->hashUTF8, intern, pos));
@@ -412,7 +413,7 @@
if (pseudoAssocClassName == 0) {
return funcs->classType;
} else if (funcs == AssessorDesc::dRef) {
- return loader->loadName(pseudoAssocClassName, false, true, true);
+ return loader->loadName(pseudoAssocClassName, false, true);
} else {
return loader->constructArray(pseudoAssocClassName);
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Fri Aug 22 11:46:57 2008
@@ -305,7 +305,8 @@
void ClasspathThread::createInitialThread(Jnjvm* vm, JavaObject* th) {
JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader;
- JCL->loadName(newVMThread->name, true, true, true);
+ JCL->loadName(newVMThread->name, true, true);
+ vm->initialiseClass(newVMThread);
JavaObject* vmth = newVMThread->doNew(vm);
name->setVirtualObjectField(th, (JavaObject*)vm->asciizToStr("main"));
@@ -315,8 +316,8 @@
assocThread->setVirtualObjectField(vmth, th);
running->setVirtualInt8Field(vmth, (uint32)1);
- JCL->loadName(rootGroup->classDef->name,
- true, true, true);
+ JCL->loadName(rootGroup->classDef->name, true, true);
+ vm->initialiseClass(rootGroup->classDef);
JavaObject* RG = rootGroup->getStaticObjectField();
group->setVirtualObjectField(th, RG);
groupAddThread->invokeIntSpecial(vm, RG, th);
@@ -324,7 +325,8 @@
void ClasspathThread::mapInitialThread(Jnjvm* vm) {
JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader;
- JCL->loadName(newThread->name, true, true, true);
+ JCL->loadName(newThread->name, true, true);
+ vm->initialiseClass(newThread);
JavaObject* th = newThread->doNew(vm);
createInitialThread(vm, th);
JavaThread* myth = JavaThread::get();
@@ -525,10 +527,10 @@
ClasspathException::initialise(vm);
vm->loadName(vm->asciizConstructUTF8("java/lang/String"),
- true, false, false);
+ true, false);
vm->loadName(vm->asciizConstructUTF8("java/lang/Object"),
- true, false, false);
+ true, false);
// Don't compile methods here, we still don't know where to allocate Java
// strings.
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Fri Aug 22 11:46:57 2008
@@ -71,8 +71,8 @@
sint32 len = utf8->size;
- CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true,
- true);
+ CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true);
+ JavaThread::get()->isolate->initialiseClass(cl);
return (jclass)(cl->getClassDelegatee());
END_EXCEPTION
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 11:46:57 2008
@@ -666,9 +666,12 @@
void Jnjvm::loadBootstrap() {
JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader;
#define LOAD_CLASS(cl) \
- loader->loadName(cl->name, true, true, true);
+ loader->loadName(cl->name, true, true);\
+ initialiseClass(cl);
+
LOAD_CLASS(Classpath::newClass);
LOAD_CLASS(Classpath::newConstructor);
+ LOAD_CLASS(Classpath::newString);
LOAD_CLASS(Classpath::newMethod);
LOAD_CLASS(Classpath::newField);
LOAD_CLASS(Classpath::newStackTraceElement);
@@ -712,8 +715,9 @@
appClassLoader->getJavaClassLoader());
// load and initialise math since it is responsible for dlopen'ing
// libjavalang.so and we are optimizing some math operations
- loader->loadName(loader->asciizConstructUTF8("java/lang/Math"),
- true, true, true);
+ CommonClass* math =
+ loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), true, true);
+ initialiseClass(math);
}
void Jnjvm::executeClass(const char* className, ArrayObject* args) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 11:46:57 2008
@@ -121,7 +121,7 @@
cl->display[0] = cl;
cl->virtualTableSize = VT_SIZE / sizeof(void*);
} else {
- cl->super = loadName(super, true, false, true);
+ cl->super = loadName(super, true, true);
int depth = cl->super->depth + 1;
cl->depth = depth;
cl->virtualTableSize = cl->super->virtualTableSize;
@@ -132,7 +132,7 @@
for (int i = 0; i < nbI; i++)
cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i],
- true, false, true));
+ true, true));
}
void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader,
@@ -239,7 +239,7 @@
}
-void JnjvmClassLoader::resolveClass(CommonClass* cl, bool doClinit) {
+void JnjvmClassLoader::resolveClass(CommonClass* cl) {
if (cl->status < resolved) {
cl->acquire();
int status = cl->status;
@@ -252,7 +252,7 @@
if (cl->isArray) {
ClassArray* arrayCl = (ClassArray*)cl;
CommonClass* baseClass = arrayCl->baseClass();
- baseClass->resolveClass(doClinit);
+ baseClass->resolveClass();
cl->status = resolved;
} else {
readClass((Class*)cl);
@@ -273,7 +273,6 @@
cl->release();
}
}
- if (doClinit) cl->initialiseClass();
}
CommonClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) {
@@ -320,7 +319,7 @@
}
CommonClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve,
- bool doClinit, bool doThrow) {
+ bool doThrow) {
CommonClass* cl = internalLoad(name);
@@ -332,14 +331,14 @@
JavaThread::get()->isolate->noClassDefFoundError("unable to load %s", name->printString());
}
- if (cl && doResolve) cl->resolveClass(doClinit);
+ if (cl && doResolve) cl->resolveClass();
return cl;
}
CommonClass* JnjvmClassLoader::lookupClassFromUTF8(const UTF8* utf8, unsigned int start,
unsigned int len,
- bool doResolve, bool doClinit,
+ bool doResolve,
bool doThrow) {
uint32 origLen = len;
const UTF8* name = utf8->javaToInternal(hashUTF8, start, len);
@@ -367,10 +366,9 @@
const UTF8* componentName = utf8->javaToInternal(hashUTF8,
start + 1,
len - 2);
- if (loadName(componentName, doResolve, doClinit,
- doThrow)) {
+ if (loadName(componentName, doResolve, doThrow)) {
ret = constructArray(name);
- if (doResolve) ret->resolveClass(doClinit);
+ if (doResolve) ret->resolveClass();
doLoop = false;
} else {
doLoop = false;
@@ -385,7 +383,7 @@
&& ((uint32)name->size) == start + 1) {
ret = constructArray(name);
- ret->resolveClass(doClinit);
+ ret->resolveClass();
doLoop = false;
} else {
doLoop = false;
@@ -398,15 +396,14 @@
return ret;
} else {
- return loadName(name, doResolve, doClinit, doThrow);
+ return loadName(name, doResolve, doThrow);
}
}
CommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str,
- bool doResolve, bool doClinit,
- bool doThrow) {
+ bool doResolve, bool doThrow) {
return lookupClassFromUTF8(str->value, str->offset, str->count,
- doResolve, doClinit, doThrow);
+ doResolve, doThrow);
}
CommonClass* JnjvmClassLoader::lookupClass(const UTF8* utf8) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 11:46:57 2008
@@ -161,24 +161,22 @@
/// loadName - Loads the class of the given name.
///
- CommonClass* loadName(const UTF8* name, bool doResolve, bool doClinit,
- bool doThrow);
+ CommonClass* loadName(const UTF8* name, bool doResolve, bool doThrow);
/// lookupClassFromUTF8 - Lookup a class from an UTF8 name and load it.
///
CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start,
- unsigned int len,
- bool doResolve, bool doClinit, bool doThrow);
+ unsigned int len, bool doResolve,
+ bool doThrow);
/// lookupClassFromJavaString - Lookup a class from a Java String and load it.
///
- CommonClass* lookupClassFromJavaString(JavaString* str,
- bool doResolve, bool doClinit,
+ CommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve,
bool doThrow);
/// resolveClass - Resolves the class.
///
- void resolveClass(CommonClass* cl, bool doClinit);
+ void resolveClass(CommonClass* cl);
/// lookupClass - Finds the class of th given name in the class loader's
/// table.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Aug 22 11:46:57 2008
@@ -36,9 +36,11 @@
Signdef* sign = 0;
ctpInfo->resolveMethod(index, cl, utf8, sign);
-
JavaMethod* meth = cl->lookupMethod(utf8, sign->keyName, isStatic, true);
+ if (!isVirtual(meth->access))
+ JavaThread::get()->isolate->initialiseClass(cl);
+
meth->compiledPtr();
LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth);
@@ -86,15 +88,18 @@
void* val = meth->compiledPtr();
if (F->isDeclaration())
mvm::jit::executionEngine->updateGlobalMapping(F, val);
-
+
if (isVirtual(meth->access)) {
LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth);
uint64_t offset = LMI->getOffset()->getZExtValue();
assert(meth->classDef->isResolved() && "Class not resolved");
+ assert(meth->classDef->isReady() && "Class not ready");
assert(meth->classDef->virtualVT && "Class has no VT");
assert(meth->classDef->virtualTableSize > offset &&
"The method's offset is greater than the virtual table size");
((void**)meth->classDef->virtualVT)[offset] = val;
+ } else {
+ JavaThread::get()->isolate->initialiseClass(meth->classDef);
}
return false;
Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55183&r1=55182&r2=55183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Fri Aug 22 11:46:57 2008
@@ -229,7 +229,8 @@
CommonClass* NativeUtil::resolvedImplClass(jclass clazz, bool doClinit) {
JavaObject *Cl = (JavaObject*)clazz;
CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl);
- cl->resolveClass(doClinit);
+ cl->resolveClass();
+ JavaThread::get()->isolate->initialiseClass(cl);
return cl;
}
@@ -412,7 +413,7 @@
for (uint16 i = 0; i < nbe; ++i) {
uint16 idx = reader.readU2();
CommonClass* cl = ctp->loadClass(idx);
- cl->resolveClass(false);
+ cl->resolveClass();
JavaObject* obj = cl->getClassDelegatee();
res->elements[i] = obj;
}
More information about the vmkit-commits
mailing list