Tolerant compilation of classes with missing super classes
Change-Id: If64f25ae36204ab2ea5499f27601696dea9d4016
diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc
index 6ea276f..ee81543 100644
--- a/src/dex_verifier.cc
+++ b/src/dex_verifier.cc
@@ -2548,6 +2548,7 @@
inst_field = GetInstField(vdata, obj_type, dec_insn.vC_, &failure);
if (failure != VERIFY_ERROR_NONE)
break;
+ DCHECK(inst_field != NULL);
CheckFinalFieldAccess(method, inst_field, &failure);
if (failure != VERIFY_ERROR_NONE)
break;
@@ -3802,6 +3803,7 @@
method->GetDeclaringClass(), failure, false);
if (field == NULL) {
LOG(ERROR) << "VFY: unable to resolve instance field " << field_idx;
+ *failure = VERIFY_ERROR_GENERIC;
return field;
}
@@ -4436,13 +4438,14 @@
const DexFile::FieldId& field_id = dex_file->GetFieldId(field_idx);
Class* klass = ResolveClassAndCheckAccess(dex_file, field_id.class_idx_, referrer, failure);
if (klass == NULL) {
- DCHECK(*failure != VERIFY_ERROR_NONE);
+ DCHECK(*failure != VERIFY_ERROR_NONE) << PrettyClass(referrer);
return NULL;
}
Class* field_type = ResolveClassAndCheckAccess(dex_file, field_id.type_idx_, referrer, failure);
if (field_type == NULL) {
- DCHECK(*failure != VERIFY_ERROR_NONE);
+ // TODO: restore this assert?
+ // DCHECK(*failure != VERIFY_ERROR_NONE) << PrettyClass(referrer) << " " << PrettyClass(klass);
return NULL;
}
@@ -4692,8 +4695,10 @@
void DexVerifier::CheckFinalFieldAccess(const Method* method,
const Field* field, VerifyError* failure) {
- if (!field->IsFinal())
+ DCHECK(field != NULL);
+ if (!field->IsFinal()) {
return;
+ }
/* make sure we're in the same class */
if (method->GetDeclaringClass() != field->GetDeclaringClass()) {