[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