summaryrefslogtreecommitdiffstats
path: root/runtime/mirror/object-inl.h
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2015-08-06 15:34:15 -0700
committerMathieu Chartier <mathieuc@google.com>2015-08-12 15:50:24 -0700
commite4275c07e9852a6944f47efa9d0591fceb8e8e36 (patch)
tree92d5e69374f88555f454d137e5d60fb1c925b4d8 /runtime/mirror/object-inl.h
parent82b844fb449ddc5d7b4e43e71a55eb934a1b0b45 (diff)
downloadart-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.h16
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);