| // Copyright 2016 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| const Debug = new DebugWrapper(); | |
| Debug.enable(); | |
| // Tests how debugger can step over not necessarily in the top frame. | |
| // Simple 3 functions, that protocol their execution state in global | |
| // variable state. | |
| var state; | |
| function f() { | |
| var a = 1978; | |
| for (state[2] = 0; state[2] < 3; state[2]++) { | |
| void String(a); | |
| } | |
| } | |
| function g() { | |
| for (state[1] = 0; state[1] < 3; state[1]++) { | |
| f(); | |
| } | |
| } | |
| function h() { | |
| state = [-1, -1, -1]; | |
| for (state[0] = 0; state[0] < 3; state[0]++) { | |
| g(); | |
| } | |
| } | |
| function TestCase(expected_final_state) { | |
| var listener_exception = null; | |
| var state_snapshot; | |
| var listener_state; | |
| var bp; | |
| function listener(event, exec_state, event_data, data) { | |
| const location = exec_state.frames[0].location | |
| print("Here (" + event + "/" + listener_state + "): " + | |
| location.lineNumber + ":" + location.columnNumber); | |
| try { | |
| if (event == Debug.DebugEvent.Break) { | |
| if (listener_state == 0) { | |
| Debug.clearBreakPoint(bp); | |
| Debug.stepOver(); | |
| listener_state = 1; | |
| } else if (listener_state == 1) { | |
| state_snapshot = String(state); | |
| print("State: " + state_snapshot); | |
| Debug.setListener(null); | |
| listener_state = 2; | |
| } | |
| } | |
| } catch (e) { | |
| listener_exception = e; | |
| } | |
| } | |
| // Add the debug event listener. | |
| listener_state = 0; | |
| Debug.setListener(listener); | |
| bp = Debug.setBreakPoint(f, 1); | |
| h(); | |
| Debug.setListener(null); | |
| if (listener_exception !== null) { | |
| print("Exception caught: " + listener_exception); | |
| assertUnreachable(); | |
| } | |
| assertEquals(expected_final_state, state_snapshot); | |
| } | |
| // Warm-up -- make sure all is compiled and ready for breakpoint. | |
| h(); | |
| TestCase("0,0,-1"); |