summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Hao <jeffhao@google.com>2013-12-12 14:29:15 -0800
committerJeff Hao <jeffhao@google.com>2013-12-12 14:29:15 -0800
commit22cb09b35e8eb30c016065f0eec4b3b96666de43 (patch)
tree5e8872faa27defdba218acdfc863885ca9d4a2da
parent8ff6e5967f93ec1188e34834c1f1240b516e32dc (diff)
downloadart-22cb09b35e8eb30c016065f0eec4b3b96666de43.zip
art-22cb09b35e8eb30c016065f0eec4b3b96666de43.tar.gz
art-22cb09b35e8eb30c016065f0eec4b3b96666de43.tar.bz2
Add class to verifier's rejected list if superclass is erroneous.
This will prevent the compiler from trying to compile one of these classes, which will fail because it has no GC map. Bug: 12104117 Change-Id: I77ec77d30ee5dc92d7f4c594f1e8f1ce9b67855d
-rw-r--r--runtime/class_linker.cc2
-rw-r--r--runtime/verifier/method_verifier.h5
2 files changed, 4 insertions, 3 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index a98673d..643c183 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -2489,6 +2489,8 @@ void ClassLinker::VerifyClass(const SirtRef<mirror::Class>& klass) {
if (cause.get() != nullptr) {
self->GetException(nullptr)->SetCause(cause.get());
}
+ ClassReference ref(klass->GetDexCache()->GetDexFile(), klass->GetDexClassDefIndex());
+ verifier::MethodVerifier::AddRejectedClass(ref);
klass->SetStatus(mirror::Class::kStatusError, self);
return;
}
diff --git a/runtime/verifier/method_verifier.h b/runtime/verifier/method_verifier.h
index 6b5747b..dffda96 100644
--- a/runtime/verifier/method_verifier.h
+++ b/runtime/verifier/method_verifier.h
@@ -212,6 +212,8 @@ class MethodVerifier {
static void Init() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
static void Shutdown();
+ static void AddRejectedClass(ClassReference ref)
+ LOCKS_EXCLUDED(rejected_classes_lock_);
static bool IsClassRejected(ClassReference ref)
LOCKS_EXCLUDED(rejected_classes_lock_);
@@ -662,9 +664,6 @@ class MethodVerifier {
static ReaderWriterMutex* rejected_classes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
static RejectedClassesTable* rejected_classes_ GUARDED_BY(rejected_classes_lock_);
- static void AddRejectedClass(ClassReference ref)
- LOCKS_EXCLUDED(rejected_classes_lock_);
-
RegTypeCache reg_types_;
PcToRegisterLineTable reg_table_;