blob: 93884303ca78ce65345de0db3bdc6a8a861dedcc [file] [log] [blame]
dslomov@chromium.org639bac02013-09-09 11:58:54 +00001// Copyright 2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Flags: --expose-debug-as debug
29// Get the Debug object exposed from the debug context global object.
30Debug = debug.Debug
31
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +000032// Tests how debugger can step over not necessarily in the top frame.
dslomov@chromium.org639bac02013-09-09 11:58:54 +000033
34// Simple 3 functions, that protocol their execution state in global
35// variable state.
36var state;
37
38function f() {
39 var a = 1978;
machenbach@chromium.org37be4082013-11-26 13:50:38 +000040 for (state[2] = 0; state[2] < 3; state[2]++) {
dslomov@chromium.org639bac02013-09-09 11:58:54 +000041 void String(a);
42 }
43}
44function g() {
machenbach@chromium.org37be4082013-11-26 13:50:38 +000045 for (state[1] = 0; state[1] < 3; state[1]++) {
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +000046 f();
dslomov@chromium.org639bac02013-09-09 11:58:54 +000047 }
48}
49function h() {
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +000050 state = [-1, -1, -1];
machenbach@chromium.org37be4082013-11-26 13:50:38 +000051 for (state[0] = 0; state[0] < 3; state[0]++) {
dslomov@chromium.org639bac02013-09-09 11:58:54 +000052 g();
53 }
54}
55
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +000056function TestCase(frame_index, step_count, expected_final_state) {
57 print("Test case, parameters " + frame_index + "/" + step_count);
dslomov@chromium.org639bac02013-09-09 11:58:54 +000058
59 var listener_exception = null;
60 var state_snapshot;
61 var listener_state;
62 var bp;
63
64 function listener(event, exec_state, event_data, data) {
65 print("Here ("+event+"/"+listener_state+"): " +
66 exec_state.frame(0).sourceLineText());
67 try {
68 if (event == Debug.DebugEvent.Break) {
69 if (listener_state == 0) {
70 Debug.clearBreakPoint(bp);
71 var context_frame;
72 if (frame_index !== undefined) {
73 context_frame = exec_state.frame(frame_index);
74 }
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +000075 exec_state.prepareStep(Debug.StepAction.StepNext,
76 step_count, context_frame);
dslomov@chromium.org639bac02013-09-09 11:58:54 +000077 listener_state = 1;
78 } else if (listener_state == 1) {
79 state_snapshot = String(state);
80 print("State: " + state_snapshot);
81 Debug.setListener(null);
82 listener_state = 2;
83 }
84 }
85 } catch (e) {
86 listener_exception = e;
87 }
88 }
89
90
91 // Add the debug event listener.
92 listener_state = 0;
93 Debug.setListener(listener);
94 bp = Debug.setBreakPoint(f, 1);
95
96 h();
97 Debug.setListener(null);
98 if (listener_exception !== null) {
99 print("Exception caught: " + listener_exception);
100 assertUnreachable();
101 }
102
103 assertEquals(expected_final_state, state_snapshot);
104}
105
106
107// Warm-up -- make sure all is compiled and ready for breakpoint.
108h();
109
110
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +0000111// Stepping in the default (top) frame.
112TestCase(undefined, 0, "0,0,-1");
113TestCase(undefined, 1, "0,0,-1");
114TestCase(undefined, 2, "0,0,0");
115TestCase(undefined, 5, "0,0,1");
116TestCase(undefined, 8, "0,0,3");
dslomov@chromium.org639bac02013-09-09 11:58:54 +0000117
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +0000118// Stepping in the frame #0 (should be exactly the same as above).
119TestCase(0, 0, "0,0,-1");
120TestCase(0, 1, "0,0,-1");
121TestCase(0, 2, "0,0,0");
122TestCase(0, 5, "0,0,1");
123TestCase(0, 8, "0,0,3");
dslomov@chromium.org639bac02013-09-09 11:58:54 +0000124
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +0000125// Stepping in the frame #1.
machenbach@chromium.org37be4082013-11-26 13:50:38 +0000126TestCase(1, 0, "0,0,3");
127TestCase(1, 3, "0,1,3");
128TestCase(1, 7, "0,3,3");
dslomov@chromium.org639bac02013-09-09 11:58:54 +0000129
mvstanton@chromium.org63ea3d22013-10-10 09:24:12 +0000130// Stepping in the frame #2.
machenbach@chromium.org37be4082013-11-26 13:50:38 +0000131TestCase(2, 3, "1,3,3");
132TestCase(2, 7, "3,3,3");