Move ArtFields and ArtMethods to be a length prefixed array
Fixes race conditions between changing method and fields arrays
being seen in the wrong order by the GC.
Bug: 22832610
Change-Id: Ia21d6698f73ba207a6392c3d6b9be2658933073f
diff --git a/runtime/art_field.cc b/runtime/art_field.cc
index e4a5834..3737e0d 100644
--- a/runtime/art_field.cc
+++ b/runtime/art_field.cc
@@ -49,10 +49,9 @@
ArtField* ArtField::FindInstanceFieldWithOffset(mirror::Class* klass, uint32_t field_offset) {
DCHECK(klass != nullptr);
- auto* instance_fields = klass->GetIFields();
- for (size_t i = 0, count = klass->NumInstanceFields(); i < count; ++i) {
- if (instance_fields[i].GetOffset().Uint32Value() == field_offset) {
- return &instance_fields[i];
+ for (ArtField& field : klass->GetIFields()) {
+ if (field.GetOffset().Uint32Value() == field_offset) {
+ return &field;
}
}
// We did not find field in the class: look into superclass.
@@ -62,10 +61,9 @@
ArtField* ArtField::FindStaticFieldWithOffset(mirror::Class* klass, uint32_t field_offset) {
DCHECK(klass != nullptr);
- auto* static_fields = klass->GetSFields();
- for (size_t i = 0, count = klass->NumStaticFields(); i < count; ++i) {
- if (static_fields[i].GetOffset().Uint32Value() == field_offset) {
- return &static_fields[i];
+ for (ArtField& field : klass->GetSFields()) {
+ if (field.GetOffset().Uint32Value() == field_offset) {
+ return &field;
}
}
return nullptr;