diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-08-06 15:34:15 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-08-12 15:50:24 -0700 |
commit | e4275c07e9852a6944f47efa9d0591fceb8e8e36 (patch) | |
tree | 92d5e69374f88555f454d137e5d60fb1c925b4d8 /runtime/mirror/object-inl.h | |
parent | 82b844fb449ddc5d7b4e43e71a55eb934a1b0b45 (diff) | |
download | art-e4275c07e9852a6944f47efa9d0591fceb8e8e36.tar.gz art-e4275c07e9852a6944f47efa9d0591fceb8e8e36.tar.bz2 art-e4275c07e9852a6944f47efa9d0591fceb8e8e36.zip |
Visit class roots from ClassLoader::VisitReferences
This causes the classes of a class loader to get marked when that
class loader gets marked instead of during class root visiting.
Bug: 22720414
Change-Id: If53f042aff1d9f7bf94ecbe6886601edda029b7d
Diffstat (limited to 'runtime/mirror/object-inl.h')
-rw-r--r-- | runtime/mirror/object-inl.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index c5610b5a2e..7b1660ba7e 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -25,6 +25,7 @@ #include "array-inl.h" #include "class.h" #include "class_linker.h" +#include "class_loader-inl.h" #include "lock_word-inl.h" #include "monitor.h" #include "object_array-inl.h" @@ -997,6 +998,18 @@ inline void Object::VisitStaticFieldsReferences(mirror::Class* klass, const Visi klass->VisitFieldsReferences<kVisitClass, true>(0, visitor); } + +template<VerifyObjectFlags kVerifyFlags> +inline bool Object::IsClassLoader() { + return GetClass<kVerifyFlags>()->IsClassLoaderClass(); +} + +template<VerifyObjectFlags kVerifyFlags> +inline mirror::ClassLoader* Object::AsClassLoader() { + DCHECK(IsClassLoader<kVerifyFlags>()); + return down_cast<mirror::ClassLoader*>(this); +} + template <const bool kVisitClass, VerifyObjectFlags kVerifyFlags, typename Visitor, typename JavaLangRefVisitor> inline void Object::VisitReferences(const Visitor& visitor, @@ -1010,6 +1023,9 @@ inline void Object::VisitReferences(const Visitor& visitor, } else if (kVisitClass) { visitor(this, ClassOffset(), false); } + } else if (klass->IsClassLoaderClass()) { + mirror::ClassLoader* class_loader = AsClassLoader<kVerifyFlags>(); + class_loader->VisitReferences<kVisitClass, kVerifyFlags>(klass, visitor); } else { DCHECK(!klass->IsVariableSize()); VisitInstanceFieldsReferences<kVisitClass>(klass, visitor); |