Partially ObjPtr<>-ify Object, fix stale ref in test.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 31113334
Change-Id: I0c0bc669c0ab8d99185e662a2fec16f32a42a0a2
diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc
index 8eaa00a..c82b445 100644
--- a/runtime/arch/stub_test.cc
+++ b/runtime/arch/stub_test.cc
@@ -940,7 +940,7 @@
EXPECT_FALSE(self->IsExceptionPending());
EXPECT_NE(reinterpret_cast<size_t>(nullptr), result);
ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result);
- EXPECT_EQ(c.Get(), obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(c.Get(), obj->GetClass());
VerifyObject(obj);
}
@@ -952,7 +952,7 @@
EXPECT_FALSE(self->IsExceptionPending());
EXPECT_NE(reinterpret_cast<size_t>(nullptr), result);
ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result);
- EXPECT_EQ(c.Get(), obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(c.Get(), obj->GetClass());
VerifyObject(obj);
}
@@ -964,7 +964,7 @@
EXPECT_FALSE(self->IsExceptionPending());
EXPECT_NE(reinterpret_cast<size_t>(nullptr), result);
ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result);
- EXPECT_EQ(c.Get(), obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(c.Get(), obj->GetClass());
VerifyObject(obj);
}
@@ -1062,7 +1062,7 @@
ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result);
EXPECT_TRUE(obj->IsArrayInstance());
EXPECT_TRUE(obj->IsObjectArray());
- EXPECT_EQ(c.Get(), obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(c.Get(), obj->GetClass());
VerifyObject(obj);
ObjPtr<mirror::Array> array = reinterpret_cast<mirror::Array*>(result);
EXPECT_EQ(array->GetLength(), 10);
@@ -2082,7 +2082,7 @@
EXPECT_FALSE(self->IsExceptionPending());
EXPECT_NE(reinterpret_cast<size_t>(nullptr), result);
mirror::Class* klass = reinterpret_cast<mirror::Class*>(result);
- EXPECT_EQ(klass, obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(klass, obj->GetClass());
// Tests done.
#else
@@ -2117,7 +2117,7 @@
EXPECT_FALSE(self->IsExceptionPending());
EXPECT_NE(reinterpret_cast<size_t>(nullptr), result);
mirror::Class* klass = reinterpret_cast<mirror::Class*>(result);
- EXPECT_EQ(klass, obj->GetClass());
+ EXPECT_OBJ_PTR_EQ(klass, obj->GetClass());
// Tests done.
#else
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 6e12eba..db79128 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -2985,7 +2985,7 @@
if (UNLIKELY(old != result_ptr)) {
// Return `old` (even if `!descriptor_equals`) to mimic the RI behavior for parallel
// capable class loaders. (All class loaders are considered parallel capable on Android.)
- mirror::Class* loader_class = class_loader->GetClass();
+ ObjPtr<mirror::Class> loader_class = class_loader->GetClass();
const char* loader_class_name =
loader_class->GetDexFile().StringByTypeIdx(loader_class->GetDexTypeIndex());
LOG(WARNING) << "Initiating class loader of type " << DescriptorToDot(loader_class_name)
diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc
index a9343e9..1a91abe 100644
--- a/runtime/class_linker_test.cc
+++ b/runtime/class_linker_test.cc
@@ -85,7 +85,7 @@
REQUIRES_SHARED(Locks::mutator_lock_) {
ASSERT_TRUE(primitive != nullptr);
ASSERT_TRUE(primitive->GetClass() != nullptr);
- ASSERT_EQ(primitive->GetClass(), primitive->GetClass()->GetClass());
+ ASSERT_OBJ_PTR_EQ(primitive->GetClass(), primitive->GetClass()->GetClass());
EXPECT_TRUE(primitive->GetClass()->GetSuperClass() != nullptr);
std::string temp;
ASSERT_STREQ(descriptor.c_str(), primitive->GetDescriptor(&temp));
@@ -124,8 +124,7 @@
REQUIRES_SHARED(Locks::mutator_lock_) {
ASSERT_TRUE(JavaLangObject != nullptr);
ASSERT_TRUE(JavaLangObject->GetClass() != nullptr);
- ASSERT_EQ(JavaLangObject->GetClass(),
- JavaLangObject->GetClass()->GetClass());
+ ASSERT_OBJ_PTR_EQ(JavaLangObject->GetClass(), JavaLangObject->GetClass()->GetClass());
EXPECT_OBJ_PTR_EQ(JavaLangObject, JavaLangObject->GetClass()->GetSuperClass());
std::string temp;
ASSERT_STREQ(JavaLangObject->GetDescriptor(&temp), "Ljava/lang/Object;");
@@ -197,7 +196,7 @@
REQUIRES_SHARED(Locks::mutator_lock_) {
ASSERT_TRUE(array != nullptr);
ASSERT_TRUE(array->GetClass() != nullptr);
- ASSERT_EQ(array->GetClass(), array->GetClass()->GetClass());
+ ASSERT_OBJ_PTR_EQ(array->GetClass(), array->GetClass()->GetClass());
EXPECT_TRUE(array->GetClass()->GetSuperClass() != nullptr);
std::string temp;
ASSERT_STREQ(array_descriptor.c_str(), array->GetDescriptor(&temp));
@@ -274,7 +273,7 @@
EXPECT_TRUE(klass->GetSuperClass() != nullptr);
}
EXPECT_TRUE(klass->GetClass() != nullptr);
- EXPECT_EQ(klass->GetClass(), klass->GetClass()->GetClass());
+ EXPECT_OBJ_PTR_EQ(klass->GetClass(), klass->GetClass()->GetClass());
EXPECT_TRUE(klass->GetDexCache() != nullptr);
EXPECT_TRUE(klass->IsLoaded());
EXPECT_TRUE(klass->IsResolved());
@@ -927,7 +926,7 @@
ObjPtr<mirror::Class> MyClass = class_linker_->FindClass(soa.Self(), "LMyClass;", class_loader);
ASSERT_TRUE(MyClass != nullptr);
ASSERT_TRUE(MyClass->GetClass() != nullptr);
- ASSERT_EQ(MyClass->GetClass(), MyClass->GetClass()->GetClass());
+ ASSERT_OBJ_PTR_EQ(MyClass->GetClass(), MyClass->GetClass()->GetClass());
EXPECT_OBJ_PTR_EQ(JavaLangObject.Get(), MyClass->GetClass()->GetSuperClass());
std::string temp;
ASSERT_STREQ(MyClass->GetDescriptor(&temp), "LMyClass;");
@@ -955,7 +954,7 @@
EXPECT_EQ(0U, MyClass->NumStaticFields());
EXPECT_EQ(0U, MyClass->NumDirectInterfaces());
- EXPECT_EQ(JavaLangObject->GetClass()->GetClass(), MyClass->GetClass()->GetClass());
+ EXPECT_OBJ_PTR_EQ(JavaLangObject->GetClass()->GetClass(), MyClass->GetClass()->GetClass());
// created by class_linker
AssertArrayClass("[C", "C", nullptr);
diff --git a/runtime/class_loader_utils.h b/runtime/class_loader_utils.h
index 562dc47..b809baf 100644
--- a/runtime/class_loader_utils.h
+++ b/runtime/class_loader_utils.h
@@ -22,6 +22,7 @@
#include "handle_scope.h"
#include "jni/jni_internal.h"
#include "mirror/class_loader.h"
+#include "mirror/object-inl.h"
#include "native/dalvik_system_DexFile.h"
#include "scoped_thread_state_change-inl.h"
#include "well_known_classes.h"
@@ -33,7 +34,7 @@
inline bool IsPathOrDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Handle<mirror::ClassLoader> class_loader)
REQUIRES_SHARED(Locks::mutator_lock_) {
- mirror::Class* class_loader_class = class_loader->GetClass();
+ ObjPtr<mirror::Class> class_loader_class = class_loader->GetClass();
return
(class_loader_class ==
soa.Decode<mirror::Class>(WellKnownClasses::dalvik_system_PathClassLoader)) ||
@@ -45,7 +46,7 @@
inline bool IsInMemoryDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Handle<mirror::ClassLoader> class_loader)
REQUIRES_SHARED(Locks::mutator_lock_) {
- mirror::Class* class_loader_class = class_loader->GetClass();
+ ObjPtr<mirror::Class> class_loader_class = class_loader->GetClass();
return (class_loader_class ==
soa.Decode<mirror::Class>(WellKnownClasses::dalvik_system_InMemoryDexClassLoader));
}
@@ -53,7 +54,7 @@
inline bool IsDelegateLastClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Handle<mirror::ClassLoader> class_loader)
REQUIRES_SHARED(Locks::mutator_lock_) {
- mirror::Class* class_loader_class = class_loader->GetClass();
+ ObjPtr<mirror::Class> class_loader_class = class_loader->GetClass();
return class_loader_class ==
soa.Decode<mirror::Class>(WellKnownClasses::dalvik_system_DelegateLastClassLoader);
}
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index 6d4d209..9b905ee 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -1525,7 +1525,7 @@
return;
}
int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2);
- mirror::Object* value = obj->GetFieldObjectVolatile<mirror::Object>(MemberOffset(offset));
+ ObjPtr<mirror::Object> value = obj->GetFieldObjectVolatile<mirror::Object>(MemberOffset(offset));
result->SetL(value);
}
diff --git a/runtime/jni/check_jni.cc b/runtime/jni/check_jni.cc
index 7279299..4a8453a 100644
--- a/runtime/jni/check_jni.cc
+++ b/runtime/jni/check_jni.cc
@@ -359,7 +359,7 @@
if (f == nullptr) {
return false;
}
- mirror::Class* c = o->GetClass();
+ ObjPtr<mirror::Class> c = o->GetClass();
if (c->FindInstanceField(f->GetName(), f->GetTypeDescriptor()) == nullptr) {
AbortF("jfieldID %s not valid for an object of class %s",
f->PrettyField().c_str(), o->PrettyTypeOf().c_str());
diff --git a/runtime/mirror/object.cc b/runtime/mirror/object.cc
index 739e0b1..4afabe2 100644
--- a/runtime/mirror/object.cc
+++ b/runtime/mirror/object.cc
@@ -74,9 +74,9 @@
const ObjPtr<Object> dest_obj_;
};
-Object* Object::CopyObject(ObjPtr<mirror::Object> dest,
- ObjPtr<mirror::Object> src,
- size_t num_bytes) {
+ObjPtr<Object> Object::CopyObject(ObjPtr<mirror::Object> dest,
+ ObjPtr<mirror::Object> src,
+ size_t num_bytes) {
// Copy instance data. Don't assume memcpy copies by words (b/32012820).
{
const size_t offset = sizeof(Object);
@@ -131,7 +131,7 @@
} else {
WriteBarrier::ForEveryFieldWrite(dest);
}
- return dest.Ptr();
+ return dest;
}
// An allocation pre-fence visitor that copies the object.
@@ -151,7 +151,7 @@
DISALLOW_COPY_AND_ASSIGN(CopyObjectVisitor);
};
-Object* Object::Clone(Thread* self) {
+ObjPtr<Object> Object::Clone(Thread* self) {
CHECK(!IsClass()) << "Can't clone classes.";
// Object::SizeOf gets the right size even if we're an array. Using c->AllocObject() here would
// be wrong.
@@ -169,7 +169,7 @@
if (this_object->GetClass()->IsFinalizable()) {
heap->AddFinalizerReference(self, ©);
}
- return copy.Ptr();
+ return copy;
}
uint32_t Object::GenerateIdentityHashCode() {
diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h
index fea6eb5..e681835 100644
--- a/runtime/mirror/object.h
+++ b/runtime/mirror/object.h
@@ -130,7 +130,7 @@
template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
size_t SizeOf() REQUIRES_SHARED(Locks::mutator_lock_);
- Object* Clone(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_)
+ ObjPtr<Object> Clone(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(!Roles::uninterruptible_);
int32_t IdentityHashCode()
@@ -758,9 +758,9 @@
// A utility function that copies an object in a read barrier and write barrier-aware way.
// This is internally used by Clone() and Class::CopyOf(). If the object is finalizable,
// it is the callers job to call Heap::AddFinalizerReference.
- static Object* CopyObject(ObjPtr<mirror::Object> dest,
- ObjPtr<mirror::Object> src,
- size_t num_bytes)
+ static ObjPtr<Object> CopyObject(ObjPtr<mirror::Object> dest,
+ ObjPtr<mirror::Object> src,
+ size_t num_bytes)
REQUIRES_SHARED(Locks::mutator_lock_);
template<VerifyObjectFlags kVerifyFlags, Primitive::Type kType>
diff --git a/runtime/mirror/object_array-inl.h b/runtime/mirror/object_array-inl.h
index 42cabab..154302e 100644
--- a/runtime/mirror/object_array-inl.h
+++ b/runtime/mirror/object_array-inl.h
@@ -285,7 +285,7 @@
SetWithoutChecks<kTransactionActive>(dst_pos + i, nullptr);
} else {
// TODO: use the underlying class reference to avoid uncompression when not necessary.
- Class* o_class = o->GetClass();
+ ObjPtr<Class> o_class = o->GetClass();
if (LIKELY(lastAssignableElementClass == o_class)) {
SetWithoutChecks<kTransactionActive>(dst_pos + i, o);
} else if (LIKELY(dst_class->IsAssignableFrom(o_class))) {
diff --git a/runtime/mirror/object_test.cc b/runtime/mirror/object_test.cc
index 27987c0..1cb22f2 100644
--- a/runtime/mirror/object_test.cc
+++ b/runtime/mirror/object_test.cc
@@ -111,7 +111,7 @@
StackHandleScope<2> hs(soa.Self());
Handle<ObjectArray<Object>> a1(hs.NewHandle(AllocObjectArray<Object>(soa.Self(), 256)));
size_t s1 = a1->SizeOf();
- Object* clone = a1->Clone(soa.Self());
+ ObjPtr<Object> clone = a1->Clone(soa.Self());
EXPECT_EQ(s1, clone->SizeOf());
EXPECT_TRUE(clone->GetClass() == a1->GetClass());
}
@@ -340,7 +340,8 @@
dims->Set<false>(0, i);
dims->Set<false>(1, j);
multi.Assign(Array::CreateMultiArray(soa.Self(), int_class, dims));
- EXPECT_TRUE(multi->GetClass() == class_linker_->FindSystemClass(soa.Self(), "[[I"));
+ ObjPtr<mirror::Class> expected_class = class_linker_->FindSystemClass(soa.Self(), "[[I");
+ EXPECT_OBJ_PTR_EQ(multi->GetClass(), expected_class);
EXPECT_EQ(i, multi->GetLength());
for (int k = 0; k < i; ++k) {
ObjPtr<Array> outer = multi->AsObjectArray<Array>()->Get(k);
diff --git a/runtime/transaction_test.cc b/runtime/transaction_test.cc
index fb0a5d9..aea2211 100644
--- a/runtime/transaction_test.cc
+++ b/runtime/transaction_test.cc
@@ -99,10 +99,10 @@
Runtime::Current()->EnterTransactionMode();
Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(soa.Self())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
// Rolling back transaction's changes must not clear the Object::class field.
Runtime::Current()->RollbackAndExitTransactionMode();
- EXPECT_EQ(h_obj->GetClass(), h_klass.Get());
+ EXPECT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
}
// Tests object's monitor state is preserved after transaction rollback.
@@ -114,7 +114,7 @@
ASSERT_TRUE(h_klass != nullptr);
Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(soa.Self())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
// Lock object's monitor outside the transaction.
h_obj->MonitorEnter(soa.Self());
@@ -151,7 +151,7 @@
h_klass->GetComponentSizeShift(),
Runtime::Current()->GetHeap()->GetCurrentAllocator())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
Runtime::Current()->RollbackAndExitTransactionMode();
// Rolling back transaction's changes must not reset array's length.
@@ -227,7 +227,7 @@
ASSERT_TRUE(object_klass != nullptr);
Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(soa.Self())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
// Modify fields inside transaction then rollback changes.
Runtime::Current()->EnterTransactionMode();
@@ -327,7 +327,7 @@
ASSERT_TRUE(object_klass != nullptr);
Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(soa.Self())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
// Modify fields inside transaction then rollback changes.
Runtime::Current()->EnterTransactionMode();
@@ -450,7 +450,7 @@
ASSERT_TRUE(object_klass != nullptr);
Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(soa.Self())));
ASSERT_TRUE(h_obj != nullptr);
- ASSERT_EQ(h_obj->GetClass(), h_klass.Get());
+ ASSERT_OBJ_PTR_EQ(h_obj->GetClass(), h_klass.Get());
// Modify fields inside transaction then rollback changes.
Runtime::Current()->EnterTransactionMode();