Index: runtime/vm/deopt_instructions.cc |
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc |
index 2222143a3b36094ca1c6d72cb51bb4c413ebda8b..9419411099cbfb0eb736e04b768344f3a508ba96 100644 |
--- a/runtime/vm/deopt_instructions.cc |
+++ b/runtime/vm/deopt_instructions.cc |
@@ -28,16 +28,25 @@ DeoptimizationContext::DeoptimizationContext(intptr_t* to_frame_start, |
from_frame_size_ = isolate_->deopt_frame_copy_size(); |
registers_copy_ = isolate_->deopt_cpu_registers_copy(); |
xmm_registers_copy_ = isolate_->deopt_xmm_registers_copy(); |
+ caller_fp_ = GetFromFp(); |
} |
-intptr_t* DeoptimizationContext::GetFromFpAddress() const { |
- return &from_frame_[from_frame_size_ - 1 - num_args_ - 1]; |
+intptr_t DeoptimizationContext::GetFromFp() const { |
+ return from_frame_[from_frame_size_ - 1 - num_args_ - 1]; |
} |
-intptr_t* DeoptimizationContext::GetFromPcAddress() const { |
- return &from_frame_[from_frame_size_ - 1 - num_args_]; |
+intptr_t DeoptimizationContext::GetFromPc() const { |
+ return from_frame_[from_frame_size_ - 1 - num_args_]; |
+} |
+ |
+intptr_t DeoptimizationContext::GetCallerFp() const { |
+ return caller_fp_; |
+} |
+ |
+void DeoptimizationContext::SetCallerFp(intptr_t caller_fp) { |
+ caller_fp_ = caller_fp; |
} |
// Deoptimization instruction moving value from optimized frame at |
@@ -334,9 +343,10 @@ class DeoptCallerFpInstr : public DeoptInstr { |
} |
void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
- intptr_t* from_addr = deopt_context->GetFromFpAddress(); |
+ intptr_t from = deopt_context->GetCallerFp(); |
intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
- *to_addr = *from_addr; |
+ *to_addr = from; |
+ deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(to_addr)); |
} |
private: |
@@ -358,9 +368,9 @@ class DeoptCallerPcInstr : public DeoptInstr { |
} |
void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
- intptr_t* from_addr = deopt_context->GetFromPcAddress(); |
+ intptr_t from = deopt_context->GetFromPc(); |
intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
- *to_addr = *from_addr; |
+ *to_addr = from; |
} |
private: |