Index: src/debug/mips/debug-mips.cc |
diff --git a/src/debug/mips/debug-mips.cc b/src/debug/mips/debug-mips.cc |
index 2da326c2853dcc7c74a36616da3cd607711898b8..0b628aeda08a3a0ebf8b76e0e365c7b65f4cbd2c 100644 |
--- a/src/debug/mips/debug-mips.cc |
+++ b/src/debug/mips/debug-mips.cc |
@@ -77,9 +77,15 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
__ li(at, Operand(Smi::FromInt(LiveEdit::kFramePaddingInitialSize))); |
__ push(at); |
- if (mode == SAVE_RESULT_REGISTER) __ push(v0); |
- |
- __ PrepareCEntryArgs(0); // No arguments. |
+ // Push arguments for DebugBreak call. |
+ if (mode == SAVE_RESULT_REGISTER) { |
+ // Break on return. |
+ __ push(v0); |
+ } else { |
+ // Non-return breaks. |
+ __ Push(masm->isolate()->factory()->the_hole_value()); |
+ } |
+ __ PrepareCEntryArgs(1); |
__ PrepareCEntryFunction(ExternalReference( |
Runtime::FunctionForId(Runtime::kDebugBreak), masm->isolate())); |
@@ -89,12 +95,14 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
if (FLAG_debug_code) { |
for (int i = 0; i < kNumJSCallerSaved; i++) { |
Register reg = {JSCallerSavedCode(i)}; |
- __ li(reg, kDebugZapValue); |
+ // Do not clobber v0 if SAVE_RESULT_REGISTER is set. It will |
+ // contain return value of the function returned by DebugBreak. |
+ if (!(reg.is(v0) && SAVE_RESULT_REGISTER)) { |
+ __ li(reg, kDebugZapValue); |
+ } |
} |
} |
- if (mode == SAVE_RESULT_REGISTER) __ pop(v0); |
- |
// Don't bother removing padding bytes pushed on the stack |
// as the frame is going to be restored right away. |