[vmkit-commits] [vmkit] r199611 - Also lookup static field in interfaces.

Gael Thomas gael.thomas at lip6.fr
Sun Jan 19 12:53:30 PST 2014


Author: gthomas
Date: Sun Jan 19 14:53:29 2014
New Revision: 199611

URL: http://llvm.org/viewvc/llvm-project?rev=199611&view=rev
Log:
Also lookup static field in interfaces.

Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199611&r1=199610&r2=199611&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 14:53:29 2014
@@ -221,6 +221,10 @@ namespace j3 {
 		void          doInitialise();
 
 		J3Method*     interfaceOrMethodAt(uint16_t idx, uint16_t access, bool isInterfaceMethod);
+
+		J3Method*     findInterfaceMethodRecursive(const vmkit::Name* name, J3Signature* signature);
+		J3Field*      findInterfaceFieldRecursive(const vmkit::Name* name, J3Type* type);
+
 	public:
 		J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source);
 

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=199611&r1=199610&r2=199611&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 14:53:29 2014
@@ -300,8 +300,7 @@ J3Field* J3Layout::localFindField(const
 	for(size_t i=0; i<nbFields(); i++) {
 		J3Field* cur = fields() + i;
 
-		//printf("Compare %s - %s\n", cur->name()->cStr(), cur->type()->name()->cStr());
-		//printf("  with  %s - %s\n", name->cStr(), type->name()->cStr());
+		//printf("  compare with %s - %s\n", cur->name()->cStr(), cur->type()->name()->cStr());
 		if(cur->name() == name && cur->type() == type) {
 			return cur;
 		}
@@ -357,9 +356,7 @@ J3ObjectHandle* J3Class::extractAttribut
 		return J3ObjectHandle::doNewArray(J3Thread::get()->vm()->typeByte->getArray(), 0);
 }
 
-J3Method* J3Class::findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error) {
-	resolve();
-
+J3Method* J3Class::findInterfaceMethodRecursive(const vmkit::Name* name, J3Signature* signature) {
 	J3Class* cur = this;
 	while(1) {
 		J3Method* res = cur->localFindMethod(name, signature);
@@ -371,19 +368,29 @@ J3Method* J3Class::findInterfaceMethod(c
 			case 1: cur = cur->interfaces()[0]; break;
 			default:
 				for(uint32_t i=0; i<cur->nbInterfaces(); i++) {
-					res = cur->interfaces()[i]->findInterfaceMethod(name, signature, error);
+					res = cur->interfaces()[i]->findInterfaceMethodRecursive(name, signature);
 					if(res)
 						return res;
 				}
 			case 0:
-				if(error)
-					J3::noSuchMethodError("no such interface method", this, name, signature);
-				else
-					return 0;
+				return 0;
 		}
 	}
 }
 
+J3Method* J3Class::findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error) {
+	resolve();
+	J3Method* res = findInterfaceMethodRecursive(name, signature);
+
+	if(res)
+		return res;
+
+	if(error)
+		J3::noSuchMethodError("no such interface method", this, name, signature);
+	else
+		return 0;
+}
+
 J3Method* J3Class::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) {
 	resolve();
 
@@ -401,28 +408,67 @@ J3Method* J3Class::findMethod(uint32_t a
 			else
 				return 0;
 		}
+
 		cur = cur->super();
 	}
 }
 
+J3Field* J3Class::findInterfaceFieldRecursive(const vmkit::Name* name, J3Type* type) {
+	J3Class* cur = this;
+
+	while(1) {
+		J3Field* res = cur->staticLayout()->localFindField(name, type);
+
+		if(res)
+			return res;
+
+		switch(cur->nbInterfaces()) {
+			case 1: cur = cur->interfaces()[0]; break;
+			default:
+				for(uint32_t i=0; i<cur->nbInterfaces(); i++) {
+					res = cur->interfaces()[i]->findInterfaceFieldRecursive(name, type);
+					if(res)
+						return res;
+				}
+			case 0:
+				return 0;
+		}
+	}
+}
+
 J3Field* J3Class::findField(uint32_t access, const vmkit::Name* name, J3Type* type, bool error) {
-	//loader()->vm()->log("Lookup: %s %s in %s", type->name()->cStr(), name->cStr(), J3Class::name()->cStr());
 	resolve();
+
 	J3Class* cur = this;
 
 	while(1) {
 		J3Layout* layout = J3Cst::isStatic(access) ? (J3Layout*)cur->staticLayout() : cur;
 		J3Field* res = layout->localFindField(name, type);
 
+		//fprintf(stderr, "[%d] Lookup: %s %s in %s\n", access, type->name()->cStr(), name->cStr(), cur->name()->cStr());
+
 		if(res)
 			return res;
 
 		if(cur == cur->super()) {
+			if(J3Cst::isStatic(access)) {
+				J3Class* prev = 0;
+				for(cur=this; cur!=prev; cur=cur->super()) {
+					for(uint32_t i=0; i<cur->nbInterfaces(); i++) {
+						res = cur->interfaces()[i]->findInterfaceFieldRecursive(name, type);
+						if(res)
+							return res;
+					}
+					prev = cur;
+				}
+			}
+
 			if(error)
 				J3::noSuchFieldError("no such field", this, name, type);
 			else
 				return 0;
 		}
+
 		cur = cur->super();
 	}
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=199611&r1=199610&r2=199611&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 14:53:29 2014
@@ -53,13 +53,15 @@ J3Signature::function_t J3Method::cxxCal
 }
 
 void J3Method::aotCompile() {
-	fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr());
-	ensureCompiled(0, 1);
+	if(!J3Cst::isAbstract(access())) {
+		fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr());
+		ensureCompiled(0, 1);
+	}
 }
 
 void J3Method::ensureCompiled(bool withCaller, bool onlyTranslate) {
 	if(!fnPtr() || (withCaller && !cxxCaller())) {
-		// fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr());
+		//fprintf(stderr, "materializing: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr());
 		J3CodeGen::translate(this, !fnPtr(), withCaller, onlyTranslate);
  	}
 }

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199611&r1=199610&r2=199611&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sun Jan 19 14:53:29 2014
@@ -38,11 +38,11 @@ VMKit::VMKit(vmkit::BumpAllocator* alloc
 	_allocator = allocator;
 	pthread_mutex_init(&safepointMapLock, 0);
 
-	//pthread_mutexattr_t attr;
-	//pthread_mutexattr_init(&attr);
-	//pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-	pthread_mutex_init(&_compilerLock, 0);
-	//pthread_mutexattr_destroy(&attr);
+	pthread_mutexattr_t attr;
+	pthread_mutexattr_init(&attr);
+	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+	pthread_mutex_init(&_compilerLock, &attr);
+	pthread_mutexattr_destroy(&attr);
 }
 
 void* VMKit::operator new(size_t n, vmkit::BumpAllocator* allocator) {





More information about the vmkit-commits mailing list