Index: runtime/vm/stub_code_ia32.cc |
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc |
index 0af074b644cb7a07043a458992a8cf761619ddcc..cde7e0f22960ffb572cdc5eea1c36366bfdfd50f 100644 |
--- a/runtime/vm/stub_code_ia32.cc |
+++ b/runtime/vm/stub_code_ia32.cc |
@@ -394,11 +394,20 @@ static void GenerateDeoptimizationSequence(Assembler* assembler, |
if (preserve_eax) { |
__ pushl(EBX); // Preserve result, it will be GC-d here. |
} |
- __ CallRuntime(kDeoptimizeMaterializeDoublesRuntimeEntry); |
+ __ pushl(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. |
+ __ popl(EBX); |
+ __ SmiUntag(EBX); |
if (preserve_eax) { |
__ popl(EAX); // Restore result. |
} |
__ LeaveFrame(); |
+ |
+ __ popl(ECX); // Pop return address. |
+ __ addl(ESP, EBX); // Remove materialization arguments. |
+ __ pushl(ECX); // Push return address. |
__ ret(); |
} |