diff options
Diffstat (limited to 'compiler/optimizing/instruction_builder.cc')
-rw-r--r-- | compiler/optimizing/instruction_builder.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc index df236c17c1..cd68b2a7c9 100644 --- a/compiler/optimizing/instruction_builder.cc +++ b/compiler/optimizing/instruction_builder.cc @@ -34,6 +34,7 @@ #include "oat_file.h" #include "optimizing_compiler_stats.h" #include "quicken_info.h" +#include "reflective_handle_scope-inl.h" #include "scoped_thread_state_change-inl.h" #include "sharpening.h" #include "ssa_builder.h" @@ -1934,7 +1935,14 @@ ArtField* HInstructionBuilder::ResolveField(uint16_t field_idx, bool is_static, return nullptr; } - return resolved_field; + StackArtFieldHandleScope<1> rhs(soa.Self()); + ReflectiveHandle<ArtField> resolved_field_handle(rhs.NewHandle(resolved_field)); + if (resolved_field->ResolveType().IsNull()) { + // ArtField::ResolveType() may fail as evidenced with a dexing bug (b/78788577). + soa.Self()->ClearException(); + return nullptr; // Failure + } + return resolved_field_handle.Get(); } void HInstructionBuilder::BuildStaticFieldAccess(const Instruction& instruction, |