Index: runtime/vm/stub_code_x64.cc |
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc |
index 1654efb2c9b8061ea0180ee87f9a6a5629d4a230..c150d034043c5eaeb449c8526859d9f2ef43958c 100644 |
--- a/runtime/vm/stub_code_x64.cc |
+++ b/runtime/vm/stub_code_x64.cc |
@@ -387,12 +387,20 @@ static void GenerateDeoptimizationSequence(Assembler* assembler, |
if (preserve_rax) { |
__ pushq(RBX); // Preserve result, it will be GC-d here. |
} |
- __ CallRuntime(kDeoptimizeMaterializeDoublesRuntimeEntry); |
+ __ pushq(Immediate(Smi::RawValue(0))); // Space for the result. |
+ __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry); |
+ // Result tells stub how many bytes to remove from the expression stack |
+ // of the bottom-most frame. They were used as materialization arguments. |
+ __ popq(RBX); |
+ __ SmiUntag(RBX); |
if (preserve_rax) { |
__ popq(RAX); // Restore result. |
} |
__ LeaveFrame(); |
+ __ popq(RCX); // Pop return address. |
+ __ addq(RSP, RBX); // Remove materialization arguments. |
+ __ pushq(RCX); // Push return address. |
__ ret(); |
} |