| Index: src/debug/x64/debug-x64.cc
|
| diff --git a/src/debug/x64/debug-x64.cc b/src/debug/x64/debug-x64.cc
|
| index 094e7b608ece3dc54ac5f1f708a057b62854a9cf..46805963220a9a65cab7ed48bc7aec27e1e70358 100644
|
| --- a/src/debug/x64/debug-x64.cc
|
| +++ b/src/debug/x64/debug-x64.cc
|
| @@ -69,9 +69,15 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm,
|
| }
|
| __ Push(Smi::FromInt(LiveEdit::kFramePaddingInitialSize));
|
|
|
| - if (mode == SAVE_RESULT_REGISTER) __ Push(rax);
|
| -
|
| - __ Set(rax, 0); // No arguments (argc == 0).
|
| + // Push arguments for DebugBreak call.
|
| + if (mode == SAVE_RESULT_REGISTER) {
|
| + // Break on return.
|
| + __ Push(rax);
|
| + } else {
|
| + // Non-return breaks.
|
| + __ Push(masm->isolate()->factory()->the_hole_value());
|
| + }
|
| + __ Set(rax, 1);
|
| __ Move(rbx, 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)};
|
| - __ Set(reg, kDebugZapValue);
|
| + // Do not clobber rax if SAVE_RESULT_REGISTER is set. It will
|
| + // contain return value of the function.
|
| + if (!(reg.is(rax) && SAVE_RESULT_REGISTER)) {
|
| + __ Set(reg, kDebugZapValue);
|
| + }
|
| }
|
| }
|
|
|
| - if (mode == SAVE_RESULT_REGISTER) __ Pop(rax);
|
| -
|
| // Read current padding counter and skip corresponding number of words.
|
| __ Pop(kScratchRegister);
|
| __ SmiToInteger32(kScratchRegister, kScratchRegister);
|
|
|