diff options
Diffstat (limited to 'runtime/mirror/class_ext-inl.h')
-rw-r--r-- | runtime/mirror/class_ext-inl.h | 100 |
1 files changed, 73 insertions, 27 deletions
diff --git a/runtime/mirror/class_ext-inl.h b/runtime/mirror/class_ext-inl.h index fd81a2a3ed..99f7f49fc5 100644 --- a/runtime/mirror/class_ext-inl.h +++ b/runtime/mirror/class_ext-inl.h @@ -22,30 +22,40 @@ #include "array-inl.h" #include "art_method-inl.h" #include "base/enums.h" +#include "base/globals.h" +#include "class_root.h" #include "handle_scope.h" +#include "jni/jni_internal.h" +#include "jni_id_type.h" +#include "mirror/array.h" #include "mirror/object.h" #include "object-inl.h" #include "verify_object.h" +#include "well_known_classes.h" namespace art { namespace mirror { template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::EnsureJniIdsArrayPresent(MemberOffset off, size_t count) { - ObjPtr<PointerArray> existing( - GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(off)); +inline bool ClassExt::EnsureJniIdsArrayPresent(MemberOffset off, size_t count) { + ObjPtr<Object> existing( + GetFieldObject<Object, kVerifyFlags, kReadBarrierOption>(off)); if (!existing.IsNull()) { - return existing; + return true; } Thread* self = Thread::Current(); StackHandleScope<2> hs(self); Handle<ClassExt> h_this(hs.NewHandle(this)); - Handle<PointerArray> new_arr( - hs.NewHandle(Runtime::Current()->GetClassLinker()->AllocPointerArray(self, count))); + MutableHandle<Object> new_arr(hs.NewHandle<Object>(nullptr)); + if (UNLIKELY(Runtime::Current()->GetJniIdType() == JniIdType::kSwapablePointer)) { + new_arr.Assign(Runtime::Current()->GetJniIdManager()->GetPointerMarker()); + } else { + new_arr.Assign(Runtime::Current()->GetClassLinker()->AllocPointerArray(self, count)); + } if (new_arr.IsNull()) { // Fail. self->AssertPendingOOMException(); - return nullptr; + return false; } bool set; // Set the ext_data_ field using CAS semantics. @@ -56,40 +66,62 @@ inline ObjPtr<PointerArray> ClassExt::EnsureJniIdsArrayPresent(MemberOffset off, set = h_this->CasFieldObject<false>( off, nullptr, new_arr.Get(), CASMode::kStrong, std::memory_order_seq_cst); } - ObjPtr<PointerArray> ret( - set ? new_arr.Get() - : h_this->GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(off)); - CHECK(!ret.IsNull()); - return ret; + if (kIsDebugBuild) { + ObjPtr<Object> ret( + set ? new_arr.Get() + : h_this->GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(off)); + CHECK(!ret.IsNull()); + } + return true; } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::EnsureJMethodIDsArrayPresent(size_t count) { +inline bool ClassExt::EnsureJMethodIDsArrayPresent(size_t count) { return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>( MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, jmethod_ids_)), count); } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::EnsureStaticJFieldIDsArrayPresent(size_t count) { +inline bool ClassExt::EnsureStaticJFieldIDsArrayPresent(size_t count) { return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>( MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, static_jfield_ids_)), count); } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::EnsureInstanceJFieldIDsArrayPresent(size_t count) { +inline bool ClassExt::EnsureInstanceJFieldIDsArrayPresent(size_t count) { return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>( MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, instance_jfield_ids_)), count); } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::GetInstanceJFieldIDs() { - return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>( +inline ObjPtr<Object> ClassExt::GetInstanceJFieldIDs() { + return GetFieldObject<Object, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(ClassExt, instance_jfield_ids_)); } +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline bool ClassExt::HasInstanceFieldPointerIdMarker() { + ObjPtr<Object> arr(GetInstanceJFieldIDs<kVerifyFlags, kReadBarrierOption>()); + return !arr.IsNull() && !arr->IsArrayInstance(); +} +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline ObjPtr<PointerArray> ClassExt::GetInstanceJFieldIDsPointerArray() { + DCHECK(!HasInstanceFieldPointerIdMarker()); + return down_cast<PointerArray*>(GetInstanceJFieldIDs<kVerifyFlags, kReadBarrierOption>().Ptr()); +} template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::GetStaticJFieldIDs() { - return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>( +inline ObjPtr<Object> ClassExt::GetStaticJFieldIDs() { + return GetFieldObject<Object, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(ClassExt, static_jfield_ids_)); } +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline ObjPtr<PointerArray> ClassExt::GetStaticJFieldIDsPointerArray() { + DCHECK(!HasStaticFieldPointerIdMarker()); + return down_cast<PointerArray*>(GetStaticJFieldIDs<kVerifyFlags, kReadBarrierOption>().Ptr()); +} +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline bool ClassExt::HasStaticFieldPointerIdMarker() { + ObjPtr<Object> arr(GetStaticJFieldIDs<kVerifyFlags, kReadBarrierOption>()); + return !arr.IsNull() && !arr->IsArrayInstance(); +} template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline ObjPtr<Class> ClassExt::GetObsoleteClass() { @@ -98,10 +130,21 @@ inline ObjPtr<Class> ClassExt::GetObsoleteClass() { } template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline ObjPtr<PointerArray> ClassExt::GetJMethodIDs() { - return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>( +inline ObjPtr<Object> ClassExt::GetJMethodIDs() { + return GetFieldObject<Object, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(ClassExt, jmethod_ids_)); } +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline ObjPtr<PointerArray> ClassExt::GetJMethodIDsPointerArray() { + DCHECK(!HasMethodPointerIdMarker()); + return down_cast<PointerArray*>(GetJMethodIDs<kVerifyFlags, kReadBarrierOption>().Ptr()); +} +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> +inline bool ClassExt::HasMethodPointerIdMarker() { + ObjPtr<Object> arr(GetJMethodIDs<kVerifyFlags, kReadBarrierOption>()); + return !arr.IsNull() && !arr->IsArrayInstance(); +} + inline ObjPtr<Object> ClassExt::GetVerifyError() { return GetFieldObject<ClassExt>(OFFSET_OF_OBJECT_MEMBER(ClassExt, verify_error_)); @@ -146,8 +189,9 @@ void ClassExt::VisitMethods(Visitor visitor, PointerSize pointer_size) { template<ReadBarrierOption kReadBarrierOption, class Visitor> void ClassExt::VisitJMethodIDs(Visitor v) { - ObjPtr<PointerArray> marr(GetJMethodIDs<kDefaultVerifyFlags, kReadBarrierOption>()); - if (!marr.IsNull()) { + ObjPtr<Object> arr(GetJMethodIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!arr.IsNull() && arr->IsArrayInstance()) { + ObjPtr<PointerArray> marr(down_cast<PointerArray*>(arr.Ptr())); int32_t len = marr->GetLength(); for (int32_t i = 0; i < len; i++) { jmethodID id = marr->GetElementPtrSize<jmethodID>(i, kRuntimePointerSize); @@ -159,8 +203,9 @@ void ClassExt::VisitJMethodIDs(Visitor v) { } template<ReadBarrierOption kReadBarrierOption, class Visitor> void ClassExt::VisitJFieldIDs(Visitor v) { - ObjPtr<PointerArray> sarr(GetStaticJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); - if (!sarr.IsNull()) { + ObjPtr<Object> sarr_obj(GetStaticJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!sarr_obj.IsNull() && sarr_obj->IsArrayInstance()) { + ObjPtr<PointerArray> sarr(down_cast<PointerArray*>(sarr_obj->AsArray().Ptr())); int32_t len = sarr->GetLength(); for (int32_t i = 0; i < len; i++) { jfieldID id = sarr->GetElementPtrSize<jfieldID>(i, kRuntimePointerSize); @@ -169,8 +214,9 @@ void ClassExt::VisitJFieldIDs(Visitor v) { } } } - ObjPtr<PointerArray> iarr(GetInstanceJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); - if (!iarr.IsNull()) { + ObjPtr<PointerArray> iarr_obj(GetInstanceJFieldIDs<kDefaultVerifyFlags, kReadBarrierOption>()); + if (!iarr_obj.IsNull() && iarr_obj->IsArrayInstance()) { + ObjPtr<PointerArray> iarr(down_cast<PointerArray*>(iarr_obj->AsArray().Ptr())); int32_t len = iarr->GetLength(); for (int32_t i = 0; i < len; i++) { jfieldID id = iarr->GetElementPtrSize<jfieldID>(i, kRuntimePointerSize); |