diff options
| -rw-r--r-- | runtime/class_linker.cc | 10 | ||||
| -rw-r--r-- | runtime/class_linker_test.cc | 2 | ||||
| -rw-r--r-- | runtime/debugger.cc | 2 | ||||
| -rw-r--r-- | runtime/java_vm_ext.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/class-inl.h | 2 | ||||
| -rw-r--r-- | runtime/native/java_lang_Class.cc | 9 | ||||
| -rw-r--r-- | runtime/native/java_lang_reflect_Field.cc | 6 | ||||
| -rw-r--r-- | runtime/obj_ptr.h | 18 | ||||
| -rw-r--r-- | runtime/proxy_test.cc | 12 | ||||
| -rw-r--r-- | runtime/reflection.cc | 5 |
10 files changed, 39 insertions, 31 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 7aa28d36be..ed0f0c0236 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -4297,11 +4297,11 @@ mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& CHECK_EQ(interfaces_sfield.GetDeclaringClass(), klass.Get()); interfaces_sfield.SetObject<false>( klass.Get(), - soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces).Ptr()); + soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces)); CHECK_EQ(throws_sfield.GetDeclaringClass(), klass.Get()); throws_sfield.SetObject<false>( klass.Get(), - soa.Decode<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(throws).Ptr()); + soa.Decode<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(throws)); { // Lock on klass is released. Lock new class object. @@ -4331,9 +4331,9 @@ mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& CHECK_EQ(PrettyField(klass->GetStaticField(1)), throws_field_name); CHECK_EQ(klass.Get()->GetInterfaces(), - soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces).Ptr()); + soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces)); CHECK_EQ(klass.Get()->GetThrows(), - soa.Decode<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(throws).Ptr()); + soa.Decode<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(throws)); } return klass.Get(); } @@ -8304,7 +8304,7 @@ jobject ClassLinker::CreatePathClassLoader(Thread* self, // Make it a global ref and return. ScopedLocalRef<jobject> local_ref( - soa.Env(), soa.Env()->AddLocalReference<jobject>(MakeObjPtr(h_path_class_loader.Get()))); + soa.Env(), soa.Env()->AddLocalReference<jobject>(h_path_class_loader.Get())); return soa.Env()->NewGlobalRef(local_ref.get()); } diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc index 546653960f..d45495cf68 100644 --- a/runtime/class_linker_test.cc +++ b/runtime/class_linker_test.cc @@ -875,7 +875,7 @@ TEST_F(ClassLinkerTest, LookupResolvedType) { uint32_t type_idx = klass->GetClassDef()->class_idx_; ObjPtr<mirror::DexCache> dex_cache = klass->GetDexCache(); const DexFile& dex_file = klass->GetDexFile(); - EXPECT_EQ(dex_cache->GetResolvedType(type_idx), klass.Ptr()); + EXPECT_OBJ_PTR_EQ(dex_cache->GetResolvedType(type_idx), klass); EXPECT_OBJ_PTR_EQ( class_linker_->LookupResolvedType(dex_file, type_idx, dex_cache, class_loader.Get()), klass); diff --git a/runtime/debugger.cc b/runtime/debugger.cc index a7feeef89f..7006f70687 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -1995,7 +1995,7 @@ JDWP::JdwpError Dbg::GetThreadName(JDWP::ObjectId thread_id, std::string* name) CHECK(thread_object != nullptr) << error; ArtField* java_lang_Thread_name_field = soa.DecodeField(WellKnownClasses::java_lang_Thread_name); - ObjPtr<mirror::String> s(java_lang_Thread_name_field->GetObject(thread_object)); + ObjPtr<mirror::String> s(java_lang_Thread_name_field->GetObject(thread_object)->AsString()); if (s != nullptr) { *name = s->ToModifiedUtf8(); } diff --git a/runtime/java_vm_ext.cc b/runtime/java_vm_ext.cc index ecd6b524df..101c146072 100644 --- a/runtime/java_vm_ext.cc +++ b/runtime/java_vm_ext.cc @@ -538,7 +538,7 @@ jobject JavaVMExt::AddGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) { return nullptr; } WriterMutexLock mu(self, globals_lock_); - IndirectRef ref = globals_.Add(IRT_FIRST_SEGMENT, obj.Ptr()); + IndirectRef ref = globals_.Add(IRT_FIRST_SEGMENT, obj); return reinterpret_cast<jobject>(ref); } @@ -550,7 +550,7 @@ jweak JavaVMExt::AddWeakGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) { while (UNLIKELY(!MayAccessWeakGlobals(self))) { weak_globals_add_condition_.WaitHoldingLocks(self); } - IndirectRef ref = weak_globals_.Add(IRT_FIRST_SEGMENT, obj.Ptr()); + IndirectRef ref = weak_globals_.Add(IRT_FIRST_SEGMENT, obj); return reinterpret_cast<jweak>(ref); } diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 1cfed741eb..cc088b8aa8 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -448,7 +448,7 @@ inline bool Class::CanAccessResolvedField(ObjPtr<Class> access_to, inline bool Class::CheckResolvedFieldAccess(ObjPtr<Class> access_to, ArtField* field, uint32_t field_idx) { - return ResolvedFieldAccessTest<true, true>(access_to.Ptr(), field, field_idx, nullptr); + return ResolvedFieldAccessTest<true, true>(access_to, field, field_idx, nullptr); } inline bool Class::CanAccessResolvedMethod(Class* access_to, ArtMethod* method, diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index 87bff5ffc5..2a5c04d54b 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -677,11 +677,10 @@ static jobject Class_newInstance(JNIEnv* env, jobject javaThis) { if (caller.Get() == nullptr) { caller.Assign(GetCallingClass(soa.Self(), 1)); } - if (UNLIKELY(caller.Get() != nullptr && !VerifyAccess( - MakeObjPtr(receiver.Get()), - MakeObjPtr(declaring_class), - constructor->GetAccessFlags(), - MakeObjPtr(caller.Get())))) { + if (UNLIKELY(caller.Get() != nullptr && !VerifyAccess(receiver.Get(), + declaring_class, + constructor->GetAccessFlags(), + caller.Get()))) { soa.Self()->ThrowNewExceptionF( "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s", PrettyMethod(constructor).c_str(), PrettyClass(caller.Get()).c_str()); diff --git a/runtime/native/java_lang_reflect_Field.cc b/runtime/native/java_lang_reflect_Field.cc index 86b42d0051..90def4438f 100644 --- a/runtime/native/java_lang_reflect_Field.cc +++ b/runtime/native/java_lang_reflect_Field.cc @@ -46,8 +46,8 @@ ALWAYS_INLINE inline static bool VerifyFieldAccess(Thread* self, } ObjPtr<mirror::Class> calling_class; if (!VerifyAccess(self, - MakeObjPtr(obj), - MakeObjPtr(field->GetDeclaringClass()), + obj, + field->GetDeclaringClass(), field->GetAccessFlags(), &calling_class, 1)) { @@ -335,7 +335,7 @@ static void Field_set(JNIEnv* env, jobject javaField, jobject javaObj, jobject j ObjPtr<mirror::Object> boxed_value = soa.Decode<mirror::Object>(javaValue); JValue unboxed_value; if (!UnboxPrimitiveForField(boxed_value, - MakeObjPtr(field_type), + field_type, f->GetArtField(), &unboxed_value)) { DCHECK(soa.Self()->IsExceptionPending()); diff --git a/runtime/obj_ptr.h b/runtime/obj_ptr.h index beb4d33a11..6688ba77ee 100644 --- a/runtime/obj_ptr.h +++ b/runtime/obj_ptr.h @@ -18,6 +18,7 @@ #define ART_RUNTIME_OBJ_PTR_H_ #include <ostream> +#include <type_traits> #include "base/mutex.h" // For Locks::mutator_lock_. #include "globals.h" @@ -45,14 +46,23 @@ class ObjPtr { template <typename Type> ALWAYS_INLINE ObjPtr(Type* ptr) REQUIRES_SHARED(Locks::mutator_lock_) - : reference_(Encode(static_cast<MirrorType*>(ptr))) {} + : reference_(Encode(static_cast<MirrorType*>(ptr))) { + static_assert(std::is_base_of<MirrorType, Type>::value, + "Input type must be a subtype of the ObjPtr type"); + } template <typename Type> - ALWAYS_INLINE ObjPtr(const ObjPtr<Type>& other) REQUIRES_SHARED(Locks::mutator_lock_) - : reference_(Encode(static_cast<MirrorType*>(other.Ptr()))) {} + ALWAYS_INLINE ObjPtr(const ObjPtr<Type, kPoison>& other) REQUIRES_SHARED(Locks::mutator_lock_) + : reference_(Encode(static_cast<MirrorType*>(other.Ptr()))) { + static_assert(std::is_base_of<MirrorType, Type>::value, + "Input type must be a subtype of the ObjPtr type"); + } template <typename Type> - ALWAYS_INLINE ObjPtr& operator=(const ObjPtr& other) { + ALWAYS_INLINE ObjPtr& operator=(const ObjPtr<Type, kPoison>& other) + REQUIRES_SHARED(Locks::mutator_lock_) { + static_assert(std::is_base_of<MirrorType, Type>::value, + "Input type must be a subtype of the ObjPtr type"); reference_ = Encode(static_cast<MirrorType*>(other.Ptr())); return *this; } diff --git a/runtime/proxy_test.cc b/runtime/proxy_test.cc index 1119ccfc80..84985c2997 100644 --- a/runtime/proxy_test.cc +++ b/runtime/proxy_test.cc @@ -180,7 +180,7 @@ TEST_F(ProxyTest, ProxyFieldHelper) { ArtField* field = &static_fields->At(0); EXPECT_STREQ("interfaces", field->GetName()); EXPECT_STREQ("[Ljava/lang/Class;", field->GetTypeDescriptor()); - EXPECT_OBJ_PTR_EQ(MakeObjPtr(interfacesFieldClass.Get()), field->GetType<true>()); + EXPECT_OBJ_PTR_EQ(interfacesFieldClass.Get(), field->GetType<true>()); std::string temp; EXPECT_STREQ("L$Proxy1234;", field->GetDeclaringClass()->GetDescriptor(&temp)); EXPECT_FALSE(field->IsPrimitiveType()); @@ -189,7 +189,7 @@ TEST_F(ProxyTest, ProxyFieldHelper) { field = &static_fields->At(1); EXPECT_STREQ("throws", field->GetName()); EXPECT_STREQ("[[Ljava/lang/Class;", field->GetTypeDescriptor()); - EXPECT_OBJ_PTR_EQ(MakeObjPtr(throwsFieldClass.Get()), field->GetType<true>()); + EXPECT_OBJ_PTR_EQ(throwsFieldClass.Get(), field->GetType<true>()); EXPECT_STREQ("L$Proxy1234;", field->GetDeclaringClass()->GetDescriptor(&temp)); EXPECT_FALSE(field->IsPrimitiveType()); } @@ -224,10 +224,10 @@ TEST_F(ProxyTest, CheckArtMirrorFieldsOfProxyStaticFields) { ASSERT_TRUE(static_fields1 != nullptr); ASSERT_EQ(2u, static_fields1->size()); - EXPECT_OBJ_PTR_EQ(static_fields0->At(0).GetDeclaringClass(), MakeObjPtr(proxyClass0.Get())); - EXPECT_OBJ_PTR_EQ(static_fields0->At(1).GetDeclaringClass(), MakeObjPtr(proxyClass0.Get())); - EXPECT_OBJ_PTR_EQ(static_fields1->At(0).GetDeclaringClass(), MakeObjPtr(proxyClass1.Get())); - EXPECT_OBJ_PTR_EQ(static_fields1->At(1).GetDeclaringClass(), MakeObjPtr(proxyClass1.Get())); + EXPECT_OBJ_PTR_EQ(static_fields0->At(0).GetDeclaringClass(), proxyClass0.Get()); + EXPECT_OBJ_PTR_EQ(static_fields0->At(1).GetDeclaringClass(), proxyClass0.Get()); + EXPECT_OBJ_PTR_EQ(static_fields1->At(0).GetDeclaringClass(), proxyClass1.Get()); + EXPECT_OBJ_PTR_EQ(static_fields1->At(1).GetDeclaringClass(), proxyClass1.Get()); ASSERT_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize); ASSERT_FALSE(Runtime::Current()->IsActiveTransaction()); diff --git a/runtime/reflection.cc b/runtime/reflection.cc index de003e525b..d34b701e3e 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -676,8 +676,7 @@ jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject javaM } // Box if necessary and return. - return soa.AddLocalReference<jobject>( - BoxPrimitive(Primitive::GetType(shorty[0]), result).Ptr()); + return soa.AddLocalReference<jobject>(BoxPrimitive(Primitive::GetType(shorty[0]), result)); } ObjPtr<mirror::Object> BoxPrimitive(Primitive::Type src_class, const JValue& value) { @@ -911,7 +910,7 @@ void UpdateReference(Thread* self, jobject obj, ObjPtr<mirror::Object> result) { IndirectRef ref = reinterpret_cast<IndirectRef>(obj); IndirectRefKind kind = GetIndirectRefKind(ref); if (kind == kLocal) { - self->GetJniEnv()->locals.Update(obj, result.Ptr()); + self->GetJniEnv()->locals.Update(obj, result); } else if (kind == kHandleScopeOrInvalid) { LOG(FATAL) << "Unsupported UpdateReference for kind kHandleScopeOrInvalid"; } else if (kind == kGlobal) { |