diff options
| author | 2016-01-14 12:22:39 +0000 | |
|---|---|---|
| committer | 2016-01-14 12:22:39 +0000 | |
| commit | da88e5734f23d7bf215c7fd34c478225d450a530 (patch) | |
| tree | 054a508b49af1ce54b9696419cbdd1e5b15b1ce1 /runtime/quick_exception_handler.cc | |
| parent | 26751735568224bddd07eeb9218560833c3f4ee1 (diff) | |
| parent | 012fc4e9d9b66b3ffb7838b0e29dadbb4863ee69 (diff) | |
Merge "Don't encode a DexRegisterMap if there is no live register."
Diffstat (limited to 'runtime/quick_exception_handler.cc')
| -rw-r--r-- | runtime/quick_exception_handler.cc | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/runtime/quick_exception_handler.cc b/runtime/quick_exception_handler.cc index 9cb37eed58..786cf06e2d 100644 --- a/runtime/quick_exception_handler.cc +++ b/runtime/quick_exception_handler.cc @@ -221,18 +221,22 @@ void QuickExceptionHandler::SetCatchEnvironmentForOptimizedHandler(StackVisitor* CodeInfo code_info = handler_method_header_->GetOptimizedCodeInfo(); StackMapEncoding encoding = code_info.ExtractEncoding(); + // Find stack map of the catch block. + StackMap catch_stack_map = code_info.GetCatchStackMapForDexPc(GetHandlerDexPc(), encoding); + DCHECK(catch_stack_map.IsValid()); + DexRegisterMap catch_vreg_map = + code_info.GetDexRegisterMapOf(catch_stack_map, encoding, number_of_vregs); + if (!catch_vreg_map.IsValid()) { + return; + } + // Find stack map of the throwing instruction. StackMap throw_stack_map = code_info.GetStackMapForNativePcOffset(stack_visitor->GetNativePcOffset(), encoding); DCHECK(throw_stack_map.IsValid()); DexRegisterMap throw_vreg_map = code_info.GetDexRegisterMapOf(throw_stack_map, encoding, number_of_vregs); - - // Find stack map of the catch block. - StackMap catch_stack_map = code_info.GetCatchStackMapForDexPc(GetHandlerDexPc(), encoding); - DCHECK(catch_stack_map.IsValid()); - DexRegisterMap catch_vreg_map = - code_info.GetDexRegisterMapOf(catch_stack_map, encoding, number_of_vregs); + DCHECK(throw_vreg_map.IsValid()); // Copy values between them. for (uint16_t vreg = 0; vreg < number_of_vregs; ++vreg) { @@ -387,6 +391,10 @@ class DeoptimizeStackVisitor FINAL : public StackVisitor { number_of_vregs) : code_info.GetDexRegisterMapOf(stack_map, encoding, number_of_vregs); + if (!vreg_map.IsValid()) { + return; + } + for (uint16_t vreg = 0; vreg < number_of_vregs; ++vreg) { if (updated_vregs != nullptr && updated_vregs[vreg]) { // Keep the value set by debugger. |