mirror of
https://github.com/corda/corda.git
synced 2025-06-01 23:20:54 +00:00
check superinterfaces when looking up methods and fields
This commit is contained in:
parent
4ae3a1267a
commit
cb563f76e1
@ -250,6 +250,23 @@ walk(Thread*, Heap::Walker* w, uint32_t* mask, unsigned fixedSize,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object
|
||||||
|
findInInterfaces(Thread* t, object class_, object name, object spec,
|
||||||
|
object (*find)(Thread*, object, object, object))
|
||||||
|
{
|
||||||
|
object result = 0;
|
||||||
|
if (classInterfaceTable(t, class_)) {
|
||||||
|
for (unsigned i = 0;
|
||||||
|
i < arrayLength(t, classInterfaceTable(t, class_)) and result == 0;
|
||||||
|
i += 2)
|
||||||
|
{
|
||||||
|
result = find
|
||||||
|
(t, arrayBody(t, classInterfaceTable(t, class_), i), name, spec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
finalizerTargetUnreachable(Thread* t, Heap::Visitor* v, object* p)
|
finalizerTargetUnreachable(Thread* t, Heap::Visitor* v, object* p)
|
||||||
{
|
{
|
||||||
@ -2710,7 +2727,8 @@ resolveField(Thread* t, object class_, const char* fieldName,
|
|||||||
object spec = makeByteArray(t, fieldSpec);
|
object spec = makeByteArray(t, fieldSpec);
|
||||||
PROTECT(t, spec);
|
PROTECT(t, spec);
|
||||||
|
|
||||||
object field = 0;
|
object field = findInInterfaces(t, class_, name, spec, findFieldInClass);
|
||||||
|
|
||||||
for (; class_ != 0 and field == 0; class_ = classSuper(t, class_)) {
|
for (; class_ != 0 and field == 0; class_ = classSuper(t, class_)) {
|
||||||
field = findFieldInClass(t, class_, name, spec);
|
field = findFieldInClass(t, class_, name, spec);
|
||||||
}
|
}
|
||||||
@ -2900,9 +2918,17 @@ findInHierarchy(Thread* t, object class_, object name, object spec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (o == 0) {
|
if (o == 0) {
|
||||||
|
if (find == findFieldInClass) {
|
||||||
|
o = findInInterfaces(t, class_, name, spec, find);
|
||||||
|
}
|
||||||
|
|
||||||
for (; o == 0 and class_; class_ = classSuper(t, class_)) {
|
for (; o == 0 and class_; class_ = classSuper(t, class_)) {
|
||||||
o = find(t, class_, name, spec);
|
o = find(t, class_, name, spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (o == 0 and find == findMethodInClass) {
|
||||||
|
o = findInInterfaces(t, class_, name, spec, find);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o == 0) {
|
if (o == 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user