[vmkit-commits] [vmkit] r199581 - Rationalizes the ClassLoader::getType* functions (Java is irrational:))

Gael Thomas gael.thomas at lip6.fr
Sun Jan 19 03:02:14 PST 2014


Author: gthomas
Date: Sun Jan 19 05:02:13 2014
New Revision: 199581

URL: http://llvm.org/viewvc/llvm-project?rev=199581&view=rev
Log:
Rationalizes the ClassLoader::getType* functions (Java is irrational:))

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/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
    vmkit/branches/mcjit/lib/j3/vm/j3signature.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 05:02:13 2014
@@ -88,6 +88,7 @@ namespace j3 {
 		J3Class*         classLoaderClass;
 		J3Field*         classLoaderClassVMData;
 		J3Method*        classLoaderClassLoadClass;
+		J3Method*        classLoaderClassGetSystemClassLoader;
 
 		J3Class*         threadClass;
 		J3Field*         threadClassVMData;

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 05:02:13 2014
@@ -247,6 +247,7 @@ namespace j3 {
 		uint8_t             getCtpType(uint16_t idx);
 		void*               getCtpResolved(uint16_t idx);
 
+		void                utfAt(uint16_t idx, const char** buf, size_t* length);
 		const vmkit::Name*  nameAt(uint16_t idx);
 		float               floatAt(uint16_t idx);
 		double              doubleAt(uint16_t idx);

Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Jan 19 05:02:13 2014
@@ -57,10 +57,12 @@ namespace j3 {
 
 		void                          addNativeLibrary(void* handle);
 
-		J3Type*                       getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify);
-		J3Type*                       getType(J3ObjectType* from, const vmkit::Name* type);       /* find a type */
+		J3Type*                       getTypeInternal(J3ObjectType* from, const char* type, 
+																									size_t start, size_t len, size_t* end, bool unify);
+		J3Type*                       getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* type);       /* find a type */
+		J3ObjectType*                 getTypeFromQualified(J3ObjectType* from, const char* type, size_t length=-1); /* find a type */
 		J3Signature*                  getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */
-		void                          wrongType(J3ObjectType* from, const vmkit::Name* type);
+		void                          wrongType(J3ObjectType* from, const char* type, size_t length);
 
 		uint32_t                      interfaceIndex(J3Method* signature);
 

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=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 05:02:13 2014
@@ -129,6 +129,10 @@ void J3::run() {
 	classLoaderClassVMData     = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type());
 	classLoaderClassLoadClass  = z_method(0, classLoaderClass, names()->get("loadClass"), 
 																				names()->get("(Ljava/lang/String;)Ljava/lang/Class;"));
+	classLoaderClassGetSystemClassLoader = z_method(J3Cst::ACC_STATIC, 
+																									classLoaderClass,
+																									names()->get("getSystemClassLoader"),
+																									names()->get("()Ljava/lang/ClassLoader;"));
 
 	threadClass                = z_class("java/lang/Thread");
 	threadClassRun             = z_method(0, threadClass, names()->get("run"), names()->get("()V"));
@@ -168,14 +172,6 @@ void J3::run() {
 
 	//options()->debugExecute = 0;
 
-#if 0
-	J3Class* loaderClass = z_class("java/lang/ClassLoader");
-	J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, 
-																			 loaderClass,
-																			 names()->get("getSystemClassLoader"),
-																			 names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject;
-#else
-
 	J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC,
 																 z_class("sun/launcher/LauncherHelper"),
 																 names()->get("checkAndLoadMain"),
@@ -183,7 +179,6 @@ void J3::run() {
 		->invokeStatic(1, 1, utfToString("HelloWorld")).valObject;
 
 	fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj());
-#endif
 }
 
 JNIEnv* J3::jniEnv() {

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=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 05:02:13 2014
@@ -598,7 +598,7 @@ void J3Class::readClassBytes(J3Field* hi
 		} else {
 			f->_access     = reader.readU2();
 			f->_name       = nameAt(reader.readU2());
-			f->_type       = loader()->getType(this, nameAt(reader.readU2()));
+			f->_type       = loader()->getTypeFromDescriptor(this, nameAt(reader.readU2()));
 			f->_attributes = readAttributes(&reader);
 		}
 
@@ -814,7 +814,7 @@ J3Field* J3Class::fieldAt(uint16_t idx,
 	J3Type*            type = (J3Type*)ctpResolved[ntIdx];
 
 	if(!type)
-		ctpResolved[ntIdx] = type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
+		ctpResolved[ntIdx] = type = loader()->getTypeFromDescriptor(this, nameAt(ctpValues[ntIdx] & 0xffff));
 	
 	res = cl->findField(access, name, type);
 
@@ -827,18 +827,30 @@ J3ObjectType* J3Class::classAt(uint16_t
 
 	if(res)
 		return res;
-	
-	const vmkit::Name* name = nameAt(ctpValues[idx]);
-	if(name->cStr()[0] == J3Cst::ID_Array)
-		res = loader()->getType(this, name)->asObjectType();
-	else
-		res = loader()->loadClass(name);
+
+	const char* buf;
+	size_t length; 
+
+	utfAt(ctpValues[idx], &buf, &length);
+
+	res = loader()->getTypeFromQualified(this, buf, length);
 
 	ctpResolved[idx] = res;
 
 	return res;
 }
 
+void J3Class::utfAt(uint16_t idx, const char** buf, size_t* length) {
+	check(idx, J3Cst::CONSTANT_Utf8);
+
+	J3Reader reader(_bytes);
+
+	reader.seek(ctpValues[idx], reader.SeekSet);
+
+	*length = reader.readU2();
+	*buf = (const char*)reader.pointer();
+}
+
 const vmkit::Name*  J3Class::nameAt(uint16_t idx) {
 	check(idx, J3Cst::CONSTANT_Utf8);
 	const vmkit::Name* res = (const vmkit::Name*)ctpResolved[idx];
@@ -846,13 +858,11 @@ const vmkit::Name*  J3Class::nameAt(uint
 	if(res)
 		return res;
 
-	J3Reader reader(_bytes);
-
-	reader.seek(ctpValues[idx], reader.SeekSet);
-
-	uint16_t len = reader.readU2(), i=0, n=0;
+	const char* buf;
+	size_t length;
+	utfAt(idx, &buf, &length);
 
-	res = J3Thread::get()->vm()->names()->get((const char*)reader.pointer(), 0, len);
+	res = J3Thread::get()->vm()->names()->get(buf, 0, length);//(const char*)reader.pointer(), 0, len);
 
 	ctpResolved[idx] = (void*)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=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 05:02:13 2014
@@ -114,21 +114,20 @@ J3Class* J3ClassLoader::loadClass(const
 	return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass();
 }
 
-void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) {
-	J3::classFormatError(from, "wrong type: %s", type->cStr());
+void J3ClassLoader::wrongType(J3ObjectType* from, const char* type, size_t length) {
+	J3::classFormatError(from, "wrong type: %s", J3Thread::get()->vm()->names()->get(type, 0, length));
 }
 
-J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) {
+J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const char* type, 
+																			 size_t start, size_t len, size_t* pend, bool unify) {
 	J3*            vm   = J3Thread::get()->vm();
 	J3Type*        res  = 0;
-	const char*    type = typeName->cStr();
-	uint32_t       len  = typeName->length();
 	uint32_t       pos  = start;
 	uint32_t       prof = 0;
 
 	while(!res) {
 		if(pos >= len)
-			wrongType(from, typeName);
+			wrongType(from, type, len);
 
 		switch(type[pos]) {
 			case J3Cst::ID_Array:     prof++; pos++; break;
@@ -138,16 +137,16 @@ J3Type* J3ClassLoader::getTypeInternal(J
 #undef doIt
 			case J3Cst::ID_Classname: 
 				if(unify) {
-					uint32_t start = ++pos;
+					size_t start = ++pos;
 					for(; pos < len && type[pos] != J3Cst::ID_End; pos++);
 					
 					if(type[pos] != J3Cst::ID_End)
-						wrongType(from, typeName);
+						wrongType(from, type, len);
 
 					pos++;
 					res = vm->objectClass;
 				} else {
-					uint32_t start = ++pos;
+					size_t start = ++pos;
 					char buf[len + 1 - start], c;
 					
 					memset(buf, 0, len + 1 - pos);
@@ -156,7 +155,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
 						buf[pos - start] = c;
 					
 					if(type[pos] != J3Cst::ID_End)
-						wrongType(from, typeName);
+						wrongType(from, type, len);
 					
 					buf[pos++ - start] = 0;
 
@@ -166,7 +165,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
 			case J3Cst::ID_Left:
 			case J3Cst::ID_Right:
 			default:
-				wrongType(from, typeName);
+				wrongType(from, type, len);
 		}
 	}
 
@@ -176,34 +175,50 @@ J3Type* J3ClassLoader::getTypeInternal(J
 		if(unify)
 			res = vm->objectClass;
 		else
-			res = res->getArray(prof, start ? 0 : typeName);
+			res = res->getArray(prof);
 	}
 
 	return res;
 }
 
-J3Type* J3ClassLoader::getType(J3ObjectType* from, const vmkit::Name* type) {
+J3Type* J3ClassLoader::getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* typeName) {
 	pthread_mutex_lock(&_mutexTypes);
-	J3Type* res = types[type];
+	J3Type* res = types[typeName];
 	pthread_mutex_unlock(&_mutexTypes);
 
 	if(!res) {
-		uint32_t end;
-		res = getTypeInternal(from, type, 0, &end, 0);
+		const char* type = typeName->cStr();
+		size_t length = typeName->length();
+		size_t end;
+		res = getTypeInternal(from, type, 0, length, &end, 0);
 
-		if(end != type->length())
-			wrongType(from, type);
+		if(end != length)
+			wrongType(from, type, length);
 
 		//printf("Analyse %s => %ls\n", type->cStr(), res->name()->cStr());
 		
 		pthread_mutex_lock(&_mutexTypes);
-		types[type] = res;
+		types[typeName] = res;
 		pthread_mutex_unlock(&_mutexTypes);
 	}
 
 	return res;
 }
 
+J3ObjectType* J3ClassLoader::getTypeFromQualified(J3ObjectType* from, const char* type, size_t length) {
+	if(length == -1)
+		length = strlen(type);
+
+	if(type[0] == J3Cst::ID_Array)
+		return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType();
+	else {
+		char buf[length+1];
+		for(size_t i=0; i<length; i++)
+			buf[i] = type[i];
+		buf[length] = 0;
+		return loadClass(J3Thread::get()->vm()->names()->get(buf));
+	}
+}
 
 J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) {
 	pthread_mutex_lock(&_mutexMethodTypes);

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=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 19 05:02:13 2014
@@ -18,14 +18,16 @@ jint JNICALL GetVersion(JNIEnv* env) {
 }
 
 jclass JNICALL DefineClass(JNIEnv* env, const char* name, jobject loader, const jbyte* buf, jsize len) { enterJVM(); leaveJVM(); NYI(); }
+
 jclass JNICALL FindClass(JNIEnv* env, const char* name) { 
 	jclass res;
 
 	enterJVM();
 	J3Method* m = J3Thread::get()->getJavaCaller();
 	J3* vm = J3Thread::get()->vm();
-	J3ClassLoader* loader = m ? m->cl()->loader() : vm->initialClassLoader;
-	J3Class* cl = loader->loadClass(vm->names()->get(name));
+	J3ClassLoader* loader = m ? m->cl()->loader() : 
+		J3ClassLoader::nativeClassLoader(vm->classLoaderClassGetSystemClassLoader->invokeStatic().valObject);
+	J3ObjectType* cl = loader->getTypeFromQualified(m ? m->cl() : 0, name);
 	cl->initialise();
 	res = cl->javaClass();
 	leaveJVM(); 
@@ -394,7 +396,7 @@ jfieldID JNICALL GetFieldID(JNIEnv* env,
 	enterJVM(); 
 	J3* vm = J3Thread::get()->vm();
 	J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass();
-	res = cl->findField(0, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0);
+	res = cl->findField(0, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0);
 	leaveJVM(); 
 	return res;
 }
@@ -404,7 +406,7 @@ jfieldID JNICALL GetStaticFieldID(JNIEnv
 	enterJVM(); 
 	J3* vm = J3Thread::get()->vm();
 	J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass();
-	res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0);
+	res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0);
 	leaveJVM(); 
 	return res;
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sun Jan 19 05:02:13 2014
@@ -22,13 +22,15 @@ void J3Signature::checkInOut() {
 	if(!_out) {
 		J3Type*            args[1+name()->length()];
 		uint32_t           nbArgs = 0;
-		uint32_t           cur = 1;
+		size_t             cur = 1;
+		const char*        type = name()->cStr();
+		size_t             length = name()->length();
 		
 		if(name()->cStr()[0] != J3Cst::ID_Left)
-			loader()->wrongType(0, name());
+			loader()->wrongType(0, type, length);
 
 		while(name()->cStr()[cur] != J3Cst::ID_Right)
-			args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0);
+			args[nbArgs++] = loader()->getTypeInternal(0, type, cur, length, &cur, 0);
 
 		if(nbArgs != nbIns())
 			J3::internalError("should not happen %d %d", nbArgs, nbIns());
@@ -36,9 +38,9 @@ void J3Signature::checkInOut() {
 		_ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*));
 		memcpy(_ins, args, nbArgs*sizeof(J3Type*));
 
-		_out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* out has to be the last (thread safety) */
-		if(cur != name()->length())
-			loader()->wrongType(0, name());
+		_out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 0); /* out has to be the last (thread safety) */
+		if(cur != length)
+			loader()->wrongType(0, type, length);
 	}
 }
 
@@ -56,20 +58,22 @@ void J3Signature::checkFunctionType() {
 	if(!_virtualLLVMSignature) {
 		std::vector<llvm::Type*> vins;
 		std::vector<llvm::Type*> sins;
-		uint32_t                 cur = 1;
+		size_t                   cur = 1;
+		const char*              type = name()->cStr();
+		size_t                   length = name()->length();
 
 		vins.push_back(J3Thread::get()->vm()->objectClass->llvmType());
 
-		if(name()->cStr()[0] != J3Cst::ID_Left)
-			loader()->wrongType(0, name());
+		if(type[0] != J3Cst::ID_Left)
+			loader()->wrongType(0, type, length);
 
 		while(name()->cStr()[cur] != J3Cst::ID_Right) {
-			llvm::Type* in = loader()->getTypeInternal(0, name(), cur, &cur, 1)->llvmType();
+			llvm::Type* in = loader()->getTypeInternal(0, type, cur, length, &cur, 1)->llvmType();
 			sins.push_back(in);
 			vins.push_back(in);
 		}
 
-		llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType();
+		llvm::Type* out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 1)->llvmType();
 		
 		_staticLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, sins, 0));
 		_virtualLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, vins, 0));





More information about the vmkit-commits mailing list