summaryrefslogtreecommitdiff
path: root/runtime/class_linker_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/class_linker_test.cc')
-rw-r--r--runtime/class_linker_test.cc96
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);