diff options
Diffstat (limited to 'runtime/class_linker_test.cc')
-rw-r--r-- | runtime/class_linker_test.cc | 96 |
1 files changed, 40 insertions, 56 deletions
diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc index 5d5d025050..1176bb133e 100644 --- a/runtime/class_linker_test.cc +++ b/runtime/class_linker_test.cc @@ -110,8 +110,7 @@ class ClassLinkerTest : public CommonRuntimeTest { EXPECT_FALSE(primitive->IsSynthetic()); EXPECT_EQ(0U, primitive->NumDirectMethods()); EXPECT_EQ(0U, primitive->NumVirtualMethods()); - EXPECT_EQ(0U, primitive->NumInstanceFields()); - EXPECT_EQ(0U, primitive->NumStaticFields()); + EXPECT_EQ(0U, primitive->NumFields()); EXPECT_EQ(0U, primitive->NumDirectInterfaces()); EXPECT_FALSE(primitive->HasVTable()); EXPECT_EQ(0, primitive->GetIfTableCount()); @@ -156,13 +155,12 @@ class ClassLinkerTest : public CommonRuntimeTest { EXPECT_FALSE(JavaLangObject->IsSynthetic()); EXPECT_EQ(4U, JavaLangObject->NumDirectMethods()); EXPECT_EQ(11U, JavaLangObject->NumVirtualMethods()); - EXPECT_EQ(2U, JavaLangObject->NumInstanceFields()); - EXPECT_STREQ(JavaLangObject->GetInstanceField(0)->GetName(), - "shadow$_klass_"); - EXPECT_STREQ(JavaLangObject->GetInstanceField(1)->GetName(), - "shadow$_monitor_"); + EXPECT_EQ(2U, JavaLangObject->NumFields()); + EXPECT_STREQ(JavaLangObject->GetField(0)->GetName(), "shadow$_klass_"); + EXPECT_FALSE(JavaLangObject->GetField(0)->IsStatic()); + EXPECT_STREQ(JavaLangObject->GetField(1)->GetName(), "shadow$_monitor_"); + EXPECT_FALSE(JavaLangObject->GetField(1)->IsStatic()); - EXPECT_EQ(0U, JavaLangObject->NumStaticFields()); EXPECT_EQ(0U, JavaLangObject->NumDirectInterfaces()); PointerSize pointer_size = class_linker_->GetImagePointerSize(); @@ -220,8 +218,7 @@ class ClassLinkerTest : public CommonRuntimeTest { EXPECT_FALSE(array->IsSynthetic()); EXPECT_EQ(0U, array->NumDirectMethods()); EXPECT_EQ(0U, array->NumVirtualMethods()); - EXPECT_EQ(0U, array->NumInstanceFields()); - EXPECT_EQ(0U, array->NumStaticFields()); + EXPECT_EQ(0U, array->NumFields()); EXPECT_EQ(2U, array->NumDirectInterfaces()); EXPECT_TRUE(array->ShouldHaveImt()); EXPECT_TRUE(array->ShouldHaveEmbeddedVTable()); @@ -343,27 +340,23 @@ class ClassLinkerTest : public CommonRuntimeTest { << "declaring class: " << method.GetDeclaringClass()->PrettyClass(); } - for (size_t i = 0; i < klass->NumInstanceFields(); i++) { - ArtField* field = klass->GetInstanceField(i); + for (size_t i = 0; i < klass->NumFields(); i++) { + ArtField* field = klass->GetField(i); AssertField(klass.Get(), field); - EXPECT_FALSE(field->IsStatic()); - } - - for (size_t i = 0; i < klass->NumStaticFields(); i++) { - ArtField* field = klass->GetStaticField(i); - AssertField(klass.Get(), field); - EXPECT_TRUE(field->IsStatic()); } // Confirm that all instances field offsets are packed together at the start. - EXPECT_GE(klass->NumInstanceFields(), klass->NumReferenceInstanceFields()); + EXPECT_GE(klass->ComputeNumInstanceFields(), klass->NumReferenceInstanceFields()); MemberOffset start_ref_offset = klass->GetFirstReferenceInstanceFieldOffset(); MemberOffset end_ref_offset(start_ref_offset.Uint32Value() + klass->NumReferenceInstanceFields() * sizeof(mirror::HeapReference<mirror::Object>)); MemberOffset current_ref_offset = start_ref_offset; - for (size_t i = 0; i < klass->NumInstanceFields(); i++) { - ArtField* field = klass->GetInstanceField(i); + for (size_t i = 0; i < klass->NumFields(); i++) { + ArtField* field = klass->GetField(i); + if (field->IsStatic()) { + continue; + } ObjPtr<mirror::Class> field_type = field->ResolveType(); ASSERT_TRUE(field_type != nullptr); if (!field->IsPrimitiveType()) { @@ -499,7 +492,8 @@ struct CheckOffsets { } } - size_t num_fields = is_static ? klass->NumStaticFields() : klass->NumInstanceFields(); + size_t num_fields = + is_static ? klass->ComputeNumStaticFields() : klass->ComputeNumInstanceFields(); if (offsets.size() != num_fields) { LOG(ERROR) << "Field count mismatch:" << " class=" << class_descriptor @@ -508,17 +502,25 @@ struct CheckOffsets { error = true; } + size_t j = 0; for (size_t i = 0; i < offsets.size(); i++) { - ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i); + ArtField* field = nullptr; + do { + field = klass->GetField(j++); + } while (field->IsStatic() != is_static); std::string_view field_name(field->GetName()); if (field_name != offsets[i].java_name) { error = true; } } + j = 0; if (error) { for (size_t i = 0; i < offsets.size(); i++) { CheckOffset& offset = offsets[i]; - ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i); + ArtField* field = nullptr; + do { + field = klass->GetField(j++); + } while (field->IsStatic() != is_static); std::string_view field_name(field->GetName()); if (field_name != offsets[i].java_name) { LOG(ERROR) << "JAVA FIELD ORDER MISMATCH NEXT LINE:"; @@ -530,17 +532,25 @@ struct CheckOffsets { } } + j = 0; for (size_t i = 0; i < offsets.size(); i++) { CheckOffset& offset = offsets[i]; - ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i); + ArtField* field = nullptr; + do { + field = klass->GetField(j++); + } while (field->IsStatic() != is_static); if (field->GetOffset().Uint32Value() != offset.cpp_offset) { error = true; } } + j = 0; if (error) { for (size_t i = 0; i < offsets.size(); i++) { CheckOffset& offset = offsets[i]; - ArtField* field = is_static ? klass->GetStaticField(i) : klass->GetInstanceField(i); + ArtField* field = nullptr; + do { + field = klass->GetField(j++); + } while (field->IsStatic() != is_static); if (field->GetOffset().Uint32Value() != offset.cpp_offset) { LOG(ERROR) << "OFFSET MISMATCH NEXT LINE:"; } @@ -583,7 +593,7 @@ struct ClassOffsets : public CheckOffsets<mirror::Class> { addOffset(OFFSETOF_MEMBER(mirror::Class, dex_class_def_idx_), "dexClassDefIndex"); addOffset(OFFSETOF_MEMBER(mirror::Class, dex_type_idx_), "dexTypeIndex"); addOffset(OFFSETOF_MEMBER(mirror::Class, ext_data_), "extData"); - addOffset(OFFSETOF_MEMBER(mirror::Class, ifields_), "iFields"); + addOffset(OFFSETOF_MEMBER(mirror::Class, fields_), "fields"); addOffset(OFFSETOF_MEMBER(mirror::Class, iftable_), "ifTable"); addOffset(OFFSETOF_MEMBER(mirror::Class, methods_), "methods"); addOffset(OFFSETOF_MEMBER(mirror::Class, name_), "name"); @@ -597,7 +607,6 @@ struct ClassOffsets : public CheckOffsets<mirror::Class> { addOffset(OFFSETOF_MEMBER(mirror::Class, primitive_type_), "primitiveType"); addOffset(OFFSETOF_MEMBER(mirror::Class, reference_instance_offsets_), "referenceInstanceOffsets"); - addOffset(OFFSETOF_MEMBER(mirror::Class, sfields_), "sFields"); addOffset(OFFSETOF_MEMBER(mirror::Class, status_), "status"); addOffset(OFFSETOF_MEMBER(mirror::Class, super_class_), "superClass"); addOffset(OFFSETOF_MEMBER(mirror::Class, virtual_methods_offset_), "virtualMethodsOffset"); @@ -975,8 +984,7 @@ TEST_F(ClassLinkerTest, FindClass) { EXPECT_FALSE(MyClass->IsSynthetic()); EXPECT_EQ(1U, MyClass->NumDirectMethods()); EXPECT_EQ(0U, MyClass->NumVirtualMethods()); - EXPECT_EQ(0U, MyClass->NumInstanceFields()); - EXPECT_EQ(0U, MyClass->NumStaticFields()); + EXPECT_EQ(0U, MyClass->NumFields()); EXPECT_EQ(0U, MyClass->NumDirectInterfaces()); EXPECT_OBJ_PTR_EQ(JavaLangObject->GetClass()->GetClass(), MyClass->GetClass()->GetClass()); @@ -1137,30 +1145,6 @@ TEST_F(ClassLinkerTest, ValidatePrimitiveArrayElementsOffset) { // Take it as given that bytes and booleans have byte alignment } -TEST_F(ClassLinkerTest, ValidateBoxedTypes) { - // Validate that the "value" field is always the 0th field in each of java.lang's box classes. - // This lets UnboxPrimitive avoid searching for the field by name at runtime. - ScopedObjectAccess soa(Thread::Current()); - ScopedNullHandle<mirror::ClassLoader> class_loader; - ObjPtr<mirror::Class> c; - c = FindClass("Ljava/lang/Boolean;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Byte;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Character;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Double;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Float;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Integer;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Long;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); - c = FindClass("Ljava/lang/Short;", class_loader); - EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); -} - TEST_F(ClassLinkerTest, TwoClassLoadersOneClass) { ScopedObjectAccess soa(Thread::Current()); StackHandleScope<3> hs(soa.Self()); @@ -1189,7 +1173,7 @@ TEST_F(ClassLinkerTest, StaticFields) { ArtMethod* clinit = statics->FindClassMethod("<clinit>", "()V", kRuntimePointerSize); EXPECT_TRUE(clinit == nullptr); - EXPECT_EQ(9U, statics->NumStaticFields()); + EXPECT_EQ(9U, statics->NumFields()); ArtField* s0 = statics->FindStaticField("s0", "Z"); EXPECT_EQ(s0->GetTypeAsPrimitiveType(), Primitive::kPrimBoolean); |