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/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index 22701ac..c559389 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -229,20 +229,16 @@
mirror::Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass();
mirror::String* name2 = shadow_frame->GetVRegReference(arg_offset + 1)->AsString();
ArtField* found = nullptr;
- ArtField* fields = klass->GetIFields();
- for (int32_t i = 0, count = klass->NumInstanceFields(); i < count; ++i) {
- ArtField* f = &fields[i];
- if (name2->Equals(f->GetName())) {
- found = f;
+ for (ArtField& field : klass->GetIFields()) {
+ if (name2->Equals(field.GetName())) {
+ found = &field;
break;
}
}
if (found == nullptr) {
- fields = klass->GetSFields();
- for (int32_t i = 0, count = klass->NumStaticFields(); i < count; ++i) {
- ArtField* f = &fields[i];
- if (name2->Equals(f->GetName())) {
- found = f;
+ for (ArtField& field : klass->GetSFields()) {
+ if (name2->Equals(field.GetName())) {
+ found = &field;
break;
}
}