| Index: runtime/vm/code_generator.cc
|
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
|
| index 4f4bb12c56ce4f826ef8c487e94e8319c814a771..1b735d0b8cd3c463cd9f016a7146e54859d980a2 100644
|
| --- a/runtime/vm/code_generator.cc
|
| +++ b/runtime/vm/code_generator.cc
|
| @@ -1482,9 +1482,6 @@ void DeoptimizeAll() {
|
| function = optimized_code.function();
|
| unoptimized_code = function.unoptimized_code();
|
| ASSERT(!unoptimized_code.IsNull());
|
| - uword continue_at_pc =
|
| - unoptimized_code.GetDeoptAfterPcAtDeoptId(deopt_id);
|
| - ASSERT(continue_at_pc != 0);
|
| // The switch to unoptimized code may have already occured.
|
| if (function.HasOptimizedCode()) {
|
| function.SwitchToUnoptimizedCode();
|
| @@ -1609,9 +1606,9 @@ END_LEAF_RUNTIME_ENTRY
|
|
|
|
|
|
|
| -static void DeoptimizeWithDeoptInfo(const Code& code,
|
| - const DeoptInfo& deopt_info,
|
| - const StackFrame& caller_frame) {
|
| +static intptr_t DeoptimizeWithDeoptInfo(const Code& code,
|
| + const DeoptInfo& deopt_info,
|
| + const StackFrame& caller_frame) {
|
| const intptr_t len = deopt_info.Length();
|
| GrowableArray<DeoptInstr*> deopt_instructions(len);
|
| for (intptr_t i = 0; i < len; i++) {
|
| @@ -1644,12 +1641,13 @@ static void DeoptimizeWithDeoptInfo(const Code& code,
|
| deopt_instructions[i]->ToCString());
|
| }
|
| }
|
| + return deopt_context.GetCallerFp();
|
| }
|
|
|
|
|
| // The stack has been adjusted to fit all values for unoptimized frame.
|
| // Fill the unoptimized frame.
|
| -DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) {
|
| +DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeFillFrame, uword last_fp) {
|
| Isolate* isolate = Isolate::Current();
|
| Zone zone(isolate);
|
| HANDLESCOPE(isolate);
|
| @@ -1672,25 +1670,14 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) {
|
| GetDeoptIxDescrAtPc(optimized_code, caller_frame->pc(),
|
| &deopt_id, &deopt_reason, &deopt_index);
|
| ASSERT(deopt_id != Isolate::kNoDeoptId);
|
| - uword continue_at_pc = 0;
|
| - if (deopt_reason == kDeoptAtCall) {
|
| - continue_at_pc = unoptimized_code.GetDeoptAfterPcAtDeoptId(deopt_id);
|
| - } else {
|
| - continue_at_pc = unoptimized_code.GetDeoptBeforePcAtDeoptId(deopt_id);
|
| - }
|
| - ASSERT(continue_at_pc != 0);
|
| - if (FLAG_trace_deopt) {
|
| - OS::Print(" -> continue at %#"Px"\n", continue_at_pc);
|
| - // TODO(srdjan): If we could allow GC, we could print the line where
|
| - // deoptimization occured.
|
| - }
|
| const Array& deopt_info_array =
|
| Array::Handle(optimized_code.deopt_info_array());
|
| ASSERT(!deopt_info_array.IsNull());
|
| DeoptInfo& deopt_info = DeoptInfo::Handle();
|
| deopt_info ^= deopt_info_array.At(deopt_index);
|
| ASSERT(!deopt_info.IsNull());
|
| - DeoptimizeWithDeoptInfo(optimized_code, deopt_info, *caller_frame);
|
| + const intptr_t caller_fp =
|
| + DeoptimizeWithDeoptInfo(optimized_code, deopt_info, *caller_frame);
|
|
|
| isolate->SetDeoptFrameCopy(NULL, 0);
|
| isolate->set_deopt_cpu_registers_copy(NULL);
|
| @@ -1707,6 +1694,7 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) {
|
| if (function.HasOptimizedCode()) {
|
| function.SwitchToUnoptimizedCode();
|
| }
|
| + return caller_fp;
|
| }
|
| END_LEAF_RUNTIME_ENTRY
|
|
|
|
|