[vmkit-commits] [vmkit] r197973 - define a vt even for abstract classes

Gael Thomas gael.thomas at lip6.fr
Tue Dec 24 02:01:52 PST 2013


Author: gthomas
Date: Tue Dec 24 04:01:52 2013
New Revision: 197973

URL: http://llvm.org/viewvc/llvm-project?rev=197973&view=rev
Log:
define a vt even for abstract classes

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

Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=197973&r1=197972&r2=197973&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Tue Dec 24 04:01:52 2013
@@ -47,7 +47,7 @@ namespace j3 {
 
 	private:
 		J3Type*               _type;
-		J3TypeChecker         checker;
+		J3TypeChecker         _checker;
 		// see: Bowen Alpern, Anthony Cocchi, Stephen Fink, and David Grove. 2001. 
 		// Efficient implementation of Java interfaces: Invokeinterface considered harmless. OOPSLA 2001.
 		void*                 _interfaceMethodTable[nbInterfaceMethodTable];
@@ -62,8 +62,10 @@ namespace j3 {
 		static J3VirtualTable* create(J3ArrayClass* cl);
 		static J3VirtualTable* create(J3Primitive* prim);
 
-		uint32_t      offset() { return checker.offset; }
-		bool          isPrimaryChecker() { return checker.offset < J3TypeChecker::cacheOffset; }
+		J3TypeChecker* checker() { return &_checker; }
+
+		uint32_t      offset() { return _checker.offset; }
+		bool          isPrimaryChecker() { return _checker.offset < J3TypeChecker::cacheOffset; }
 
 		bool          slowIsAssignableTo(J3VirtualTable* parent);
 		bool          fastIsAssignableToPrimaryChecker(J3VirtualTable* parent, uint32_t parentOffset);

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=197973&r1=197972&r2=197973&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Dec 24 04:01:52 2013
@@ -158,28 +158,28 @@ J3ObjectHandle* J3ObjectType::javaClass(
 
 void J3ObjectType::prepareInterfaceTable() {
 #if 0
-	struct {
-		uint32_t   nbSlots;
-		J3Method** slots;
-	} slots[nbInterfaceMethodTable];
-	
 	for(uint32_t i=0; i<nbInterfaceMethodTable; i++)
 		slots[i].nbSlots = 0;
+#endif
 
-	for(uint32_t i=0; i<res->checker.nbSecondaryTypes; i++) {
-		J3Class* ifce = res->checker.secondaryTypes[i]->type()->asClass();
-		fprintf(stderr, "processing: %ls from %ls\n", ifce->name()->cStr(), cl->name()->cStr());
-		if(J3Cst::isInterface(ifce->access())) {
-			for(uint32_t j=0; j<ifce->nbMethods(); j++) {
-				J3Method* base = ifce->methods()[j];
-				fprintf(stderr, "  %s lookup %ls %ls::%ls in %ls\n", 
-								J3Cst::isAbstract(base->access()) ? "abstract" : "concrete",
-								base->sign()->cStr(), base->cl()->name()->cStr(), base->name()->cStr(), cl->name()->cStr());
-				J3Method* method = cl->findVirtualMethod(base->name(), base->sign(), 1);
+	for(uint32_t i=0; i<vt()->checker()->nbSecondaryTypes; i++) {
+		J3Type* type = vt()->checker()->secondaryTypes[i]->type();
+		//		fprintf(stderr, "   %p %ls type is %p - %p\n", vt(), name()->cStr(), vt()->checker()->secondaryTypes[i], type);
+
+		if(type->isClass()) {
+			J3Class* ifce = vt()->checker()->secondaryTypes[i]->type()->asClass();
+			//			fprintf(stderr, "processing: %ls from %ls\n", ifce->name()->cStr(), name()->cStr());
+			if(J3Cst::isInterface(ifce->access())) {
+				for(uint32_t j=0; j<ifce->nbMethods(); j++) {
+					J3Method* base = ifce->methods()[j];
+					//					fprintf(stderr, "  %s lookup %ls %ls::%ls in %ls\n", 
+					//									J3Cst::isAbstract(base->access()) ? "abstract" : "concrete",
+					//									base->sign()->cStr(), base->cl()->name()->cStr(), base->name()->cStr(), name()->cStr());
+					J3Method* method = findVirtualMethod(base->name(), base->sign(), J3Cst::isAbstract(base->access()));
+				}
 			}
 		}
 	}
-#endif
 }
 
 /*  
@@ -413,7 +413,8 @@ void J3Class::doResolve(J3Field* hiddenF
 
 		_vt = J3VirtualTable::create(this);
 
-		prepareInterfaceTable();
+		if(!J3Cst::isInterface(access()) && !J3Cst::isAbstract(access()))
+			prepareInterfaceTable();
 
 		//fprintf(stderr, "virtual part of %ls: ", name()->cStr());
 		//llvmType()->getContainedType(0)->dump();

Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=197973&r1=197972&r2=197973&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Tue Dec 24 04:01:52 2013
@@ -63,7 +63,7 @@ J3VirtualTable* J3VirtualTable::create(J
 	}
 
 	/* virtual table */
-	uint32_t isConcrete = !J3Cst::isInterface(cl->access()) && ! J3Cst::isAbstract(cl->access());
+	uint32_t isConcrete = !J3Cst::isInterface(cl->access());
 
 	n = isConcrete ? n : 0;
 
@@ -79,8 +79,9 @@ J3VirtualTable* J3VirtualTable::create(J
 		for(uint32_t i=0; i<nbInterfaceMethodTable; i++)
 			res->_interfaceMethodTable[i] = interfaceTrampoline;
 
-		for(uint32_t i=0; i<cl->nbMethods(); i++) 
+		for(uint32_t i=0; i<cl->nbMethods(); i++) {
 			res->_virtualMethods[pm[i]->index()] = pm[i]->functionPointerOrVirtualTrampoline();
+		}
 	}
 
 	return res;
@@ -133,11 +134,11 @@ J3VirtualTable* J3VirtualTable::create(J
 		super->resolve();
 		//printf("%ls super is %ls (%d)\n", cl->name()->cStr(), super->name()->cStr(), isSecondary);
 
-		uint32_t n = baseClass->vt()->checker.nbSecondaryTypes;
+		uint32_t n = baseClass->vt()->checker()->nbSecondaryTypes;
 		secondaries = (J3Type**)alloca(n*sizeof(J3Type*));
 
 		for(uint32_t i=0; i<n; i++) {
-			secondaries[nbSecondaries] = baseClass->vt()->checker.secondaryTypes[i]->type();
+			secondaries[nbSecondaries] = baseClass->vt()->checker()->secondaryTypes[i]->type();
 			if(secondaries[i] != baseClass) { /* don't add myself */
 				secondaries[nbSecondaries] = secondaries[nbSecondaries]->getArray(dim);
 				nbSecondaries++;
@@ -166,71 +167,70 @@ void* J3VirtualTable::operator new(size_
 J3VirtualTable::J3VirtualTable(J3Type* type, J3Type* super, J3Type** interfaces, uint32_t nbInterfaces, bool isSecondary) {
 	_type = type;
 
-	//printf("***   Building the vt of %ls based on %ls\n", type->name()->cStr(), super->name()->cStr());
+	//	printf("***   Building the vt of %ls based on %ls at %p\n", type->name()->cStr(), super->name()->cStr(), this);
 
 	if(super == type) {
-		checker.offset = 0;
-		checker.display[checker.offset] = this;
+		checker()->offset = 0;
+		checker()->display[checker()->offset] = this;
 		if(nbInterfaces)
 			J3::internalError(L"a root J3VirtualTable should not have interfaces");
 	} else {
-		uint32_t parentDisplayLength = super->vt()->checker.offset + 1;
+		uint32_t parentDisplayLength = super->vt()->checker()->offset + 1;
 
-		//printf("%ls (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker.secondaryTypes, checker.display[6], parentDisplayLength);
+		//printf("%ls (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker()->secondaryTypes, checker()->display[6], parentDisplayLength);
 
 		if(parentDisplayLength >= J3TypeChecker::cacheOffset)
 			isSecondary = 1;
 
-		memcpy(checker.display, super->vt()->checker.display, parentDisplayLength*sizeof(J3VirtualTable*));
+		memcpy(checker()->display, super->vt()->checker()->display, parentDisplayLength*sizeof(J3VirtualTable*));
 
-		checker.nbSecondaryTypes = super->vt()->checker.nbSecondaryTypes + nbInterfaces + isSecondary;
-		checker.secondaryTypes = (J3VirtualTable**)super->loader()->allocator()->allocate(checker.nbSecondaryTypes*sizeof(J3VirtualTable*));
+		checker()->nbSecondaryTypes = super->vt()->checker()->nbSecondaryTypes + nbInterfaces + isSecondary;
+		checker()->secondaryTypes = (J3VirtualTable**)super->loader()->allocator()->allocate(checker()->nbSecondaryTypes*sizeof(J3VirtualTable*));
 		
 		//printf("%ls: %d - %d %d\n", type->name()->cStr(), isSecondary, parentDisplayLength, J3TypeChecker::displayLength);
 		if(isSecondary) {
-			checker.offset = J3TypeChecker::cacheOffset;
-			checker.secondaryTypes[0] = this;
+			checker()->offset = J3TypeChecker::cacheOffset;
+			checker()->secondaryTypes[0] = this;
 		} else {
-			checker.offset = parentDisplayLength;
-			checker.display[checker.offset] = this;
+			checker()->offset = parentDisplayLength;
+			checker()->display[checker()->offset] = this;
 		} 
 
-		memcpy(checker.secondaryTypes + isSecondary, 
-					 super->vt()->checker.secondaryTypes, 
-					 super->vt()->checker.nbSecondaryTypes*sizeof(J3VirtualTable*));
+		memcpy(checker()->secondaryTypes + isSecondary, 
+					 super->vt()->checker()->secondaryTypes, 
+					 super->vt()->checker()->nbSecondaryTypes*sizeof(J3VirtualTable*));
 
-		for(uint32_t i=0, n=isSecondary+super->vt()->checker.nbSecondaryTypes; i<nbInterfaces; i++) {
+		for(uint32_t i=0, n=isSecondary+super->vt()->checker()->nbSecondaryTypes; i<nbInterfaces; i++) {
 			J3Type* sec = interfaces[i];
-			//printf("In %ls - adding %ls at %d\n", type->name()->cStr(), sec->name()->cStr(), isSecondary+i);
 			sec->resolve();
-			checker.secondaryTypes[n++] = sec->vt();
+			checker()->secondaryTypes[n++] = sec->vt();
 		}
 	}
 
-	if(checker.nbSecondaryTypes) {
-		std::sort(checker.secondaryTypes, &checker.secondaryTypes[checker.nbSecondaryTypes]);
-		J3VirtualTable** it = std::unique(checker.secondaryTypes, &checker.secondaryTypes[checker.nbSecondaryTypes]);
-		checker.nbSecondaryTypes = std::distance(checker.secondaryTypes, it);
+	if(checker()->nbSecondaryTypes) {
+		std::sort(checker()->secondaryTypes, &checker()->secondaryTypes[checker()->nbSecondaryTypes]);
+		J3VirtualTable** it = std::unique(checker()->secondaryTypes, &checker()->secondaryTypes[checker()->nbSecondaryTypes]);
+		checker()->nbSecondaryTypes = std::distance(checker()->secondaryTypes, it);
 	}
 
 	//dump();
 }
 
 bool J3VirtualTable::slowIsAssignableTo(J3VirtualTable* parent) {
-	for(uint32_t i=0; i<checker.nbSecondaryTypes; i++)
-		if(checker.secondaryTypes[i] == parent) {
-			checker.display[J3TypeChecker::cacheOffset] = parent;
+	for(uint32_t i=0; i<checker()->nbSecondaryTypes; i++)
+		if(checker()->secondaryTypes[i] == parent) {
+			checker()->display[J3TypeChecker::cacheOffset] = parent;
 			return true;
 		}
 	return false;
 }
 
 bool J3VirtualTable::fastIsAssignableToPrimaryChecker(J3VirtualTable* parent, uint32_t parentOffset) {
-	return checker.display[parentOffset] == parent;
+	return checker()->display[parentOffset] == parent;
 }
 
 bool J3VirtualTable::fastIsAssignableToNonPrimaryChecker(J3VirtualTable* parent) {
-	if(checker.display[J3TypeChecker::cacheOffset] == parent)
+	if(checker()->display[J3TypeChecker::cacheOffset] == parent)
 		return true;
 	else if(parent == this)
 		return true;
@@ -239,8 +239,8 @@ bool J3VirtualTable::fastIsAssignableToN
 }
 
 bool J3VirtualTable::isAssignableTo(J3VirtualTable* parent) {
-	uint32_t parentOffset = parent->checker.offset;
-	if(checker.display[parentOffset] == parent)
+	uint32_t parentOffset = parent->checker()->offset;
+	if(checker()->display[parentOffset] == parent)
 		return true;
 	else if(parentOffset != J3TypeChecker::cacheOffset)
 		return false;
@@ -254,7 +254,7 @@ void J3VirtualTable::dump() {
 	fprintf(stderr, "VirtualTable: %s%ls (%p)\n", 
 					type()->isLayout() && !type()->isClass() ? "static_" : "",
 					type()->name()->cStr(), this);
-	checker.dump();
+	checker()->dump();
 
 }
 





More information about the vmkit-commits mailing list