summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/verifier/method_verifier.cc38
1 files changed, 19 insertions, 19 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 9183b5f53c..59ead892e1 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -90,28 +90,28 @@ MethodVerifier::FailureKind MethodVerifier::VerifyClass(const mirror::Class* kla
if (klass->IsVerified()) {
return kNoFailure;
}
- mirror::Class* super = klass->GetSuperClass();
- if (super == NULL && strcmp("Ljava/lang/Object;", ClassHelper(klass).GetDescriptor()) != 0) {
- *error = "Verifier rejected class ";
- *error += PrettyDescriptor(klass);
- *error += " that has no super class";
- return kHardFailure;
- }
- if (super != NULL && super->IsFinal()) {
- *error = "Verifier rejected class ";
- *error += PrettyDescriptor(klass);
- *error += " that attempts to sub-class final class ";
- *error += PrettyDescriptor(super);
- return kHardFailure;
- }
+ bool early_failure = false;
+ std::string failure_message;
ClassHelper kh(klass);
const DexFile& dex_file = kh.GetDexFile();
const DexFile::ClassDef* class_def = kh.GetClassDef();
- if (class_def == NULL) {
- *error = "Verifier rejected class ";
- *error += PrettyDescriptor(klass);
- *error += " that isn't present in dex file ";
- *error += dex_file.GetLocation();
+ mirror::Class* super = klass->GetSuperClass();
+ if (super == NULL && strcmp("Ljava/lang/Object;", kh.GetDescriptor()) != 0) {
+ early_failure = true;
+ failure_message = " that has no super class";
+ } else if (super != NULL && super->IsFinal()) {
+ early_failure = true;
+ failure_message = " that attempts to sub-class final class " + PrettyDescriptor(super);
+ } else if (class_def == NULL) {
+ early_failure = true;
+ failure_message = " that isn't present in dex file " + dex_file.GetLocation();
+ }
+ if (early_failure) {
+ *error = "Verifier rejected class " + PrettyDescriptor(klass) + failure_message;
+ if (Runtime::Current()->IsCompiler()) {
+ ClassReference ref(&dex_file, klass->GetDexClassDefIndex());
+ AddRejectedClass(ref);
+ }
return kHardFailure;
}
Thread* self = Thread::Current();