[vmkit-commits] [vmkit] r198173 - ensures that a class is defined in its class loader
Gael Thomas
gael.thomas at lip6.fr
Sun Dec 29 10:18:24 PST 2013
Author: gthomas
Date: Sun Dec 29 12:18:24 2013
New Revision: 198173
URL: http://llvm.org/viewvc/llvm-project?rev=198173&view=rev
Log:
ensures that a class is defined in its class loader
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3classloader.h
vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sun Dec 29 12:18:24 2013
@@ -105,7 +105,7 @@ namespace j3 {
static JNIEnv* jniEnv();
- static void noClassDefFoundError(J3Class* cl) __attribute__((noreturn));
+ static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn));
static void classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn));
static void noSuchMethodError(const wchar_t* msg,
J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn));
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Dec 29 12:18:24 2013
@@ -38,7 +38,7 @@ namespace j3 {
J3ArrayClass* volatile _array;
protected:
- enum { CITED, LOADED, RESOLVED, INITED };
+ enum { LOADED, RESOLVED, INITED };
const vmkit::Name* _name;
char* _nativeName;
@@ -246,13 +246,12 @@ namespace j3 {
void createLLVMTypes();
- void load();
void doResolve(J3Field* hiddenFields, size_t nbHiddenFields);
void doInitialise();
J3Method* interfaceOrMethodAt(uint16_t idx, uint16_t access);
public:
- J3Class(J3ClassLoader* loader, const vmkit::Name* name);
+ J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes);
size_t nbInterfaces() { return _nbInterfaces; }
J3Class** interfaces() { return _interfaces; }
Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Dec 29 12:18:24 2013
@@ -89,12 +89,13 @@ namespace j3 {
const vmkit::Name* name, const vmkit::Name* sign);
J3Method* method(uint16_t access, const wchar_t* clName, const wchar_t* name, const wchar_t* sign);
- J3Class* getClass(const vmkit::Name* name); /* find a class */
+ J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes);
+ J3Class* findLoadedClass(const vmkit::Name* name);
+ virtual J3Class* loadClass(const vmkit::Name* name);
+
J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */
J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */
- virtual J3ClassBytes* lookup(const vmkit::Name* name);
-
void* lookupNativeFunctionPointer(J3Method* method, const char* symb);
};
@@ -108,11 +109,9 @@ namespace j3 {
public:
J3InitialClassLoader(J3* vm, const char* rtjar, vmkit::BumpAllocator* allocator);
- J3ClassBytes* lookup(const vmkit::Name* name);
-
+ J3Class* loadClass(const vmkit::Name* name);
const char* cmangled(const char* demangled) { return _cmangled[demangled]; }
-
- void registerCMangling(const char* mangled, const char* demangled);
+ void registerCMangling(const char* mangled, const char* demangled);
};
}
Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Dec 29 12:18:24 2013
@@ -283,23 +283,23 @@ jclass JNICALL JVM_FindPrimitiveClass(JN
J3Class* res;
if(!strcmp(utf, "boolean"))
- res = loader->getClass(names->get(L"java/lang/Boolean"));
+ res = loader->loadClass(names->get(L"java/lang/Boolean"));
else if(!strcmp(utf, "byte"))
- res = loader->getClass(names->get(L"java/lang/Byte"));
+ res = loader->loadClass(names->get(L"java/lang/Byte"));
else if(!strcmp(utf, "char"))
- res = loader->getClass(names->get(L"java/lang/Character"));
+ res = loader->loadClass(names->get(L"java/lang/Character"));
else if(!strcmp(utf, "short"))
- res = loader->getClass(names->get(L"java/lang/Short"));
+ res = loader->loadClass(names->get(L"java/lang/Short"));
else if(!strcmp(utf, "int"))
- res = loader->getClass(names->get(L"java/lang/Integer"));
+ res = loader->loadClass(names->get(L"java/lang/Integer"));
else if(!strcmp(utf, "long"))
- res = loader->getClass(names->get(L"java/lang/Long"));
+ res = loader->loadClass(names->get(L"java/lang/Long"));
else if(!strcmp(utf, "float"))
- res = loader->getClass(names->get(L"java/lang/Float"));
+ res = loader->loadClass(names->get(L"java/lang/Float"));
else if(!strcmp(utf, "double"))
- res = loader->getClass(names->get(L"java/lang/Double"));
+ res = loader->loadClass(names->get(L"java/lang/Double"));
else if(!strcmp(utf, "void"))
- res = loader->getClass(names->get(L"java/lang/Void"));
+ res = loader->loadClass(names->get(L"java/lang/Void"));
else
J3::internalError(L"unsupported primitive: %s", utf);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Dec 29 12:18:24 2013
@@ -89,23 +89,23 @@ void J3::run() {
nbArrayInterfaces = 2;
arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*));
- arrayInterfaces[0] = initialClassLoader->getClass(names()->get(L"java/lang/Cloneable"));
- arrayInterfaces[1] = initialClassLoader->getClass(names()->get(L"java/io/Serializable"));
+ arrayInterfaces[0] = initialClassLoader->loadClass(names()->get(L"java/lang/Cloneable"));
+ arrayInterfaces[1] = initialClassLoader->loadClass(names()->get(L"java/io/Serializable"));
charArrayClass = typeChar->getArray();
- objectClass = initialClassLoader->getClass(names()->get(L"java/lang/Object"));
+ objectClass = initialClassLoader->loadClass(names()->get(L"java/lang/Object"));
- stringClass = initialClassLoader->getClass(names()->get(L"java/lang/String"));
+ stringClass = initialClassLoader->loadClass(names()->get(L"java/lang/String"));
stringInit = initialClassLoader->method(0, stringClass, initName, names()->get(L"([CZ)V"));
stringValue = stringClass->findVirtualField(names()->get(L"value"), typeChar->getArray());
- classClass = initialClassLoader->getClass(names()->get(L"java/lang/Class"));
+ classClass = initialClassLoader->loadClass(names()->get(L"java/lang/Class"));
J3Field hf(J3Cst::ACC_PRIVATE, names()->get(L"** vmData **"), typeLong);
classClass->resolve(&hf, 1);
classInit = initialClassLoader->method(0, classClass, initName, names()->get(L"()V"));
classVMData = classClass->findVirtualField(hf.name(), hf.type());
- threadVMData = initialClassLoader->getClass(names()->get("java/lang/Thread"))
+ threadVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread"))
->findVirtualField(names()->get(L"eetop"), typeLong);
threadRun = initialClassLoader->method(0, L"java/lang/Thread", L"run", L"()V");
@@ -160,8 +160,8 @@ void J3::nullPointerException() {
internalError(L"implement me: null pointer exception");
}
-void J3::noClassDefFoundError(J3Class* cl) {
- internalError(L"NoClassDefFoundError: %ls (%p - %p)", cl->name()->cStr(), cl, cl->name());
+void J3::noClassDefFoundError(const vmkit::Name* name) {
+ internalError(L"NoClassDefFoundError: %ls", name);
}
void J3::noSuchMethodError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) {
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Dec 29 12:18:24 2013
@@ -285,8 +285,11 @@ J3Field* J3Layout::findField(const vmkit
/*
* ------------ J3Class ------------
*/
-J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name) : J3Layout(loader, name), staticLayout(loader, this, name) {
- status = CITED;
+J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes) :
+ J3Layout(loader, name),
+ staticLayout(loader, this, name){
+ _bytes = bytes;
+ status = LOADED;
}
size_t J3Class::size() {
@@ -437,26 +440,7 @@ void J3Class::doInitialise() {
unlock();
}
-void J3Class::load() {
- if(status < LOADED) {
- lock();
- if(status < LOADED) {
- if(loader()->vm()->options()->debugLoad)
- fprintf(stderr, "Loading: %ls\n", name()->cStr());
-
- _bytes = loader()->lookup(name());
-
- if(!_bytes)
- J3::noClassDefFoundError(this);
-
- status = LOADED;
- }
- unlock();
- }
-}
-
void J3Class::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) {
- load();
lock();
if(status < RESOLVED) {
if(loader()->vm()->options()->debugResolve)
@@ -807,7 +791,7 @@ J3ObjectType* J3Class::classAt(uint16_t
if(name->cStr()[0] == J3Cst::ID_Array)
res = loader()->getType(this, name)->asObjectType();
else
- res = loader()->getClass(name);
+ res = loader()->loadClass(name);
ctpResolved[idx] = res;
Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Dec 29 12:18:24 2013
@@ -66,17 +66,25 @@ void* J3ClassLoader::lookupNativeFunctio
return 0;
}
-J3Class* J3ClassLoader::getClass(const vmkit::Name* name) {
+J3Class* J3ClassLoader::findLoadedClass(const vmkit::Name* name) {
+ pthread_mutex_lock(&_mutexClasses);
+ std::map<const vmkit::Name*, J3Class*>::iterator it = classes.find(name);
+ J3Class* res = it == classes.end() ? 0 : it->second;
+ pthread_mutex_unlock(&_mutexClasses);
+ return res;
+}
+
+J3Class* J3ClassLoader::defineClass(const vmkit::Name* name, J3ClassBytes* bytes) {
pthread_mutex_lock(&_mutexClasses);
J3Class* res = classes[name];
if(!res)
- classes[name] = res = new(allocator()) J3Class(this, name);
+ classes[name] = res = new(allocator()) J3Class(this, name, bytes);
pthread_mutex_unlock(&_mutexClasses);
return res;
}
-J3ClassBytes* J3ClassLoader::lookup(const vmkit::Name* name) {
- J3::internalError(L"should not happen");
+J3Class* J3ClassLoader::loadClass(const vmkit::Name* name) {
+ J3::internalError(L"implement me: loadClass from a Java class loader");
}
void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) {
@@ -120,7 +128,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
buf[pos++ - start] = 0;
- res = getClass(vm()->names()->get(buf));
+ res = loadClass(vm()->names()->get(buf));
}
break;
case J3Cst::ID_Left:
@@ -210,7 +218,7 @@ J3Method* J3ClassLoader::method(uint16_t
}
J3Method* J3ClassLoader::method(uint16_t access, const vmkit::Name* clName, const vmkit::Name* name, const vmkit::Name* sign) {
- return method(access, getClass(clName), name, sign);
+ return method(access, loadClass(clName), name, sign);
}
J3Method* J3ClassLoader::method(uint16_t access, const wchar_t* clName, const wchar_t* name, const wchar_t* sign) {
@@ -253,9 +261,14 @@ J3InitialClassLoader::J3InitialClassLoad
J3::internalError(L"unable to find java library");
}
-J3ClassBytes* J3InitialClassLoader::lookup(const vmkit::Name* name) {
- char tmp[name->length()+16];
+J3Class* J3InitialClassLoader::loadClass(const vmkit::Name* name) {
+ J3Class* res = findLoadedClass(name);
+ if(res)
+ return res;
+
+ char tmp[name->length()+16];
+
//printf("L: %ls\n", name->cStr());
for(int i=0; i<name->length(); i++) {
char c = name->cStr()[i] & 0xff;
@@ -265,10 +278,10 @@ J3ClassBytes* J3InitialClassLoader::look
J3ZipFile* file = archive->getFile(tmp);
if(file) {
- J3ClassBytes* res = new(allocator(), file->ucsize) J3ClassBytes(file->ucsize);
-
- if(archive->readFile(res, file))
- return res;
+ J3ClassBytes* bytes = new(allocator(), file->ucsize) J3ClassBytes(file->ucsize);
+
+ if(archive->readFile(bytes, file))
+ return defineClass(name, bytes);
}
return 0;
Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=198173&r1=198172&r2=198173&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Dec 29 12:18:24 2013
@@ -23,7 +23,7 @@ jclass JNICALL FindClass(JNIEnv* env, co
enterJVM();
J3Method* m = J3Thread::get()->getJavaCaller();
J3ClassLoader* loader = m ? m->cl()->loader() : J3Thread::get()->vm()->initialClassLoader;
- J3Class* cl = loader->getClass(loader->vm()->names()->get(name));
+ J3Class* cl = loader->loadClass(loader->vm()->names()->get(name));
cl->initialise();
res = cl->javaClass();
leaveJVM();
More information about the vmkit-commits
mailing list