Verifier should not exit with exceptions pending.
Change-Id: Ibf820594883b345c55e9f636d937aae6506706d6
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 2aa9d7d..1e0cdb1 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1290,23 +1290,17 @@
}
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();
- // CHECK(exception != NULL) << PrettyClass(klass);
- if (exception == NULL) {
- UNIMPLEMENTED(ERROR) << "null verification exception for " << PrettyClass(klass);
- } else {
- klass->SetVerifyErrorClass(exception->GetClass());
- }
- klass->SetStatus(Class::kStatusError);
- return;
- }
- klass->SetStatus(Class::kStatusVerified);
+ if (DexVerifier::VerifyClass(klass)) {
+ klass->SetStatus(Class::kStatusVerified);
+ } else {
+ LOG(ERROR) << "Verification failed on class " << PrettyClass(klass);
+ CHECK(!Thread::Current()->IsExceptionPending()) << PrettyTypeOf(Thread::Current()->GetException());
+
+ CHECK_EQ(klass->GetStatus(), Class::kStatusVerifying);
+ klass->SetStatus(Class::kStatusResolved);
+ }
}
bool ClassLinker::InitializeClass(Class* klass, bool can_run_clinit) {
diff --git a/src/compiler.cc b/src/compiler.cc
index d29e8ca..34263da 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -183,15 +183,8 @@
}
CHECK(klass->IsResolved()) << PrettyClass(klass);
class_linker->VerifyClass(klass);
- CHECK(klass->IsVerified() || klass->IsErroneous()) << PrettyClass(klass);
- //CHECK(!Thread::Current()->IsExceptionPending());
- if (klass->IsErroneous()) {
- Thread* self = Thread::Current();
- if (self->IsExceptionPending()) {
- UNIMPLEMENTED(WARNING) << "Verifier failed to cleanup exceptions internally";
- self->ClearException();
- }
- }
+ CHECK(klass->IsVerified() || klass->IsResolved()) << PrettyClass(klass);
+ CHECK(!Thread::Current()->IsExceptionPending()) << PrettyTypeOf(Thread::Current()->GetException());
}
dex_file.ChangePermissions(PROT_READ);
}