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 {