Index: src/debug/arm/debug-arm.cc |
diff --git a/src/debug/arm/debug-arm.cc b/src/debug/arm/debug-arm.cc |
index 145f371f9926a24adad72d8c13507eb2590026aa..4839282e877258d634cd5c43ebca9540dfb8264f 100644 |
--- a/src/debug/arm/debug-arm.cc |
+++ b/src/debug/arm/debug-arm.cc |
@@ -75,14 +75,6 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
{ |
FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
- // Load padding words on stack. |
- __ mov(ip, Operand(Smi::FromInt(LiveEdit::kFramePaddingValue))); |
- for (int i = 0; i < LiveEdit::kFramePaddingInitialSize; i++) { |
- __ push(ip); |
- } |
- __ mov(ip, Operand(Smi::FromInt(LiveEdit::kFramePaddingInitialSize))); |
- __ push(ip); |
- |
// Push arguments for DebugBreak call. |
if (mode == SAVE_RESULT_REGISTER) { |
// Break on return. |
@@ -109,50 +101,45 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, |
} |
} |
} |
- |
- // Don't bother removing padding bytes pushed on the stack |
- // as the frame is going to be restored right away. |
- |
// Leave the internal frame. |
} |
- // Now that the break point has been handled, resume normal execution by |
- // jumping to the target address intended by the caller and that was |
- // overwritten by the address of DebugBreakXXX. |
- ExternalReference after_break_target = |
- ExternalReference::debug_after_break_target_address(masm->isolate()); |
- __ mov(ip, Operand(after_break_target)); |
- __ ldr(ip, MemOperand(ip)); |
- __ Jump(ip); |
+ __ MaybeDropFrames(); |
+ |
+ // Return to caller. |
+ __ Ret(); |
} |
+void DebugCodegen::GenerateHandleDebuggerStatement(MacroAssembler* masm) { |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ __ CallRuntime(Runtime::kHandleDebuggerStatement, 0); |
+ } |
+ __ MaybeDropFrames(); |
-void DebugCodegen::GenerateFrameDropperLiveEdit(MacroAssembler* masm) { |
- // Load the function pointer off of our current stack frame. |
- __ ldr(r1, MemOperand(fp, FrameDropperFrameConstants::kFunctionOffset)); |
+ // Return to caller. |
+ __ Ret(); |
+} |
- // Pop return address, frame and constant pool pointer (if |
- // FLAG_enable_embedded_constant_pool). |
+void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) { |
+ // Frame is being dropped: |
+ // - Drop to the target frame specified by r1. |
+ // - Look up current function on the frame. |
+ // - Leave the frame. |
+ // - Restart the frame by calling the function. |
+ __ mov(fp, r1); |
+ __ ldr(r1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
__ LeaveFrame(StackFrame::INTERNAL); |
- ParameterCount dummy(0); |
- __ CheckDebugHook(r1, no_reg, dummy, dummy); |
- |
- { ConstantPoolUnavailableScope constant_pool_unavailable(masm); |
- // Load context from the function. |
- __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
+ __ ldr(r0, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
+ __ ldr(r0, |
+ FieldMemOperand(r0, SharedFunctionInfo::kFormalParameterCountOffset)); |
+ __ mov(r2, r0); |
- // Clear new.target as a safety measure. |
- __ LoadRoot(r3, Heap::kUndefinedValueRootIndex); |
- |
- // Get function code. |
- __ ldr(ip, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
- __ ldr(ip, FieldMemOperand(ip, SharedFunctionInfo::kCodeOffset)); |
- __ add(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag)); |
- |
- // Re-run JSFunction, r1 is function, cp is context. |
- __ Jump(ip); |
- } |
+ ParameterCount dummy1(r2); |
+ ParameterCount dummy2(r0); |
+ __ InvokeFunction(r1, dummy1, dummy2, JUMP_FUNCTION, |
+ CheckDebugStepCallWrapper()); |
} |