From 22cb09b35e8eb30c016065f0eec4b3b96666de43 Mon Sep 17 00:00:00 2001 From: Jeff Hao Date: Thu, 12 Dec 2013 14:29:15 -0800 Subject: 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 --- runtime/class_linker.cc | 2 ++ 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& 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_; -- cgit v1.1