1589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Redistribution and use in source and binary forms, with or without
3589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// modification, are permitted provided that the following conditions are
4589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// met:
5589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//
6589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Redistributions of source code must retain the above copyright
7589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Redistributions in binary form must reproduce the above
9589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       copyright notice, this list of conditions and the following
10589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       with the distribution.
12589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       contributors may be used to endorse or promote products derived
14589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       from this software without specific prior written permission.
15589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//
16589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
28589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Flags: --expose-debug-as debug
29589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
30589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// This test tests that full code compiled without debug break slots
31589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// is recompiled with debug break slots when debugging is started.
32589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
33589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Get the Debug object exposed from the debug context global object.
34589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug = debug.Debug
35589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
36589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar bp;
37589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar done = false;
38589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar step_count = 0;
39589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
40589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Debug event listener which steps until the global variable done is true.
41589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction listener(event, exec_state, event_data, data) {
42589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  if (event == Debug.DebugEvent.Break) {
43589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    if (!done) exec_state.prepareStep(Debug.StepAction.StepNext);
44589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    step_count++;
45589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
46589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Set the global variables state to prpare the stepping test.
49589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction prepare_step_test() {
50589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  done = false;
51589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  step_count = 0;
52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Test function to step through.
55589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction f() {
56589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  var i = 1;
57589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  var j = 2;
58589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  done = true;
59589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
60589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
61589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochprepare_step_test();
62589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochf();
63589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
64589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Add the debug event listener.
65589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.setListener(listener);
66589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
67589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochbp = Debug.setBreakPoint(f, 1);
68589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
69589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochprepare_step_test();
70589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochf();
71589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochassertEquals(4, step_count);
72589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.clearBreakPoint(bp);
73589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
74589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Set a breakpoint on the first var statement (line 1).
75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochbp = Debug.setBreakPoint(f, 1);
76589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
77589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Step through the function ensuring that the var statements are hit as well.
78589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochprepare_step_test();
79589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochf();
80589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochassertEquals(4, step_count);
81589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
82589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Clear the breakpoint and check that no stepping happens.
83589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.clearBreakPoint(bp);
84589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochprepare_step_test();
85589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochf();
86589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochassertEquals(0, step_count);
87589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
88589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Get rid of the debug event listener.
89589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.setListener(null);
90