diff options
author | 2024-12-06 12:29:53 +0000 | |
---|---|---|
committer | 2025-01-15 09:33:56 -0800 | |
commit | 5108b6223188789a26de8372cff19fe5cf0f5613 (patch) | |
tree | 4988c75db4a75411a086fd1432209553fa66073d /runtime/class_linker.cc | |
parent | 7655e9ab537198daea1ea081de90786d7ff90056 (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.cc | 9 |
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; |