diff options
author | Sebastien Hertz <shertz@google.com> | 2015-01-16 19:49:09 +0100 |
---|---|---|
committer | Sebastien Hertz <shertz@google.com> | 2015-01-23 17:26:45 +0100 |
commit | 270a0e16c3b8e5b95cbfdbd8996ac137c7c6322b (patch) | |
tree | 2800649d19ffcdc891118a458f6b0169022d93e0 /runtime/quick_exception_handler.cc | |
parent | 951d70b42400453f9d1746d155b8337c07c86acc (diff) | |
download | art-270a0e16c3b8e5b95cbfdbd8996ac137c7c6322b.tar.gz art-270a0e16c3b8e5b95cbfdbd8996ac137c7c6322b.tar.bz2 art-270a0e16c3b8e5b95cbfdbd8996ac137c7c6322b.zip |
Fix exception handling during deoptimization
When interpreting a deoptimized shadow frame, we may start with a
pending exception thrown by a previous deoptimized shadow frame (from
a previous invoke). Therefore, we need to handle it before executing
any instruction, otherwise we execute incorrect code.
Because we need the DEX pc of the throwing instruction to find a
matching catch handler, we initialize deoptimized shadow frames with
the current DEX pc at the time the stack is deoptimized.
When we are about to interpret a deoptimized shadow frame, we need to
update the shadow frame with the DEX pc of the next instruction to
interpret. There are three cases:
- if there is no pending exception, this is the instruction following
the current one.
- if there is a pending exception and we found a matching catch
handler, this is the first instruction of this handler.
- if there is a pending exception but there is no matching catch
handler, we do not execute the deoptimized shadow frame and continue
to its caller.
The verifier now fails when a method starts with a move-exception
instruction. Indeed we cannot start executing a method with a pending
exception.
Bug: 19057915
Bug: 19041195
Bug: 18607595
Change-Id: I355ac81e6ac098edc7e3cc8c13dbfa24a2969ab2
Diffstat (limited to 'runtime/quick_exception_handler.cc')
-rw-r--r-- | runtime/quick_exception_handler.cc | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/runtime/quick_exception_handler.cc b/runtime/quick_exception_handler.cc index 3517848927..34f6713d70 100644 --- a/runtime/quick_exception_handler.cc +++ b/runtime/quick_exception_handler.cc @@ -204,9 +204,7 @@ class DeoptimizeStackVisitor FINAL : public StackVisitor { CHECK(code_item != nullptr); uint16_t num_regs = code_item->registers_size_; uint32_t dex_pc = GetDexPc(); - const Instruction* inst = Instruction::At(code_item->insns_ + dex_pc); - uint32_t new_dex_pc = dex_pc + inst->SizeInCodeUnits(); - ShadowFrame* new_frame = ShadowFrame::Create(num_regs, nullptr, m, new_dex_pc); + ShadowFrame* new_frame = ShadowFrame::Create(num_regs, nullptr, m, dex_pc); StackHandleScope<3> hs(self_); mirror::Class* declaring_class = m->GetDeclaringClass(); Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(declaring_class->GetDexCache())); |