[vmkit-commits] [vmkit] r55045 - 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 05:44:41 PDT 2008
Author: geoffray
Date: Wed Aug 20 07:44:39 2008
New Revision: 55045
URL: http://llvm.org/viewvc/llvm-project?rev=55045&view=rev
Log:
Change how we get the delegatee of a class, and
how classes are construcuted. They now require the array
of bytes to construct them.
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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 07:44:39 2008
@@ -92,22 +92,9 @@
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);
+ Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);
- 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());
+ return (jclass)(cl->getClassDelegatee((JavaObject*)pd));
}
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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 20 07:44:39 2008
@@ -524,8 +524,8 @@
}
-JavaObject* CommonClass::getClassDelegatee() {
- return JavaThread::get()->isolate->getClassDelegatee(this);
+JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) {
+ return JavaThread::get()->isolate->getClassDelegatee(this, pd);
}
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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 07:44:39 2008
@@ -378,7 +378,7 @@
/// getClassDelegatee - Return the java/lang/Class representation of this
/// class.
///
- JavaObject* getClassDelegatee();
+ JavaObject* getClassDelegatee(JavaObject* pd = 0);
/// 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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 20 07:44:39 2008
@@ -296,7 +296,7 @@
temp = loader->loadName(name, false, false, false);
}
#ifdef MULTIPLE_VM
- if (classDef->isSharedClass() && !temp->isSharedClass()) {
+ if (temp && 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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 20 07:44:39 2008
@@ -321,37 +321,35 @@
}
#ifndef MULTIPLE_VM
-JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) {
+JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) {
cl->acquire();
if (!(cl->delegatee)) {
JavaObject* delegatee = Classpath::newClass->doNew(this);
cl->delegatee = delegatee;
- 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);
+ if (!pd) {
+ Classpath::initClass->invokeIntSpecial(this, delegatee, cl);
+ } else {
+ Classpath::initClassWithProtectionDomain->invokeIntSpecial(this,
+ delegatee,
+ cl, pd);
+ }
}
cl->release();
return cl->delegatee;
}
#else
-JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) {
+JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) {
cl->acquire();
- JavaObject* val = delegatees->lookup(cl);
+ JavaObject* val = this->delegatees->lookup(cl);
if (!val) {
val = Classpath::newClass->doNew(this);
delegatees->hash(cl, val);
- 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,
+ if (!pd) {
+ Classpath::initClass->invokeIntSpecial(this, val, cl);
+ } else {
+ 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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 20 07:44:39 2008
@@ -329,7 +329,7 @@
/// getClassDelegatee - Get the java/lang/Class object representing the
/// internal class.
///
- JavaObject* getClassDelegatee(CommonClass*);
+ JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0);
/// ~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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 07:44:39 2008
@@ -26,6 +26,10 @@
JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0;
+#ifdef MULTIPLE_VM
+JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0;
+#endif
+
extern const char* GNUClasspathGlibj;
extern const char* GNUClasspathLibs;
@@ -256,10 +260,13 @@
CommonClass* cl = lookupClass(name);
- if (!cl || cl->status == hashed) {
- ArrayUInt8* bytes = bootstrapLoader->openName(name);
+ if (!cl) {
+ ArrayUInt8* bytes = openName(name);
+ if (bytes)
+ cl = constructClass(name, bytes);
+ } else if (cl->status == hashed) {
+ ArrayUInt8* bytes = openName(name);
if (bytes) {
- if (!cl) cl = bootstrapLoader->constructClass(name);
if (cl->status == hashed) {
cl->acquire();
if (cl->status == hashed) {
@@ -401,13 +408,26 @@
}
-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);
+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();
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=55045&r1=55044&r2=55045&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 07:44:39 2008
@@ -189,7 +189,7 @@
/// constructClass - Hashes a runtime representation of a class with
/// the given name.
///
- Class* constructClass(const UTF8* name);
+ Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0);
/// constructType - Hashes a Typedef, an internal representation of a class
/// still not loaded.
More information about the vmkit-commits
mailing list