Index: runtime/vm/stack_frame.h |
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h |
index 268ca4a9998819930ed8b30b3cb92ef2bab75a7e..69adea4bfbd5119a24e157e053595aea460afbde 100644 |
--- a/runtime/vm/stack_frame.h |
+++ b/runtime/vm/stack_frame.h |
@@ -53,6 +53,7 @@ class StackFrame : public ValueObject { |
void set_pc(uword value) { |
*reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize)) = value; |
+ pc_ = value; |
} |
void set_pc_marker(RawCode* code) { |
@@ -110,8 +111,21 @@ class StackFrame : public ValueObject { |
} |
uword GetCallerPc() const { |
- return *(reinterpret_cast<uword*>( |
+ uword raw_pc = *(reinterpret_cast<uword*>( |
fp() + (kSavedCallerPcSlotFromFp * kWordSize))); |
+ ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow_entry()->EntryPoint()); |
+ if (raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint()) { |
+ uword fp = GetCallerFp(); |
+ MallocGrowableArray<PendingLazyDeopt>* pending_deopts = |
+ isolate()->pending_deopts(); |
+ for (intptr_t i = 0; i < pending_deopts->length(); i++) { |
+ if ((*pending_deopts)[i].fp() == fp) { |
+ return (*pending_deopts)[i].pc(); |
+ } |
+ } |
+ UNREACHABLE(); |
+ } |
+ return raw_pc; |
} |
uword fp_; |