[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