Index: src/x87/macro-assembler-x87.cc |
diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc |
index c34a47a25179c7447a2807f833f210ecbaffc50a..96a265afefe270ace838f83bfb3809bf42253962 100644 |
--- a/src/x87/macro-assembler-x87.cc |
+++ b/src/x87/macro-assembler-x87.cc |
@@ -943,22 +943,27 @@ void MacroAssembler::EnterApiExitFrame(int argc) { |
} |
-void MacroAssembler::LeaveExitFrame(bool save_doubles) { |
+void MacroAssembler::LeaveExitFrame(bool save_doubles, bool pop_arguments) { |
// Optionally restore FPU state. |
if (save_doubles) { |
const int offset = -2 * kPointerSize; |
frstor(MemOperand(ebp, offset - 108)); |
} |
- // Get the return address from the stack and restore the frame pointer. |
- mov(ecx, Operand(ebp, 1 * kPointerSize)); |
- mov(ebp, Operand(ebp, 0 * kPointerSize)); |
+ if (pop_arguments) { |
+ // Get the return address from the stack and restore the frame pointer. |
+ mov(ecx, Operand(ebp, 1 * kPointerSize)); |
+ mov(ebp, Operand(ebp, 0 * kPointerSize)); |
- // Pop the arguments and the receiver from the caller stack. |
- lea(esp, Operand(esi, 1 * kPointerSize)); |
+ // Pop the arguments and the receiver from the caller stack. |
+ lea(esp, Operand(esi, 1 * kPointerSize)); |
- // Push the return address to get ready to return. |
- push(ecx); |
+ // Push the return address to get ready to return. |
+ push(ecx); |
+ } else { |
+ // Otherwise just leave the exit frame. |
+ leave(); |
+ } |
LeaveExitFrameEpilogue(true); |
} |