summaryrefslogtreecommitdiff
path: root/compiler/optimizing/instruction_builder.cc
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2020-08-07 17:38:51 +0100
committerVladimir Marko <vmarko@google.com>2020-08-18 08:00:18 +0000
commit50fe6dc170402600936d72a5fd729b5ebda0294b (patch)
treea26c3d7ec656537f32ebff7125c77b3b9dc766c8 /compiler/optimizing/instruction_builder.cc
parent2ea5d0408fd09bd95a97a796270d6b0c31acab2e (diff)
Optimizing: Fix weak field access check.
Test: New test 727-checker-unresolved-class Test: testrunner.py --host --optimizing --interpreter --jvm -t 727 Test: testrunner.py --host --optimizing Bug: 161898207 Change-Id: Iaab9e3fef4775144d533086ec3797ce7d06c50b7
Diffstat (limited to 'compiler/optimizing/instruction_builder.cc')
-rw-r--r--compiler/optimizing/instruction_builder.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index c96ea5d945..62932c989f 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -1936,7 +1936,9 @@ ArtField* HInstructionBuilder::ResolveField(uint16_t field_idx, bool is_static,
// Check access.
Handle<mirror::Class> compiling_class = dex_compilation_unit_->GetCompilingClass();
if (compiling_class == nullptr) {
- if (!resolved_field->IsPublic()) {
+ // For unresolved compiling class, handle only the simple case of a public field
+ // in a public class and use a slow runtime call for all other cases.
+ if (!resolved_field->IsPublic() || !resolved_field->GetDeclaringClass()->IsPublic()) {
return nullptr;
}
} else if (!compiling_class->CanAccessResolvedField(resolved_field->GetDeclaringClass(),