[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