diff options
author | Vladimir Marko <vmarko@google.com> | 2014-11-10 18:32:59 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2014-11-14 11:33:53 +0000 |
commit | 76649e8d775519fe19f2b14d18ac488c13296054 (patch) | |
tree | a899ec37ce51672c9e14d2954b2a7af7397e63da /runtime/mirror/object.cc | |
parent | d94a0a1d2868baaab49f4d2835bca086d98cf763 (diff) | |
download | art-76649e8d775519fe19f2b14d18ac488c13296054.zip art-76649e8d775519fe19f2b14d18ac488c13296054.tar.gz art-76649e8d775519fe19f2b14d18ac488c13296054.tar.bz2 |
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 'runtime/mirror/object.cc')
-rw-r--r-- | runtime/mirror/object.cc | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/runtime/mirror/object.cc b/runtime/mirror/object.cc index 4227723..fa1f226 100644 --- a/runtime/mirror/object.cc +++ b/runtime/mirror/object.cc @@ -200,10 +200,11 @@ void Object::CheckFieldAssignmentImpl(MemberOffset field_offset, Object* new_val for (Class* cur = c; cur != NULL; cur = cur->GetSuperClass()) { ObjectArray<ArtField>* fields = cur->GetIFields(); if (fields != NULL) { - size_t num_ref_ifields = cur->NumReferenceInstanceFields(); - for (size_t i = 0; i < num_ref_ifields; ++i) { + size_t num_ifields = fields->GetLength(); + for (size_t i = 0; i < num_ifields; ++i) { ArtField* field = fields->Get(i); if (field->GetOffset().Int32Value() == field_offset.Int32Value()) { + CHECK_NE(field->GetTypeAsPrimitiveType(), Primitive::kPrimNot); StackHandleScope<1> hs(Thread::Current()); FieldHelper fh(hs.NewHandle(field)); CHECK(fh.GetType()->IsAssignableFrom(new_value->GetClass())); @@ -219,10 +220,11 @@ void Object::CheckFieldAssignmentImpl(MemberOffset field_offset, Object* new_val if (IsClass()) { ObjectArray<ArtField>* fields = AsClass()->GetSFields(); if (fields != NULL) { - size_t num_ref_sfields = AsClass()->NumReferenceStaticFields(); - for (size_t i = 0; i < num_ref_sfields; ++i) { + size_t num_sfields = fields->GetLength(); + for (size_t i = 0; i < num_sfields; ++i) { ArtField* field = fields->Get(i); if (field->GetOffset().Int32Value() == field_offset.Int32Value()) { + CHECK_NE(field->GetTypeAsPrimitiveType(), Primitive::kPrimNot); StackHandleScope<1> hs(Thread::Current()); FieldHelper fh(hs.NewHandle(field)); CHECK(fh.GetType()->IsAssignableFrom(new_value->GetClass())); |