diff options
Diffstat (limited to 'runtime/mirror/class_ext-inl.h')
-rw-r--r-- | runtime/mirror/class_ext-inl.h | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/runtime/mirror/class_ext-inl.h b/runtime/mirror/class_ext-inl.h index ead02eed3b..fd81a2a3ed 100644 --- a/runtime/mirror/class_ext-inl.h +++ b/runtime/mirror/class_ext-inl.h @@ -21,8 +21,11 @@ #include "array-inl.h" #include "art_method-inl.h" +#include "base/enums.h" #include "handle_scope.h" +#include "mirror/object.h" #include "object-inl.h" +#include "verify_object.h" namespace art { namespace mirror { @@ -89,6 +92,12 @@ inline ObjPtr<PointerArray> ClassExt::GetStaticJFieldIDs() { } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline ObjPtr<Class> ClassExt::GetObsoleteClass() { + return GetFieldObject<Class, kVerifyFlags, kReadBarrierOption>( + OFFSET_OF_OBJECT_MEMBER(ClassExt, obsolete_class_)); +} + +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline ObjPtr<PointerArray> ClassExt::GetJMethodIDs() { return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(ClassExt, jmethod_ids_)); @@ -116,15 +125,58 @@ inline ObjPtr<Object> ClassExt::GetOriginalDexFile() { template<ReadBarrierOption kReadBarrierOption, class Visitor> void ClassExt::VisitNativeRoots(Visitor& visitor, PointerSize pointer_size) { + VisitMethods<kReadBarrierOption>([&](ArtMethod* method) { + method->VisitRoots<kReadBarrierOption>(visitor, pointer_size); + }, pointer_size); +} + +template<ReadBarrierOption kReadBarrierOption, class Visitor> +void ClassExt::VisitMethods(Visitor visitor, PointerSize pointer_size) { ObjPtr<PointerArray> arr(GetObsoleteMethods<kDefaultVerifyFlags, kReadBarrierOption>()); - if (arr.IsNull()) { - return; + if (!arr.IsNull()) { + int32_t len = arr->GetLength(); + for (int32_t i = 0; i < len; i++) { + ArtMethod* method = arr->GetElementPtrSize<ArtMethod*>(i, pointer_size); + if (method != nullptr) { + visitor(method); + } + } + } +} + +template<ReadBarrierOption kReadBarrierOption, class Visitor> +void ClassExt::VisitJMethodIDs(Visitor v) { + ObjPtr<PointerArray> marr(GetJMethodIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!marr.IsNull()) { + int32_t len = marr->GetLength(); + for (int32_t i = 0; i < len; i++) { + jmethodID id = marr->GetElementPtrSize<jmethodID>(i, kRuntimePointerSize); + if (id != nullptr) { + v(id, i); + } + } + } +} +template<ReadBarrierOption kReadBarrierOption, class Visitor> +void ClassExt::VisitJFieldIDs(Visitor v) { + ObjPtr<PointerArray> sarr(GetStaticJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!sarr.IsNull()) { + int32_t len = sarr->GetLength(); + for (int32_t i = 0; i < len; i++) { + jfieldID id = sarr->GetElementPtrSize<jfieldID>(i, kRuntimePointerSize); + if (id != nullptr) { + v(id, i, true); + } + } } - int32_t len = arr->GetLength(); - for (int32_t i = 0; i < len; i++) { - ArtMethod* method = arr->GetElementPtrSize<ArtMethod*, kDefaultVerifyFlags>(i, pointer_size); - if (method != nullptr) { - method->VisitRoots<kReadBarrierOption>(visitor, pointer_size); + ObjPtr<PointerArray> iarr(GetInstanceJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!iarr.IsNull()) { + int32_t len = iarr->GetLength(); + for (int32_t i = 0; i < len; i++) { + jfieldID id = iarr->GetElementPtrSize<jfieldID>(i, kRuntimePointerSize); + if (id != nullptr) { + v(id, i, false); + } } } } |