summaryrefslogtreecommitdiff
path: root/runtime/class_linker.cc
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2024-12-06 12:29:53 +0000
committer Nicolas Geoffray <ngeoffray@google.com> 2025-01-15 09:33:56 -0800
commit5108b6223188789a26de8372cff19fe5cf0f5613 (patch)
tree4988c75db4a75411a086fd1432209553fa66073d /runtime/class_linker.cc
parent7655e9ab537198daea1ea081de90786d7ff90056 (diff)
Make ResolveField respect the is_static parameter.
Also fixes some logic and a DCHECK in the presence of duplicate fields. Bug: 364876321 Test: 734-duplicate-fields Change-Id: Ice510db35853e6a3383e30393f616c839faca75d
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r--runtime/class_linker.cc9
1 files changed, 2 insertions, 7 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index c2926ac263..1488cc6450 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -5808,7 +5808,7 @@ bool ClassLinker::InitializeClass(Thread* self,
if (num_static_fields > 0) {
const dex::ClassDef* dex_class_def = klass->GetClassDef();
CHECK(dex_class_def != nullptr);
- StackHandleScope<3> hs(self);
+ StackHandleScope<2> hs(self);
Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
@@ -10348,18 +10348,13 @@ ObjPtr<mirror::MethodHandle> ClassLinker::ResolveMethodHandleForField(
ArtField* target_field =
ResolveField(method_handle.field_or_method_idx_, referrer, is_static);
if (LIKELY(target_field != nullptr)) {
+ DCHECK_EQ(is_static, target_field->IsStatic());
ObjPtr<mirror::Class> target_class = target_field->GetDeclaringClass();
ObjPtr<mirror::Class> referring_class = referrer->GetDeclaringClass();
if (UNLIKELY(!referring_class->CanAccessMember(target_class, target_field->GetAccessFlags()))) {
ThrowIllegalAccessErrorField(referring_class, target_field);
return nullptr;
}
- // TODO(b/364876321): ResolveField might return instance field when is_static is true and
- // vice versa.
- if (UNLIKELY(is_static != target_field->IsStatic())) {
- ThrowIncompatibleClassChangeErrorField(target_field, is_static, referrer);
- return nullptr;
- }
if (UNLIKELY(is_put && target_field->IsFinal())) {
ThrowIllegalAccessErrorField(referring_class, target_field);
return nullptr;