Index: src/debug/ia32/debug-ia32.cc |
diff --git a/src/debug/ia32/debug-ia32.cc b/src/debug/ia32/debug-ia32.cc |
index 7df18c7eb8f7bddd8768769058021cc153ca099c..056407f29a05b7035d7eba7a03a1a14d58b19882 100644 |
--- a/src/debug/ia32/debug-ia32.cc |
+++ b/src/debug/ia32/debug-ia32.cc |
@@ -68,9 +68,15 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
} |
__ push(Immediate(Smi::FromInt(LiveEdit::kFramePaddingInitialSize))); |
- if (mode == SAVE_RESULT_REGISTER) __ push(eax); |
- |
- __ Move(eax, Immediate(0)); // No arguments. |
+ // Push arguments for DebugBreak call. |
+ if (mode == SAVE_RESULT_REGISTER) { |
+ // Break on return. |
+ __ push(eax); |
+ } else { |
+ // Non-return breaks. |
+ __ Push(masm->isolate()->factory()->the_hole_value()); |
+ } |
+ __ Move(eax, Immediate(1)); |
__ mov(ebx, |
Immediate(ExternalReference( |
Runtime::FunctionForId(Runtime::kDebugBreak), masm->isolate()))); |
@@ -81,12 +87,14 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
if (FLAG_debug_code) { |
for (int i = 0; i < kNumJSCallerSaved; ++i) { |
Register reg = {JSCallerSavedCode(i)}; |
- __ Move(reg, Immediate(kDebugZapValue)); |
+ // Do not clobber eax if mode is SAVE_RESULT_REGISTER. It will |
+ // contain return value of the function. |
+ if (!(reg.is(eax) && (mode == SAVE_RESULT_REGISTER))) { |
+ __ Move(reg, Immediate(kDebugZapValue)); |
+ } |
} |
} |
- if (mode == SAVE_RESULT_REGISTER) __ pop(eax); |
- |
__ pop(ebx); |
// We divide stored value by 2 (untagging) and multiply it by word's size. |
STATIC_ASSERT(kSmiTagSize == 1 && kSmiShiftSize == 0); |