Tolerant compilation of classes with missing super classes
Change-Id: If64f25ae36204ab2ea5499f27601696dea9d4016
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 1c25f61..fb47c48 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -39,6 +39,7 @@
void ThrowVirtualMachineError(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
+ UNIMPLEMENTED(FATAL) << "VirtualMachineError is abstract, throw something else";
Thread::Current()->ThrowNewExceptionV("Ljava/lang/VirtualMachineError;", fmt, args);
va_end(args);
}
@@ -1649,8 +1650,10 @@
if (klass->GetSuperClassTypeIdx() != DexFile::kDexNoIndex) {
Class* super_class = ResolveType(dex_file, klass->GetSuperClassTypeIdx(), klass);
if (super_class == NULL) {
- ThrowVirtualMachineError("Failed to resolve superclass with type index %d for class %s",
- klass->GetSuperClassTypeIdx(), PrettyDescriptor(klass->GetDescriptor()).c_str());
+ DCHECK(Thread::Current()->IsExceptionPending());
+ // TODO: can't ThrowVirtualMachineError, its abstract
+ // ThrowVirtualMachineError("Failed to resolve superclass with type index %d for class %s",
+ // klass->GetSuperClassTypeIdx(), PrettyDescriptor(klass->GetDescriptor()).c_str());
return false;
}
klass->SetSuperClass(super_class);
@@ -2062,8 +2065,8 @@
Field* field = fields->Get(i);
if (false) { // enable to debug field layout
LOG(INFO) << "LinkFields: " << (instance ? "instance" : "static")
- << " class=" << klass->GetDescriptor()->ToModifiedUtf8()
- << " field=" << field->GetName()->ToModifiedUtf8()
+ << " class=" << PrettyClass(klass)
+ << " field=" << PrettyField(field)
<< " offset=" << field->GetField32(MemberOffset(Field::OffsetOffset()), false);
}
const Class* type = field->GetTypeDuringLinking();
@@ -2242,8 +2245,12 @@
const char* name = dex_file.dexStringById(field_id.name_idx_);
Class* field_type = ResolveType(dex_file, field_id.type_idx_, dex_cache, class_loader);
- // TODO: LinkageError?
- CHECK(field_type != NULL);
+ if (field_type == NULL) {
+ // TODO: LinkageError?
+ UNIMPLEMENTED(WARNING) << "Failed to resolve type of field " << name
+ << " in " << PrettyClass(klass);
+ return NULL;
+}
if (is_static) {
resolved = klass->FindStaticField(name, field_type);
} else {