diff options
-rw-r--r-- | compiler/jni/jni_compiler_test.cc | 2 | ||||
-rw-r--r-- | runtime/arch/stub_test.cc | 50 | ||||
-rw-r--r-- | runtime/debugger.cc | 2 | ||||
-rw-r--r-- | runtime/entrypoints/quick/quick_alloc_entrypoints.cc | 14 | ||||
-rw-r--r-- | runtime/gc/heap_test.cc | 3 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_common.cc | 2 | ||||
-rw-r--r-- | runtime/jni/jni_internal.cc | 4 | ||||
-rw-r--r-- | runtime/mirror/class-inl.h | 2 | ||||
-rw-r--r-- | runtime/mirror/class.cc | 4 | ||||
-rw-r--r-- | runtime/mirror/class.h | 4 | ||||
-rw-r--r-- | runtime/mirror/string-alloc-inl.h | 56 | ||||
-rw-r--r-- | runtime/mirror/string.cc | 34 | ||||
-rw-r--r-- | runtime/mirror/string.h | 60 | ||||
-rw-r--r-- | runtime/mirror/var_handle_test.cc | 2 | ||||
-rw-r--r-- | runtime/native/java_lang_String.cc | 3 | ||||
-rw-r--r-- | runtime/non_debuggable_classes.cc | 2 | ||||
-rw-r--r-- | runtime/reference_table_test.cc | 28 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.cc | 2 |
18 files changed, 153 insertions, 121 deletions
diff --git a/compiler/jni/jni_compiler_test.cc b/compiler/jni/jni_compiler_test.cc index ce987c1f35..c316499042 100644 --- a/compiler/jni/jni_compiler_test.cc +++ b/compiler/jni/jni_compiler_test.cc @@ -1322,7 +1322,7 @@ jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s Thread* self = Thread::Current(); ScopedObjectAccess soa(self); - EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr())); + EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj))); return nullptr; } diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc index c9774a7d1b..8eaa00ae4b 100644 --- a/runtime/arch/stub_test.cc +++ b/runtime/arch/stub_test.cc @@ -939,7 +939,7 @@ TEST_F(StubTest, AllocObject) { EXPECT_FALSE(self->IsExceptionPending()); EXPECT_NE(reinterpret_cast<size_t>(nullptr), result); - mirror::Object* obj = reinterpret_cast<mirror::Object*>(result); + ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result); EXPECT_EQ(c.Get(), obj->GetClass()); VerifyObject(obj); } @@ -951,7 +951,7 @@ TEST_F(StubTest, AllocObject) { EXPECT_FALSE(self->IsExceptionPending()); EXPECT_NE(reinterpret_cast<size_t>(nullptr), result); - mirror::Object* obj = reinterpret_cast<mirror::Object*>(result); + ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result); EXPECT_EQ(c.Get(), obj->GetClass()); VerifyObject(obj); } @@ -963,7 +963,7 @@ TEST_F(StubTest, AllocObject) { EXPECT_FALSE(self->IsExceptionPending()); EXPECT_NE(reinterpret_cast<size_t>(nullptr), result); - mirror::Object* obj = reinterpret_cast<mirror::Object*>(result); + ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result); EXPECT_EQ(c.Get(), obj->GetClass()); VerifyObject(obj); } @@ -1059,12 +1059,12 @@ TEST_F(StubTest, AllocObjectArray) { self); EXPECT_FALSE(self->IsExceptionPending()) << mirror::Object::PrettyTypeOf(self->GetException()); EXPECT_NE(reinterpret_cast<size_t>(nullptr), result); - mirror::Object* obj = reinterpret_cast<mirror::Object*>(result); + ObjPtr<mirror::Object> obj = reinterpret_cast<mirror::Object*>(result); EXPECT_TRUE(obj->IsArrayInstance()); EXPECT_TRUE(obj->IsObjectArray()); EXPECT_EQ(c.Get(), obj->GetClass()); VerifyObject(obj); - mirror::Array* array = reinterpret_cast<mirror::Array*>(result); + ObjPtr<mirror::Array> array = reinterpret_cast<mirror::Array*>(result); EXPECT_EQ(array->GetLength(), 10); } @@ -1514,23 +1514,29 @@ static void GetSet32Instance(Handle<mirror::Object>* obj, ArtField* f, #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) -static void set_and_check_static(uint32_t f_idx, mirror::Object* val, Thread* self, - ArtMethod* referrer, StubTest* test) +static void set_and_check_static(uint32_t f_idx, + ObjPtr<mirror::Object> val, + Thread* self, + ArtMethod* referrer, + StubTest* test) REQUIRES_SHARED(Locks::mutator_lock_) { + StackHandleScope<1u> hs(self); + Handle<mirror::Object> h_val = hs.NewHandle(val); test->Invoke3WithReferrer(static_cast<size_t>(f_idx), - reinterpret_cast<size_t>(val), + reinterpret_cast<size_t>(h_val.Get()), 0U, StubTest::GetEntrypoint(self, kQuickSetObjStatic), self, referrer); size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f_idx), - 0U, 0U, + 0U, + 0U, StubTest::GetEntrypoint(self, kQuickGetObjStatic), self, referrer); - EXPECT_EQ(res, reinterpret_cast<size_t>(val)) << "Value " << val; + EXPECT_EQ(res, reinterpret_cast<size_t>(h_val.Get())) << "Value " << h_val.Get(); } #endif @@ -1542,7 +1548,7 @@ static void GetSetObjStatic(ArtField* f, Thread* self, ArtMethod* referrer, set_and_check_static(f->GetDexFieldIndex(), nullptr, self, referrer, test); // Allocate a string object for simplicity. - mirror::String* str = mirror::String::AllocFromModifiedUtf8(self, "Test"); + ObjPtr<mirror::String> str = mirror::String::AllocFromModifiedUtf8(self, "Test"); set_and_check_static(f->GetDexFieldIndex(), str, self, referrer, test); set_and_check_static(f->GetDexFieldIndex(), nullptr, self, referrer, test); @@ -1557,27 +1563,33 @@ static void GetSetObjStatic(ArtField* f, Thread* self, ArtMethod* referrer, #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \ (defined(__x86_64__) && !defined(__APPLE__)) -static void set_and_check_instance(ArtField* f, mirror::Object* trg, - mirror::Object* val, Thread* self, ArtMethod* referrer, +static void set_and_check_instance(ArtField* f, + ObjPtr<mirror::Object> trg, + ObjPtr<mirror::Object> val, + Thread* self, + ArtMethod* referrer, StubTest* test) REQUIRES_SHARED(Locks::mutator_lock_) { + StackHandleScope<2u> hs(self); + Handle<mirror::Object> h_trg = hs.NewHandle(trg); + Handle<mirror::Object> h_val = hs.NewHandle(val); test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), - reinterpret_cast<size_t>(trg), - reinterpret_cast<size_t>(val), + reinterpret_cast<size_t>(h_trg.Get()), + reinterpret_cast<size_t>(h_val.Get()), StubTest::GetEntrypoint(self, kQuickSetObjInstance), self, referrer); size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), - reinterpret_cast<size_t>(trg), + reinterpret_cast<size_t>(h_trg.Get()), 0U, StubTest::GetEntrypoint(self, kQuickGetObjInstance), self, referrer); - EXPECT_EQ(res, reinterpret_cast<size_t>(val)) << "Value " << val; + EXPECT_EQ(res, reinterpret_cast<size_t>(h_val.Get())) << "Value " << h_val.Get(); - EXPECT_OBJ_PTR_EQ(val, f->GetObj(trg)); + EXPECT_OBJ_PTR_EQ(h_val.Get(), f->GetObj(h_trg.Get())); } #endif @@ -1589,7 +1601,7 @@ static void GetSetObjInstance(Handle<mirror::Object>* obj, ArtField* f, set_and_check_instance(f, obj->Get(), nullptr, self, referrer, test); // Allocate a string object for simplicity. - mirror::String* str = mirror::String::AllocFromModifiedUtf8(self, "Test"); + ObjPtr<mirror::String> str = mirror::String::AllocFromModifiedUtf8(self, "Test"); set_and_check_instance(f, obj->Get(), str, self, referrer, test); set_and_check_instance(f, obj->Get(), nullptr, self, referrer, test); diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 663af814cd..5443ace60c 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -1346,7 +1346,7 @@ JDWP::JdwpError Dbg::SetArrayElements(JDWP::ObjectId array_id, int offset, int c JDWP::JdwpError Dbg::CreateString(const std::string& str, JDWP::ObjectId* new_string_id) { Thread* self = Thread::Current(); - mirror::String* new_string = mirror::String::AllocFromModifiedUtf8(self, str.c_str()); + ObjPtr<mirror::String> new_string = mirror::String::AllocFromModifiedUtf8(self, str.c_str()); if (new_string == nullptr) { DCHECK(self->IsExceptionPending()); self->ClearException(); diff --git a/runtime/entrypoints/quick/quick_alloc_entrypoints.cc b/runtime/entrypoints/quick/quick_alloc_entrypoints.cc index 1b3bb6ac24..ecf6f67095 100644 --- a/runtime/entrypoints/quick/quick_alloc_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_alloc_entrypoints.cc @@ -89,7 +89,7 @@ extern "C" mirror::String* artAllocStringObject##suffix##suffix2( \ REQUIRES_SHARED(Locks::mutator_lock_) { \ /* The klass arg is so it matches the ABI of the other object alloc callbacks. */ \ DCHECK(klass->IsStringClass()) << klass->PrettyClass(); \ - return mirror::String::AllocEmptyString<instrumented_bool>(self, allocator_type); \ + return mirror::String::AllocEmptyString<instrumented_bool>(self, allocator_type).Ptr(); \ } \ extern "C" mirror::Array* artAllocArrayFromCodeResolved##suffix##suffix2( \ mirror::Class* klass, int32_t component_count, Thread* self) \ @@ -105,24 +105,24 @@ extern "C" mirror::String* artAllocStringFromBytesFromCode##suffix##suffix2( \ ScopedQuickEntrypointChecks sqec(self); \ StackHandleScope<1> hs(self); \ Handle<mirror::ByteArray> handle_array(hs.NewHandle(byte_array)); \ - return mirror::String::AllocFromByteArray<instrumented_bool>(self, byte_count, handle_array, \ - offset, high, allocator_type); \ + return mirror::String::AllocFromByteArray<instrumented_bool>( \ + self, byte_count, handle_array, offset, high, allocator_type).Ptr(); \ } \ extern "C" mirror::String* artAllocStringFromCharsFromCode##suffix##suffix2( \ int32_t offset, int32_t char_count, mirror::CharArray* char_array, Thread* self) \ REQUIRES_SHARED(Locks::mutator_lock_) { \ StackHandleScope<1> hs(self); \ Handle<mirror::CharArray> handle_array(hs.NewHandle(char_array)); \ - return mirror::String::AllocFromCharArray<instrumented_bool>(self, char_count, handle_array, \ - offset, allocator_type); \ + return mirror::String::AllocFromCharArray<instrumented_bool>( \ + self, char_count, handle_array, offset, allocator_type).Ptr(); \ } \ extern "C" mirror::String* artAllocStringFromStringFromCode##suffix##suffix2( /* NOLINT */ \ mirror::String* string, Thread* self) \ REQUIRES_SHARED(Locks::mutator_lock_) { \ StackHandleScope<1> hs(self); \ Handle<mirror::String> handle_string(hs.NewHandle(string)); \ - return mirror::String::AllocFromString<instrumented_bool>(self, handle_string->GetLength(), \ - handle_string, 0, allocator_type); \ + return mirror::String::AllocFromString<instrumented_bool>( \ + self, handle_string->GetLength(), handle_string, 0, allocator_type).Ptr(); \ } #define GENERATE_ENTRYPOINTS_FOR_ALLOCATOR(suffix, allocator_type) \ diff --git a/runtime/gc/heap_test.cc b/runtime/gc/heap_test.cc index fa10150d46..5f4621e6f1 100644 --- a/runtime/gc/heap_test.cc +++ b/runtime/gc/heap_test.cc @@ -74,7 +74,8 @@ TEST_F(HeapTest, GarbageCollectClassLinkerInit) { Handle<mirror::ObjectArray<mirror::Object>> array(hs2.NewHandle( mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(), c.Get(), 2048))); for (size_t j = 0; j < 2048; ++j) { - mirror::String* string = mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello, world!"); + ObjPtr<mirror::String> string = + mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello, world!"); // handle scope operator -> deferences the handle scope before running the method. array->Set<false>(j, string); } diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc index 7a40ab431f..db3032a908 100644 --- a/runtime/interpreter/interpreter_common.cc +++ b/runtime/interpreter/interpreter_common.cc @@ -805,7 +805,7 @@ static bool DoVarHandleInvokeCommon(Thread* self, const uint32_t vRegC = is_var_args ? inst->VRegC_45cc() : inst->VRegC_4rcc(); ObjPtr<mirror::Object> receiver(shadow_frame.GetVRegReference(vRegC)); - Handle<mirror::VarHandle> var_handle(hs.NewHandle(down_cast<mirror::VarHandle*>(receiver.Ptr()))); + Handle<mirror::VarHandle> var_handle(hs.NewHandle(ObjPtr<mirror::VarHandle>::DownCast(receiver))); if (is_var_args) { uint32_t args[Instruction::kMaxVarArgRegs]; inst->GetVarArgs(args, inst_data); diff --git a/runtime/jni/jni_internal.cc b/runtime/jni/jni_internal.cc index 7c0db3015c..f8d0ef17bc 100644 --- a/runtime/jni/jni_internal.cc +++ b/runtime/jni/jni_internal.cc @@ -1779,7 +1779,7 @@ class JNI { return nullptr; } ScopedObjectAccess soa(env); - mirror::String* result = mirror::String::AllocFromUtf16(soa.Self(), char_count, chars); + ObjPtr<mirror::String> result = mirror::String::AllocFromUtf16(soa.Self(), char_count, chars); return soa.AddLocalReference<jstring>(result); } @@ -1788,7 +1788,7 @@ class JNI { return nullptr; } ScopedObjectAccess soa(env); - mirror::String* result = mirror::String::AllocFromModifiedUtf8(soa.Self(), utf); + ObjPtr<mirror::String> result = mirror::String::AllocFromModifiedUtf8(soa.Self(), utf); return soa.AddLocalReference<jstring>(result); } diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 22597ddc29..220d66b0b3 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -731,7 +731,7 @@ inline void Class::SetClinitThreadId(pid_t new_clinit_thread_id) { template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> -inline String* Class::GetName() { +inline ObjPtr<String> Class::GetName() { return GetFieldObject<String, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(Class, name_)); } diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index 239105f36f..74b22c4204 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -252,8 +252,8 @@ void Class::SetClassSize(uint32_t new_class_size) { // Class.getName: keywords for primitive types, regular "[I" form for primitive arrays (so "int" // but "[I"), and arrays of reference types written between "L" and ";" but with dots rather than // slashes (so "java.lang.String" but "[Ljava.lang.String;"). Madness. -String* Class::ComputeName(Handle<Class> h_this) { - String* name = h_this->GetName(); +ObjPtr<String> Class::ComputeName(Handle<Class> h_this) { + ObjPtr<String> name = h_this->GetName(); if (name != nullptr) { return name; } diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index e8a7c1e3d6..6ae3c7959e 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -340,10 +340,10 @@ class MANAGED Class final : public Object { template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, ReadBarrierOption kReadBarrierOption = kWithReadBarrier> - String* GetName() REQUIRES_SHARED(Locks::mutator_lock_); // Returns the cached name. + ObjPtr<String> GetName() REQUIRES_SHARED(Locks::mutator_lock_); // Returns the cached name. void SetName(ObjPtr<String> name) REQUIRES_SHARED(Locks::mutator_lock_); // Sets the cached name. // Computes the name, then sets the cached value. - static String* ComputeName(Handle<Class> h_this) REQUIRES_SHARED(Locks::mutator_lock_) + static ObjPtr<String> ComputeName(Handle<Class> h_this) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> diff --git a/runtime/mirror/string-alloc-inl.h b/runtime/mirror/string-alloc-inl.h index 4c4e2af3e7..4330235dd9 100644 --- a/runtime/mirror/string-alloc-inl.h +++ b/runtime/mirror/string-alloc-inl.h @@ -25,6 +25,7 @@ #include "class.h" #include "class_root.h" #include "gc/heap-inl.h" +#include "obj_ptr.h" #include "runtime.h" #include "runtime_globals.h" #include "thread.h" @@ -154,10 +155,10 @@ class SetStringCountAndValueVisitorFromString { }; template <bool kIsInstrumented, typename PreFenceVisitor> -inline String* String::Alloc(Thread* self, - int32_t utf16_length_with_flag, - gc::AllocatorType allocator_type, - const PreFenceVisitor& pre_fence_visitor) { +inline ObjPtr<String> String::Alloc(Thread* self, + int32_t utf16_length_with_flag, + gc::AllocatorType allocator_type, + const PreFenceVisitor& pre_fence_visitor) { constexpr size_t header_size = sizeof(String); const bool compressible = kUseStringCompression && String::IsCompressed(utf16_length_with_flag); const size_t block_size = (compressible) ? sizeof(uint8_t) : sizeof(uint16_t); @@ -189,67 +190,64 @@ inline String* String::Alloc(Thread* self, } gc::Heap* heap = runtime->GetHeap(); - return down_cast<String*>( + return ObjPtr<String>::DownCast(MakeObjPtr( heap->AllocObjectWithAllocator<kIsInstrumented, true>(self, string_class, alloc_size, allocator_type, - pre_fence_visitor)); + pre_fence_visitor))); } template <bool kIsInstrumented> -inline String* String::AllocEmptyString(Thread* self, gc::AllocatorType allocator_type) { +inline ObjPtr<String> String::AllocEmptyString(Thread* self, gc::AllocatorType allocator_type) { const int32_t length_with_flag = String::GetFlaggedCount(0, /* compressible= */ true); SetStringCountVisitor visitor(length_with_flag); return Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); } template <bool kIsInstrumented> -inline String* String::AllocFromByteArray(Thread* self, - int32_t byte_length, - Handle<ByteArray> array, - int32_t offset, - int32_t high_byte, - gc::AllocatorType allocator_type) { +inline ObjPtr<String> String::AllocFromByteArray(Thread* self, + int32_t byte_length, + Handle<ByteArray> array, + int32_t offset, + int32_t high_byte, + gc::AllocatorType allocator_type) { const uint8_t* const src = reinterpret_cast<uint8_t*>(array->GetData()) + offset; high_byte &= 0xff; // Extract the relevant bits before determining `compressible`. const bool compressible = kUseStringCompression && String::AllASCII<uint8_t>(src, byte_length) && (high_byte == 0); const int32_t length_with_flag = String::GetFlaggedCount(byte_length, compressible); SetStringCountAndBytesVisitor visitor(length_with_flag, array, offset, high_byte << 8); - String* string = Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); - return string; + return Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); } template <bool kIsInstrumented> -inline String* String::AllocFromCharArray(Thread* self, - int32_t count, - Handle<CharArray> array, - int32_t offset, - gc::AllocatorType allocator_type) { +inline ObjPtr<String> String::AllocFromCharArray(Thread* self, + int32_t count, + Handle<CharArray> array, + int32_t offset, + gc::AllocatorType allocator_type) { // It is a caller error to have a count less than the actual array's size. DCHECK_GE(array->GetLength(), count); const bool compressible = kUseStringCompression && String::AllASCII<uint16_t>(array->GetData() + offset, count); const int32_t length_with_flag = String::GetFlaggedCount(count, compressible); SetStringCountAndValueVisitorFromCharArray visitor(length_with_flag, array, offset); - String* new_string = Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); - return new_string; + return Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); } template <bool kIsInstrumented> -inline String* String::AllocFromString(Thread* self, - int32_t string_length, - Handle<String> string, - int32_t offset, - gc::AllocatorType allocator_type) { +inline ObjPtr<String> String::AllocFromString(Thread* self, + int32_t string_length, + Handle<String> string, + int32_t offset, + gc::AllocatorType allocator_type) { const bool compressible = kUseStringCompression && ((string->IsCompressed()) ? true : String::AllASCII<uint16_t>(string->GetValue() + offset, string_length)); const int32_t length_with_flag = String::GetFlaggedCount(string_length, compressible); SetStringCountAndValueVisitorFromString visitor(length_with_flag, string, offset); - String* new_string = Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); - return new_string; + return Alloc<kIsInstrumented>(self, length_with_flag, allocator_type, visitor); } } // namespace mirror diff --git a/runtime/mirror/string.cc b/runtime/mirror/string.cc index bf99c37ec7..1881c5782c 100644 --- a/runtime/mirror/string.cc +++ b/runtime/mirror/string.cc @@ -119,7 +119,9 @@ ObjPtr<String> String::DoReplace(Thread* self, Handle<String> src, uint16_t old_ return string; } -String* String::AllocFromStrings(Thread* self, Handle<String> string, Handle<String> string2) { +ObjPtr<String> String::AllocFromStrings(Thread* self, + Handle<String> string, + Handle<String> string2) { int32_t length = string->GetLength(); int32_t length2 = string2->GetLength(); gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); @@ -153,10 +155,12 @@ String* String::AllocFromStrings(Thread* self, Handle<String> string, Handle<Str memcpy(new_value + length, string2->GetValue(), length2 * sizeof(uint16_t)); } } - return new_string.Ptr(); + return new_string; } -String* String::AllocFromUtf16(Thread* self, int32_t utf16_length, const uint16_t* utf16_data_in) { +ObjPtr<String> String::AllocFromUtf16(Thread* self, + int32_t utf16_length, + const uint16_t* utf16_data_in) { CHECK(utf16_data_in != nullptr || utf16_length == 0); gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); const bool compressible = kUseStringCompression && @@ -175,26 +179,26 @@ String* String::AllocFromUtf16(Thread* self, int32_t utf16_length, const uint16_ uint16_t* array = string->GetValue(); memcpy(array, utf16_data_in, utf16_length * sizeof(uint16_t)); } - return string.Ptr(); + return string; } -String* String::AllocFromModifiedUtf8(Thread* self, const char* utf) { +ObjPtr<String> String::AllocFromModifiedUtf8(Thread* self, const char* utf) { DCHECK(utf != nullptr); size_t byte_count = strlen(utf); size_t char_count = CountModifiedUtf8Chars(utf, byte_count); return AllocFromModifiedUtf8(self, char_count, utf, byte_count); } -String* String::AllocFromModifiedUtf8(Thread* self, - int32_t utf16_length, - const char* utf8_data_in) { +ObjPtr<String> String::AllocFromModifiedUtf8(Thread* self, + int32_t utf16_length, + const char* utf8_data_in) { return AllocFromModifiedUtf8(self, utf16_length, utf8_data_in, strlen(utf8_data_in)); } -String* String::AllocFromModifiedUtf8(Thread* self, - int32_t utf16_length, - const char* utf8_data_in, - int32_t utf8_length) { +ObjPtr<String> String::AllocFromModifiedUtf8(Thread* self, + int32_t utf16_length, + const char* utf8_data_in, + int32_t utf8_length) { gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); const bool compressible = kUseStringCompression && (utf16_length == utf8_length); const int32_t utf16_length_with_flag = String::GetFlaggedCount(utf16_length, compressible); @@ -209,7 +213,7 @@ String* String::AllocFromModifiedUtf8(Thread* self, uint16_t* utf16_data_out = string->GetValue(); ConvertModifiedUtf8ToUtf16(utf16_data_out, utf16_length, utf8_data_in, utf8_length); } - return string.Ptr(); + return string; } bool String::Equals(ObjPtr<String> that) { @@ -319,7 +323,7 @@ int32_t String::CompareTo(ObjPtr<String> rhs) { return count_diff; } -CharArray* String::ToCharArray(Thread* self) { +ObjPtr<CharArray> String::ToCharArray(Thread* self) { StackHandleScope<1> hs(self); Handle<String> string(hs.NewHandle(this)); ObjPtr<CharArray> result = CharArray::Alloc(self, GetLength()); @@ -335,7 +339,7 @@ CharArray* String::ToCharArray(Thread* self) { } else { self->AssertPendingOOMException(); } - return result.Ptr(); + return result; } void String::GetChars(int32_t start, int32_t end, Handle<CharArray> array, int32_t index) { diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h index 4a7f4ae536..c98aa6b610 100644 --- a/runtime/mirror/string.h +++ b/runtime/mirror/string.h @@ -26,6 +26,7 @@ namespace art { template<class T> class Handle; +template<class MirrorType> class ObjPtr; struct StringOffsets; class StubTest_ReadBarrierForRoot_Test; @@ -114,43 +115,57 @@ class MANAGED String final : public Object { ObjPtr<String> Intern() REQUIRES_SHARED(Locks::mutator_lock_); template <bool kIsInstrumented> - ALWAYS_INLINE static String* AllocFromByteArray(Thread* self, int32_t byte_length, - Handle<ByteArray> array, int32_t offset, - int32_t high_byte, - gc::AllocatorType allocator_type) + ALWAYS_INLINE static ObjPtr<String> AllocFromByteArray(Thread* self, + int32_t byte_length, + Handle<ByteArray> array, + int32_t offset, + int32_t high_byte, + gc::AllocatorType allocator_type) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> - ALWAYS_INLINE static String* AllocFromCharArray(Thread* self, int32_t count, - Handle<CharArray> array, int32_t offset, - gc::AllocatorType allocator_type) + ALWAYS_INLINE static ObjPtr<String> AllocFromCharArray(Thread* self, + int32_t count, + Handle<CharArray> array, + int32_t offset, + gc::AllocatorType allocator_type) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> - ALWAYS_INLINE static String* AllocFromString(Thread* self, int32_t string_length, - Handle<String> string, int32_t offset, - gc::AllocatorType allocator_type) + ALWAYS_INLINE static ObjPtr<String> AllocFromString(Thread* self, + int32_t string_length, + Handle<String> string, + int32_t offset, + gc::AllocatorType allocator_type) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> - ALWAYS_INLINE static String* AllocEmptyString(Thread* self, - gc::AllocatorType allocator_type) + ALWAYS_INLINE static ObjPtr<String> AllocEmptyString(Thread* self, + gc::AllocatorType allocator_type) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - static String* AllocFromStrings(Thread* self, Handle<String> string, Handle<String> string2) + static ObjPtr<String> AllocFromStrings(Thread* self, + Handle<String> string, + Handle<String> string2) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - static String* AllocFromUtf16(Thread* self, int32_t utf16_length, const uint16_t* utf16_data_in) + static ObjPtr<String> AllocFromUtf16(Thread* self, + int32_t utf16_length, + const uint16_t* utf16_data_in) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - static String* AllocFromModifiedUtf8(Thread* self, const char* utf) + static ObjPtr<String> AllocFromModifiedUtf8(Thread* self, const char* utf) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - static String* AllocFromModifiedUtf8(Thread* self, int32_t utf16_length, - const char* utf8_data_in, int32_t utf8_length) + static ObjPtr<String> AllocFromModifiedUtf8(Thread* self, + int32_t utf16_length, + const char* utf8_data_in, + int32_t utf8_length) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - static String* AllocFromModifiedUtf8(Thread* self, int32_t utf16_length, const char* utf8_data_in) + static ObjPtr<String> AllocFromModifiedUtf8(Thread* self, + int32_t utf16_length, + const char* utf8_data_in) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); bool Equals(const char* modified_utf8) REQUIRES_SHARED(Locks::mutator_lock_); @@ -168,7 +183,7 @@ class MANAGED String final : public Object { int32_t CompareTo(ObjPtr<String> other) REQUIRES_SHARED(Locks::mutator_lock_); - CharArray* ToCharArray(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) + ObjPtr<CharArray> ToCharArray(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); void GetChars(int32_t start, int32_t end, Handle<CharArray> array, int32_t index) @@ -234,9 +249,10 @@ class MANAGED String final : public Object { } template <bool kIsInstrumented, typename PreFenceVisitor> - ALWAYS_INLINE static String* Alloc(Thread* self, int32_t utf16_length_with_flag, - gc::AllocatorType allocator_type, - const PreFenceVisitor& pre_fence_visitor) + ALWAYS_INLINE static ObjPtr<String> Alloc(Thread* self, + int32_t utf16_length_with_flag, + gc::AllocatorType allocator_type, + const PreFenceVisitor& pre_fence_visitor) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses". diff --git a/runtime/mirror/var_handle_test.cc b/runtime/mirror/var_handle_test.cc index a349e3449b..3382066043 100644 --- a/runtime/mirror/var_handle_test.cc +++ b/runtime/mirror/var_handle_test.cc @@ -52,7 +52,7 @@ class VarHandleTest : public CommonRuntimeTest { if (art_field->IsStatic()) { InitializeVarHandle(fvh.Get(), var_type, access_modes_bit_mask); } else { - Handle<Class> declaring_type = hs.NewHandle(art_field->GetDeclaringClass().Ptr()); + Handle<Class> declaring_type = hs.NewHandle(art_field->GetDeclaringClass()); InitializeVarHandle(fvh.Get(), var_type, declaring_type, diff --git a/runtime/native/java_lang_String.cc b/runtime/native/java_lang_String.cc index 4be2086ec9..83498f6eb0 100644 --- a/runtime/native/java_lang_String.cc +++ b/runtime/native/java_lang_String.cc @@ -44,8 +44,7 @@ static jint String_compareTo(JNIEnv* env, jobject java_this, jstring java_rhs) { ThrowNullPointerException("rhs == null"); return -1; } else { - return soa.Decode<mirror::String>(java_this)->CompareTo( - soa.Decode<mirror::String>(java_rhs).Ptr()); + return soa.Decode<mirror::String>(java_this)->CompareTo(soa.Decode<mirror::String>(java_rhs)); } } diff --git a/runtime/non_debuggable_classes.cc b/runtime/non_debuggable_classes.cc index 8b6c2edc66..412ab0a6d0 100644 --- a/runtime/non_debuggable_classes.cc +++ b/runtime/non_debuggable_classes.cc @@ -32,7 +32,7 @@ void NonDebuggableClasses::AddNonDebuggableClass(jclass klass) { JNIEnvExt* env = self->GetJniEnv(); ObjPtr<mirror::Class> mirror_klass(self->DecodeJObject(klass)->AsClass()); for (jclass c : non_debuggable_classes) { - if (self->DecodeJObject(c)->AsClass() == mirror_klass.Ptr()) { + if (self->DecodeJObject(c)->AsClass() == mirror_klass) { return; } } diff --git a/runtime/reference_table_test.cc b/runtime/reference_table_test.cc index 2acb2c7a82..e5c1e6aaae 100644 --- a/runtime/reference_table_test.cc +++ b/runtime/reference_table_test.cc @@ -42,7 +42,7 @@ using android::base::StringPrintf; class ReferenceTableTest : public CommonRuntimeTest {}; -static mirror::Object* CreateWeakReference(mirror::Object* referent) +static ObjPtr<mirror::Object> CreateWeakReference(ObjPtr<mirror::Object> referent) REQUIRES_SHARED(Locks::mutator_lock_) { Thread* self = Thread::Current(); ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); @@ -77,7 +77,9 @@ static mirror::Object* CreateWeakReference(mirror::Object* referent) TEST_F(ReferenceTableTest, Basics) { ScopedObjectAccess soa(Thread::Current()); - mirror::Object* o1 = mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello"); + StackHandleScope<5u> hs(soa.Self()); + Handle<mirror::String> o1 = + hs.NewHandle(mirror::String::AllocFromModifiedUtf8(soa.Self(), "hello")); ReferenceTable rt("test", 0, 11); @@ -89,17 +91,17 @@ TEST_F(ReferenceTableTest, Basics) { EXPECT_EQ(0U, rt.Size()); } - // Check removal of all nullss in a empty table is a no-op. + // Check removal of all nulls in a empty table is a no-op. rt.Remove(nullptr); EXPECT_EQ(0U, rt.Size()); // Check removal of all o1 in a empty table is a no-op. - rt.Remove(o1); + rt.Remove(o1.Get()); EXPECT_EQ(0U, rt.Size()); // Add o1 and check we have 1 element and can dump. { - rt.Add(o1); + rt.Add(o1.Get()); EXPECT_EQ(1U, rt.Size()); std::ostringstream oss; rt.Dump(oss); @@ -108,9 +110,9 @@ TEST_F(ReferenceTableTest, Basics) { } // Add a second object 10 times and check dumping is sane. - ObjPtr<mirror::Object> o2 = mirror::ShortArray::Alloc(soa.Self(), 0); + Handle<mirror::ShortArray> o2 = hs.NewHandle(mirror::ShortArray::Alloc(soa.Self(), 0)); for (size_t i = 0; i < 10; ++i) { - rt.Add(o2); + rt.Add(o2.Get()); EXPECT_EQ(i + 2, rt.Size()); std::ostringstream oss; rt.Dump(oss); @@ -129,7 +131,7 @@ TEST_F(ReferenceTableTest, Basics) { // Remove o1 (first element). { - rt.Remove(o1); + rt.Remove(o1.Get()); EXPECT_EQ(10U, rt.Size()); std::ostringstream oss; rt.Dump(oss); @@ -138,7 +140,7 @@ TEST_F(ReferenceTableTest, Basics) { // Remove o2 ten times. for (size_t i = 0; i < 10; ++i) { - rt.Remove(o2); + rt.Remove(o2.Get()); EXPECT_EQ(9 - i, rt.Size()); std::ostringstream oss; rt.Dump(oss); @@ -154,7 +156,7 @@ TEST_F(ReferenceTableTest, Basics) { // Add a reference and check that the type of the referent is dumped. { - mirror::Object* empty_reference = CreateWeakReference(nullptr); + ObjPtr<mirror::Object> empty_reference = CreateWeakReference(nullptr); ASSERT_TRUE(empty_reference->IsReferenceInstance()); rt.Add(empty_reference); std::ostringstream oss; @@ -165,8 +167,9 @@ TEST_F(ReferenceTableTest, Basics) { } { - mirror::Object* string_referent = mirror::String::AllocFromModifiedUtf8(Thread::Current(), "A"); - mirror::Object* non_empty_reference = CreateWeakReference(string_referent); + ObjPtr<mirror::Object> string_referent = + mirror::String::AllocFromModifiedUtf8(Thread::Current(), "A"); + ObjPtr<mirror::Object> non_empty_reference = CreateWeakReference(string_referent); ASSERT_TRUE(non_empty_reference->IsReferenceInstance()); rt.Add(non_empty_reference); std::ostringstream oss; @@ -179,7 +182,6 @@ TEST_F(ReferenceTableTest, Basics) { // Add two objects. Enable allocation tracking for the latter. { - StackHandleScope<3> hs(soa.Self()); Handle<mirror::String> h_without_trace(hs.NewHandle( mirror::String::AllocFromModifiedUtf8(soa.Self(), "Without"))); diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index f32dd739ad..34b0f488a0 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -2724,7 +2724,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { : called_method->LookupResolvedReturnType(); if (return_type_class != nullptr) { return_type = &FromClass(called_method->GetReturnTypeDescriptor(), - return_type_class.Ptr(), + return_type_class, return_type_class->CannotBeAssignedFromOtherTypes()); } else { DCHECK(!can_load_classes_ || self_->IsExceptionPending()); |