diff options
author | Jeff Hao <jeffhao@google.com> | 2013-12-12 14:29:15 -0800 |
---|---|---|
committer | Jeff Hao <jeffhao@google.com> | 2013-12-12 14:29:15 -0800 |
commit | 22cb09b35e8eb30c016065f0eec4b3b96666de43 (patch) | |
tree | 5e8872faa27defdba218acdfc863885ca9d4a2da | |
parent | 8ff6e5967f93ec1188e34834c1f1240b516e32dc (diff) | |
download | art-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.cc | 2 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.h | 5 |
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_; |