Fix for 073-mismatched-field test
ART distinguishes between static and instance field resolution whereas
Java doesn't. Interface static fields bind more closely than those of
superclasses. Implement field resolution code for the verifier so that
it can determine incompatible class change errors when a static field
binds before an instance field.
Also don't search all iftable interfaces, search them in superclass
order (as the specification dictates).
Change-Id: I43b45bada8b9099ad805b244be10833d59bacfe3
diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc
index 46a5bec..e002917 100644
--- a/src/dex_verifier.cc
+++ b/src/dex_verifier.cc
@@ -3304,7 +3304,7 @@
}
Field* DexVerifier::GetStaticField(int field_idx) {
- Field* field = Runtime::Current()->GetClassLinker()->ResolveField(field_idx, method_, true);
+ Field* field = Runtime::Current()->GetClassLinker()->ResolveFieldJLS(field_idx, method_);
if (field == NULL) {
const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx);
LOG(INFO) << "unable to resolve static field " << field_idx << " ("
@@ -3327,7 +3327,7 @@
}
Field* DexVerifier::GetInstanceField(const RegType& obj_type, int field_idx) {
- Field* field = Runtime::Current()->GetClassLinker()->ResolveField(field_idx, method_, false);
+ Field* field = Runtime::Current()->GetClassLinker()->ResolveFieldJLS(field_idx, method_);
if (field == NULL) {
const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx);
LOG(INFO) << "unable to resolve instance field " << field_idx << " ("