diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-03-27 14:35:38 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-04-10 12:57:27 -0700 |
commit | c785344b87221f5e4e6473e5b762e4e61fe65dcf (patch) | |
tree | cd32ad2c2604596a18926f04d4c313dab255ecfd /runtime/arch/stub_test.cc | |
parent | a29d93b380c9aeb8270e281aefbdd0c77a430d43 (diff) | |
download | art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.zip art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.tar.gz art-c785344b87221f5e4e6473e5b762e4e61fe65dcf.tar.bz2 |
Move ArtField to native
Add linear alloc. Moved ArtField to be native object. Changed image
writer to put ArtFields after the mirror section.
Savings:
2MB on low ram devices
4MB on normal devices
Total PSS measurements before (normal N5, 95s after shell start):
Image size: 7729152 bytes
23112 kB: .NonMoving
23212 kB: .NonMoving
22868 kB: .NonMoving
23072 kB: .NonMoving
22836 kB: .NonMoving
19618 kB: .Zygote
19850 kB: .Zygote
19623 kB: .Zygote
19924 kB: .Zygote
19612 kB: .Zygote
Avg: 42745.4 kB
After:
Image size: 7462912 bytes
17440 kB: .NonMoving
16776 kB: .NonMoving
16804 kB: .NonMoving
17812 kB: .NonMoving
16820 kB: .NonMoving
18788 kB: .Zygote
18856 kB: .Zygote
19064 kB: .Zygote
18841 kB: .Zygote
18629 kB: .Zygote
3499 kB: .LinearAlloc
3408 kB: .LinearAlloc
3424 kB: .LinearAlloc
3600 kB: .LinearAlloc
3436 kB: .LinearAlloc
Avg: 39439.4 kB
No reflection performance changes.
Bug: 19264997
Bug: 17643507
Change-Id: I10c73a37913332080aeb978c7c94713bdfe4fe1c
Diffstat (limited to 'runtime/arch/stub_test.cc')
-rw-r--r-- | runtime/arch/stub_test.cc | 296 |
1 files changed, 132 insertions, 164 deletions
diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc index 0769687..d7de119 100644 --- a/runtime/arch/stub_test.cc +++ b/runtime/arch/stub_test.cc @@ -16,9 +16,9 @@ #include <cstdio> +#include "art_field-inl.h" #include "common_runtime_test.h" #include "entrypoints/quick/quick_entrypoints_enum.h" -#include "mirror/art_field-inl.h" #include "mirror/art_method-inl.h" #include "mirror/class-inl.h" #include "mirror/string-inl.h" @@ -1305,7 +1305,7 @@ TEST_F(StubTest, StringCompareTo) { } -static void GetSetBooleanStatic(Handle<mirror::ArtField>* f, Thread* self, +static void GetSetBooleanStatic(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) @@ -1313,14 +1313,14 @@ static void GetSetBooleanStatic(Handle<mirror::ArtField>* f, Thread* self, uint8_t values[num_values] = { 0, 1, 2, 128, 0xFF }; for (size_t i = 0; i < num_values; ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), static_cast<size_t>(values[i]), 0U, StubTest::GetEntrypoint(self, kQuickSet8Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGetBooleanStatic), self, @@ -1335,21 +1335,21 @@ static void GetSetBooleanStatic(Handle<mirror::ArtField>* f, Thread* self, std::cout << "Skipping set_boolean_static as I don't know how to do that on " << kRuntimeISA << std::endl; #endif } -static void GetSetByteStatic(Handle<mirror::ArtField>* f, Thread* self, - mirror::ArtMethod* referrer, StubTest* test) +static void GetSetByteStatic(ArtField* f, Thread* self, mirror::ArtMethod* referrer, + StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) int8_t values[] = { -128, -64, 0, 64, 127 }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), static_cast<size_t>(values[i]), 0U, StubTest::GetEntrypoint(self, kQuickSet8Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGetByteStatic), self, @@ -1365,26 +1365,26 @@ static void GetSetByteStatic(Handle<mirror::ArtField>* f, Thread* self, } -static void GetSetBooleanInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, - Thread* self, mirror::ArtMethod* referrer, StubTest* test) +static void GetSetBooleanInstance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, + mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) uint8_t values[] = { 0, true, 2, 128, 0xFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet8Instance), self, referrer); - uint8_t res = f->Get()->GetBoolean(obj->Get()); + uint8_t res = f->GetBoolean(obj->Get()); EXPECT_EQ(values[i], res) << "Iteration " << i; - f->Get()->SetBoolean<false>(obj->Get(), res); + f->SetBoolean<false>(obj->Get(), res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGetBooleanInstance), @@ -1399,25 +1399,25 @@ static void GetSetBooleanInstance(Handle<mirror::Object>* obj, Handle<mirror::Ar std::cout << "Skipping set_boolean_instance as I don't know how to do that on " << kRuntimeISA << std::endl; #endif } -static void GetSetByteInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, +static void GetSetByteInstance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) int8_t values[] = { -128, -64, 0, 64, 127 }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet8Instance), self, referrer); - int8_t res = f->Get()->GetByte(obj->Get()); + int8_t res = f->GetByte(obj->Get()); EXPECT_EQ(res, values[i]) << "Iteration " << i; - f->Get()->SetByte<false>(obj->Get(), ++res); + f->SetByte<false>(obj->Get(), ++res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGetByteInstance), @@ -1433,21 +1433,21 @@ static void GetSetByteInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtFi #endif } -static void GetSetCharStatic(Handle<mirror::ArtField>* f, Thread* self, mirror::ArtMethod* referrer, +static void GetSetCharStatic(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) uint16_t values[] = { 0, 1, 2, 255, 32768, 0xFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), static_cast<size_t>(values[i]), 0U, StubTest::GetEntrypoint(self, kQuickSet16Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGetCharStatic), self, @@ -1462,21 +1462,21 @@ static void GetSetCharStatic(Handle<mirror::ArtField>* f, Thread* self, mirror:: std::cout << "Skipping set_char_static as I don't know how to do that on " << kRuntimeISA << std::endl; #endif } -static void GetSetShortStatic(Handle<mirror::ArtField>* f, Thread* self, +static void GetSetShortStatic(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) int16_t values[] = { -0x7FFF, -32768, 0, 255, 32767, 0x7FFE }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), static_cast<size_t>(values[i]), 0U, StubTest::GetEntrypoint(self, kQuickSet16Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGetShortStatic), self, @@ -1492,25 +1492,25 @@ static void GetSetShortStatic(Handle<mirror::ArtField>* f, Thread* self, #endif } -static void GetSetCharInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, - Thread* self, mirror::ArtMethod* referrer, StubTest* test) +static void GetSetCharInstance(Handle<mirror::Object>* obj, ArtField* f, + Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) uint16_t values[] = { 0, 1, 2, 255, 32768, 0xFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet16Instance), self, referrer); - uint16_t res = f->Get()->GetChar(obj->Get()); + uint16_t res = f->GetChar(obj->Get()); EXPECT_EQ(res, values[i]) << "Iteration " << i; - f->Get()->SetChar<false>(obj->Get(), ++res); + f->SetChar<false>(obj->Get(), ++res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGetCharInstance), @@ -1525,25 +1525,25 @@ static void GetSetCharInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtFi std::cout << "Skipping set_char_instance as I don't know how to do that on " << kRuntimeISA << std::endl; #endif } -static void GetSetShortInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, +static void GetSetShortInstance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) int16_t values[] = { -0x7FFF, -32768, 0, 255, 32767, 0x7FFE }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet16Instance), self, referrer); - int16_t res = f->Get()->GetShort(obj->Get()); + int16_t res = f->GetShort(obj->Get()); EXPECT_EQ(res, values[i]) << "Iteration " << i; - f->Get()->SetShort<false>(obj->Get(), ++res); + f->SetShort<false>(obj->Get(), ++res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGetShortInstance), @@ -1559,21 +1559,21 @@ static void GetSetShortInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtF #endif } -static void GetSet32Static(Handle<mirror::ArtField>* f, Thread* self, mirror::ArtMethod* referrer, +static void GetSet32Static(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) uint32_t values[] = { 0, 1, 2, 255, 32768, 1000000, 0xFFFFFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), static_cast<size_t>(values[i]), 0U, StubTest::GetEntrypoint(self, kQuickSet32Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGet32Static), self, @@ -1590,27 +1590,27 @@ static void GetSet32Static(Handle<mirror::ArtField>* f, Thread* self, mirror::Ar } -static void GetSet32Instance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, +static void GetSet32Instance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) uint32_t values[] = { 0, 1, 2, 255, 32768, 1000000, 0xFFFFFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet32Instance), self, referrer); - int32_t res = f->Get()->GetInt(obj->Get()); + int32_t res = f->GetInt(obj->Get()); EXPECT_EQ(res, static_cast<int32_t>(values[i])) << "Iteration " << i; res++; - f->Get()->SetInt<false>(obj->Get(), res); + f->SetInt<false>(obj->Get(), res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGet32Instance), @@ -1649,17 +1649,17 @@ static void set_and_check_static(uint32_t f_idx, mirror::Object* val, Thread* se } #endif -static void GetSetObjStatic(Handle<mirror::ArtField>* f, Thread* self, mirror::ArtMethod* referrer, +static void GetSetObjStatic(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) - set_and_check_static((*f)->GetDexFieldIndex(), nullptr, self, referrer, test); + set_and_check_static(f->GetDexFieldIndex(), nullptr, self, referrer, test); // Allocate a string object for simplicity. mirror::String* str = mirror::String::AllocFromModifiedUtf8(self, "Test"); - set_and_check_static((*f)->GetDexFieldIndex(), str, self, referrer, test); + set_and_check_static(f->GetDexFieldIndex(), str, self, referrer, test); - set_and_check_static((*f)->GetDexFieldIndex(), nullptr, self, referrer, test); + set_and_check_static(f->GetDexFieldIndex(), nullptr, self, referrer, test); #else UNUSED(f, self, referrer, test); LOG(INFO) << "Skipping setObjstatic as I don't know how to do that on " << kRuntimeISA; @@ -1670,18 +1670,18 @@ static void GetSetObjStatic(Handle<mirror::ArtField>* f, Thread* self, mirror::A #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) -static void set_and_check_instance(Handle<mirror::ArtField>* f, mirror::Object* trg, +static void set_and_check_instance(ArtField* f, mirror::Object* trg, mirror::Object* val, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(trg), reinterpret_cast<size_t>(val), StubTest::GetEntrypoint(self, kQuickSetObjInstance), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(trg), 0U, StubTest::GetEntrypoint(self, kQuickGetObjInstance), @@ -1690,11 +1690,11 @@ static void set_and_check_instance(Handle<mirror::ArtField>* f, mirror::Object* EXPECT_EQ(res, reinterpret_cast<size_t>(val)) << "Value " << val; - EXPECT_EQ(val, f->Get()->GetObj(trg)); + EXPECT_EQ(val, f->GetObj(trg)); } #endif -static void GetSetObjInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, +static void GetSetObjInstance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if defined(__i386__) || defined(__arm__) || defined(__aarch64__) || (defined(__x86_64__) && !defined(__APPLE__)) @@ -1716,20 +1716,20 @@ static void GetSetObjInstance(Handle<mirror::Object>* obj, Handle<mirror::ArtFie // TODO: Complete these tests for 32b architectures. -static void GetSet64Static(Handle<mirror::ArtField>* f, Thread* self, mirror::ArtMethod* referrer, +static void GetSet64Static(ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if (defined(__x86_64__) && !defined(__APPLE__)) || defined(__aarch64__) uint64_t values[] = { 0, 1, 2, 255, 32768, 1000000, 0xFFFFFFFF, 0xFFFFFFFFFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3UWithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3UWithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), values[i], StubTest::GetEntrypoint(self, kQuickSet64Static), self, referrer); - size_t res = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), 0U, 0U, StubTest::GetEntrypoint(self, kQuickGet64Static), self, @@ -1746,27 +1746,27 @@ static void GetSet64Static(Handle<mirror::ArtField>* f, Thread* self, mirror::Ar } -static void GetSet64Instance(Handle<mirror::Object>* obj, Handle<mirror::ArtField>* f, +static void GetSet64Instance(Handle<mirror::Object>* obj, ArtField* f, Thread* self, mirror::ArtMethod* referrer, StubTest* test) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { #if (defined(__x86_64__) && !defined(__APPLE__)) || defined(__aarch64__) uint64_t values[] = { 0, 1, 2, 255, 32768, 1000000, 0xFFFFFFFF, 0xFFFFFFFFFFFF }; for (size_t i = 0; i < arraysize(values); ++i) { - test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), static_cast<size_t>(values[i]), StubTest::GetEntrypoint(self, kQuickSet64Instance), self, referrer); - int64_t res = f->Get()->GetLong(obj->Get()); + int64_t res = f->GetLong(obj->Get()); EXPECT_EQ(res, static_cast<int64_t>(values[i])) << "Iteration " << i; res++; - f->Get()->SetLong<false>(obj->Get(), res); + f->SetLong<false>(obj->Get(), res); - size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>((*f)->GetDexFieldIndex()), + size_t res2 = test->Invoke3WithReferrer(static_cast<size_t>(f->GetDexFieldIndex()), reinterpret_cast<size_t>(obj->Get()), 0U, StubTest::GetEntrypoint(self, kQuickGet64Instance), @@ -1792,7 +1792,7 @@ static void TestFields(Thread* self, StubTest* test, Primitive::Type test_type) CHECK(o != NULL); ScopedObjectAccess soa(self); - StackHandleScope<5> hs(self); + StackHandleScope<4> hs(self); Handle<mirror::Object> obj(hs.NewHandle(soa.Decode<mirror::Object*>(o))); Handle<mirror::Class> c(hs.NewHandle(obj->GetClass())); // Need a method as a referrer @@ -1801,112 +1801,80 @@ static void TestFields(Thread* self, StubTest* test, Primitive::Type test_type) // Play with it... // Static fields. - { - Handle<mirror::ObjectArray<mirror::ArtField>> fields(hs.NewHandle(c.Get()->GetSFields())); - int32_t num_fields = fields->GetLength(); - for (int32_t i = 0; i < num_fields; ++i) { - StackHandleScope<1> hs2(self); - Handle<mirror::ArtField> f(hs2.NewHandle(fields->Get(i))); - - Primitive::Type type = f->GetTypeAsPrimitiveType(); - switch (type) { - case Primitive::Type::kPrimBoolean: - if (test_type == type) { - GetSetBooleanStatic(&f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimByte: - if (test_type == type) { - GetSetByteStatic(&f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimChar: - if (test_type == type) { - GetSetCharStatic(&f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimShort: - if (test_type == type) { - GetSetShortStatic(&f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimInt: - if (test_type == type) { - GetSet32Static(&f, self, m.Get(), test); - } - break; - - case Primitive::Type::kPrimLong: - if (test_type == type) { - GetSet64Static(&f, self, m.Get(), test); - } - break; - - case Primitive::Type::kPrimNot: - // Don't try array. - if (test_type == type && f->GetTypeDescriptor()[0] != '[') { - GetSetObjStatic(&f, self, m.Get(), test); - } - break; - - default: - break; // Skip. - } + ArtField* fields = c->GetSFields(); + size_t num_fields = c->NumStaticFields(); + for (size_t i = 0; i < num_fields; ++i) { + ArtField* f = &fields[i]; + Primitive::Type type = f->GetTypeAsPrimitiveType(); + if (test_type != type) { + continue; + } + switch (type) { + case Primitive::Type::kPrimBoolean: + GetSetBooleanStatic(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimByte: + GetSetByteStatic(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimChar: + GetSetCharStatic(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimShort: + GetSetShortStatic(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimInt: + GetSet32Static(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimLong: + GetSet64Static(f, self, m.Get(), test); + break; + case Primitive::Type::kPrimNot: + // Don't try array. + if (f->GetTypeDescriptor()[0] != '[') { + GetSetObjStatic(f, self, m.Get(), test); + } + break; + default: + break; // Skip. } } // Instance fields. - { - Handle<mirror::ObjectArray<mirror::ArtField>> fields(hs.NewHandle(c.Get()->GetIFields())); - int32_t num_fields = fields->GetLength(); - for (int32_t i = 0; i < num_fields; ++i) { - StackHandleScope<1> hs2(self); - Handle<mirror::ArtField> f(hs2.NewHandle(fields->Get(i))); - - Primitive::Type type = f->GetTypeAsPrimitiveType(); - switch (type) { - case Primitive::Type::kPrimBoolean: - if (test_type == type) { - GetSetBooleanInstance(&obj, &f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimByte: - if (test_type == type) { - GetSetByteInstance(&obj, &f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimChar: - if (test_type == type) { - GetSetCharInstance(&obj, &f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimShort: - if (test_type == type) { - GetSetShortInstance(&obj, &f, self, m.Get(), test); - } - break; - case Primitive::Type::kPrimInt: - if (test_type == type) { - GetSet32Instance(&obj, &f, self, m.Get(), test); - } - break; - - case Primitive::Type::kPrimLong: - if (test_type == type) { - GetSet64Instance(&obj, &f, self, m.Get(), test); - } - break; - - case Primitive::Type::kPrimNot: - // Don't try array. - if (test_type == type && f->GetTypeDescriptor()[0] != '[') { - GetSetObjInstance(&obj, &f, self, m.Get(), test); - } - break; - - default: - break; // Skip. - } + fields = c->GetIFields(); + num_fields = c->NumInstanceFields(); + for (size_t i = 0; i < num_fields; ++i) { + ArtField* f = &fields[i]; + Primitive::Type type = f->GetTypeAsPrimitiveType(); + if (test_type != type) { + continue; + } + switch (type) { + case Primitive::Type::kPrimBoolean: + GetSetBooleanInstance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimByte: + GetSetByteInstance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimChar: + GetSetCharInstance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimShort: + GetSetShortInstance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimInt: + GetSet32Instance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimLong: + GetSet64Instance(&obj, f, self, m.Get(), test); + break; + case Primitive::Type::kPrimNot: + // Don't try array. + if (f->GetTypeDescriptor()[0] != '[') { + GetSetObjInstance(&obj, f, self, m.Get(), test); + } + break; + default: + break; // Skip. } } |