Enabled verification in the compiler and some other verifier fixes.

The verifier still needs to be able to continue execution after it fails
to resolve a class or method. The structure for that doesn't exist yet.

Change-Id: Ie32f6f9971fed02b645ba715bc5164f86f70f1c6
diff --git a/src/class_linker.cc b/src/class_linker.cc
index dde29cf..037887d 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1168,8 +1168,29 @@
   return NULL;
 }
 
+void ClassLinker::VerifyClass(Class* klass) {
+  if (klass->IsVerified()) {
+    return;
+  }
+
+  CHECK_EQ(klass->GetStatus(), Class::kStatusResolved);
+
+  klass->SetStatus(Class::kStatusVerifying);
+  if (!DexVerifier::VerifyClass(klass)) {
+    LOG(ERROR) << "Verification failed on class "
+               << klass->GetDescriptor()->ToModifiedUtf8();
+    Object* exception = Thread::Current()->GetException();
+    klass->SetVerifyErrorClass(exception->GetClass());
+    klass->SetStatus(Class::kStatusError);
+    return;
+  }
+
+  klass->SetStatus(Class::kStatusVerified);
+}
+
 bool ClassLinker::InitializeClass(Class* klass) {
   CHECK(klass->GetStatus() == Class::kStatusResolved ||
+      klass->GetStatus() == Class::kStatusVerified ||
       klass->GetStatus() == Class::kStatusInitializing ||
       klass->GetStatus() == Class::kStatusError)
           << PrettyDescriptor(klass->GetDescriptor()) << " is " << klass->GetStatus();
@@ -1185,18 +1206,10 @@
         return false;
       }
 
-      CHECK(klass->GetStatus() == Class::kStatusResolved);
-
-      klass->SetStatus(Class::kStatusVerifying);
-      if (!DexVerifier::VerifyClass(klass)) {
-        LG << "Verification failed";  // TODO: ThrowVerifyError
-        Object* exception = self->GetException();
-        klass->SetVerifyErrorClass(exception->GetClass());
-        klass->SetStatus(Class::kStatusError);
+      VerifyClass(klass);
+      if (klass->GetStatus() != Class::kStatusVerified) {
         return false;
       }
-
-      klass->SetStatus(Class::kStatusVerified);
     }
 
     if (klass->GetStatus() == Class::kStatusInitialized) {