[vmkit-commits] [vmkit] r55046 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Aug 20 06:02:16 PDT 2008


Author: geoffray
Date: Wed Aug 20 08:02:15 2008
New Revision: 55046

URL: http://llvm.org/viewvc/llvm-project?rev=55046&view=rev
Log:
Revert 55045, it causes single vm to segfault.


Modified:
    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/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h

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=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 08:02:15 2008
@@ -92,9 +92,22 @@
   JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader);
   JavaString* str = (JavaString*)_str;
   const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count);
-  Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);
+  Class* cl = JCL->constructClass(name);
 
-  return (jclass)(cl->getClassDelegatee((JavaObject*)pd));
+  if (cl->status == hashed) {
+    cl->acquire();
+    if (cl->status == hashed) {
+      cl->bytes = (ArrayUInt8*)bytes;
+      cl->status = loaded;
+#ifndef MULTIPLE_VM
+      cl->delegatee = (JavaObject*)pd;
+#else
+      JavaThread::get()->isolate->delegatees->hash(cl, (JavaObject*)pd);
+#endif
+    }
+    cl->release();
+  }
+  return (jclass)(cl->getClassDelegatee());
 }
 
 JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 20 08:02:15 2008
@@ -524,8 +524,8 @@
   
 }
 
-JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) {
-  return JavaThread::get()->isolate->getClassDelegatee(this, pd);
+JavaObject* CommonClass::getClassDelegatee() {
+  return JavaThread::get()->isolate->getClassDelegatee(this);
 }
 
 void CommonClass::resolveClass(bool doClinit) {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 08:02:15 2008
@@ -378,7 +378,7 @@
   /// getClassDelegatee - Return the java/lang/Class representation of this
   /// class.
   ///
-  JavaObject* getClassDelegatee(JavaObject* pd = 0);
+  JavaObject* getClassDelegatee();
 
   /// initialiseClass - If the class has a static initializer and has not been
   /// initialized yet, call it.

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 20 08:02:15 2008
@@ -296,7 +296,7 @@
       temp = loader->loadName(name, false, false, false);
     }
 #ifdef MULTIPLE_VM
-    if (temp && classDef->isSharedClass() && !temp->isSharedClass()) {
+    if (classDef->isSharedClass() && !temp->isSharedClass()) {
       JavaThread::get()->isolate->unknownError("Class sharing violation");
     }
 #endif

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 20 08:02:15 2008
@@ -321,35 +321,37 @@
 }
 
 #ifndef MULTIPLE_VM
-JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) {
+JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) {
   cl->acquire();
   if (!(cl->delegatee)) {
     JavaObject* delegatee = Classpath::newClass->doNew(this);
     cl->delegatee = delegatee;
-    if (!pd) {
-      Classpath::initClass->invokeIntSpecial(this, delegatee, cl);
-    } else {
-      Classpath::initClassWithProtectionDomain->invokeIntSpecial(this,
-                                                                 delegatee,
-                                                                 cl, pd);
-    }
+    Classpath::initClass->invokeIntSpecial(this, delegatee, cl);
+  } else if (cl->delegatee->classOf != Classpath::newClass) {
+    JavaObject* pd = cl->delegatee;
+    JavaObject* delegatee = Classpath::newClass->doNew(this);
+    cl->delegatee = delegatee;;
+    Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, delegatee,
+                                                               cl, pd);
   }
   cl->release();
   return cl->delegatee;
 }
 #else
-JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) {
+JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) {
   cl->acquire();
-  JavaObject* val = this->delegatees->lookup(cl);
+  JavaObject* val = delegatees->lookup(cl);
   if (!val) {
     val = Classpath::newClass->doNew(this);
     delegatees->hash(cl, val);
-    if (!pd) {
-      Classpath::initClass->invokeIntSpecial(this, val, cl);
-    } else {
-      Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl,
+    Classpath::initClass->invokeIntSpecial(this, val, cl);
+  } else if (val->classOf != Classpath::newClass) {
+    JavaObject* pd = val;
+    val = Classpath::newClass->doNew(this);
+    delegatees->remove(cl);
+    delegatees->hash(cl, val);
+    Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl,
                                                                pd);
-    }
   }
   cl->release();
   return val;

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 20 08:02:15 2008
@@ -329,7 +329,7 @@
   /// getClassDelegatee - Get the java/lang/Class object representing the
   /// internal class.
   ///
-  JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0);
+  JavaObject* getClassDelegatee(CommonClass*);
 
   /// ~Jnjvm - Destroy the JVM.
   ///

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 08:02:15 2008
@@ -26,10 +26,6 @@
 
 JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0;
 
-#ifdef MULTIPLE_VM
-JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0;
-#endif
-
 extern const char* GNUClasspathGlibj;
 extern const char* GNUClasspathLibs;
 
@@ -260,13 +256,10 @@
   
   CommonClass* cl = lookupClass(name);
   
-  if (!cl) {
-    ArrayUInt8* bytes = openName(name);
-    if (bytes)
-      cl = constructClass(name, bytes);
-  } else if (cl->status == hashed) {
-    ArrayUInt8* bytes = openName(name);
+  if (!cl || cl->status == hashed) {
+    ArrayUInt8* bytes = bootstrapLoader->openName(name);
     if (bytes) {
+      if (!cl) cl = bootstrapLoader->constructClass(name);
       if (cl->status == hashed) {
         cl->acquire();
         if (cl->status == hashed) {
@@ -408,26 +401,13 @@
 }
 
 
-Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) {
-  classes->lock->lock();
-  ClassMap::iterator End = classes->map.end();
-  ClassMap::iterator I = classes->map.find(name);
-  Class* res = 0;
-  if (I == End) {
-    res = allocator_new(allocator, Class)(this, name);
-    if (bytes) {
-      res->bytes = bytes;
-      res->status = loaded;
-    }
-    classes->map.insert(std::make_pair(name, res));
-  } else {
-    res = ((Class*)(I->second));
-    if (res->status == hashed && bytes) {
-      res->bytes = bytes;
-      res->status = loaded;
-    }
-  }
-  classes->lock->unlock();
+static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) {
+  Class* cl = allocator_new(loader->allocator, Class)(loader, name);
+  return cl;
+}
+
+Class* JnjvmClassLoader::constructClass(const UTF8* name) {
+  Class* res = (Class*)classes->lookupOrCreate(name, this, classDup);
   return res;
 }
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55046&r1=55045&r2=55046&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 08:02:15 2008
@@ -189,7 +189,7 @@
   /// constructClass - Hashes a runtime representation of a class with
   /// the given name.
   ///
-  Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0);
+  Class*      constructClass(const UTF8* name);
   
   /// constructType - Hashes a Typedef, an internal representation of a class
   /// still not loaded.





More information about the vmkit-commits mailing list