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) {