[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