summaryrefslogtreecommitdiffstats
path: root/compiler/image_writer.cc
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2014-11-10 18:32:59 +0000
committerVladimir Marko <vmarko@google.com>2014-11-14 11:33:53 +0000
commit76649e8d775519fe19f2b14d18ac488c13296054 (patch)
treea899ec37ce51672c9e14d2954b2a7af7397e63da /compiler/image_writer.cc
parentd94a0a1d2868baaab49f4d2835bca086d98cf763 (diff)
downloadandroid_art-76649e8d775519fe19f2b14d18ac488c13296054.tar.gz
android_art-76649e8d775519fe19f2b14d18ac488c13296054.tar.bz2
android_art-76649e8d775519fe19f2b14d18ac488c13296054.zip
Keep original order of fields in Class.
The fields of a class are ordered alphabetically in the dex file. Keep the same order in the field arrays so that we can do binary search lookups by name. Those lookups will be implemented in a subsequent change in libcore/. Bug: 18211592 (cherry picked from commit bfa3ed0ad988e1da13626ddbaf6dcae0c58ea79e) Change-Id: I8f979de62ffe37d1c7d5c721717d2f3501e7c9e6
Diffstat (limited to 'compiler/image_writer.cc')
-rw-r--r--compiler/image_writer.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc
index cf2cddb896..b7283a4e19 100644
--- a/compiler/image_writer.cc
+++ b/compiler/image_writer.cc
@@ -484,13 +484,14 @@ void ImageWriter::WalkInstanceFields(mirror::Object* obj, mirror::Class* klass)
}
//
size_t num_reference_fields = h_class->NumReferenceInstanceFields();
+ MemberOffset field_offset = h_class->GetFirstReferenceInstanceFieldOffset();
for (size_t i = 0; i < num_reference_fields; ++i) {
- mirror::ArtField* field = h_class->GetInstanceField(i);
- MemberOffset field_offset = field->GetOffset();
mirror::Object* value = obj->GetFieldObject<mirror::Object>(field_offset);
if (value != nullptr) {
WalkFieldsInOrder(value);
}
+ field_offset = MemberOffset(field_offset.Uint32Value() +
+ sizeof(mirror::HeapReference<mirror::Object>));
}
}
@@ -507,13 +508,14 @@ void ImageWriter::WalkFieldsInOrder(mirror::Object* obj) {
// Walk static fields of a Class.
if (h_obj->IsClass()) {
size_t num_static_fields = klass->NumReferenceStaticFields();
+ MemberOffset field_offset = klass->GetFirstReferenceStaticFieldOffset();
for (size_t i = 0; i < num_static_fields; ++i) {
- mirror::ArtField* field = klass->GetStaticField(i);
- MemberOffset field_offset = field->GetOffset();
mirror::Object* value = h_obj->GetFieldObject<mirror::Object>(field_offset);
if (value != nullptr) {
WalkFieldsInOrder(value);
}
+ field_offset = MemberOffset(field_offset.Uint32Value() +
+ sizeof(mirror::HeapReference<mirror::Object>));
}
} else if (h_obj->IsObjectArray()) {
// Walk elements of an object array.