Remove deprecated code on obsolete method.
Class initialization doesn't happen during class redefinition:
https://android-review.googlesource.com/c/platform/art/+/1124318
So the comment is outdated and we can remove the obsolete check.
Test: test.py
Change-Id: Ia71c154577eb188cc417042621afd31be9f1bf09
diff --git a/runtime/art_field-inl.h b/runtime/art_field-inl.h
index 80af230..d57110f 100644
--- a/runtime/art_field-inl.h
+++ b/runtime/art_field-inl.h
@@ -40,15 +40,11 @@
return GetDeclaringClass<kWithoutReadBarrier>()->IsProxyClass<kVerifyNone>();
}
-// We are only ever allowed to set our own final fields. We do need to be careful since if a
-// structural redefinition occurs during <clinit> we can end up trying to set the non-obsolete
-// class's fields from the obsolete class. This is something we want to allow. This is tested by
-// run-test 2002-virtual-structural-initializing.
+// We are only ever allowed to set our own final fields
inline bool ArtField::CanBeChangedBy(ArtMethod* method) {
ObjPtr<mirror::Class> declaring_class(GetDeclaringClass());
ObjPtr<mirror::Class> referring_class(method->GetDeclaringClass());
- return !IsFinal() || (declaring_class == referring_class) ||
- UNLIKELY(referring_class->IsObsoleteVersionOf(declaring_class));
+ return !IsFinal() || (declaring_class == referring_class);
}
template<ReadBarrierOption kReadBarrierOption>
diff --git a/runtime/interpreter/mterp/nterp.cc b/runtime/interpreter/mterp/nterp.cc
index 40df422..e58d77d 100644
--- a/runtime/interpreter/mterp/nterp.cc
+++ b/runtime/interpreter/mterp/nterp.cc
@@ -417,7 +417,7 @@
field_index))) {
return nullptr;
}
- if (UNLIKELY(is_put && resolved_field->IsFinal() && (fields_class != referring_class))) {
+ if (UNLIKELY(is_put && !resolved_field->CanBeChangedBy(caller))) {
ThrowIllegalAccessErrorFinalField(caller, resolved_field);
return nullptr;
}