summaryrefslogtreecommitdiff
path: root/runtime/mirror/class_ext-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/mirror/class_ext-inl.h')
-rw-r--r--runtime/mirror/class_ext-inl.h100
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);