11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved.
21e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Redistribution and use in source and binary forms, with or without
31e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// modification, are permitted provided that the following conditions are
41e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// met:
51e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//
61e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Redistributions of source code must retain the above copyright
71e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       notice, this list of conditions and the following disclaimer.
81e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Redistributions in binary form must reproduce the above
91e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       copyright notice, this list of conditions and the following
101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       disclaimer in the documentation and/or other materials provided
111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       with the distribution.
121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Neither the name of Google Inc. nor the names of its
131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       contributors may be used to endorse or promote products derived
141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       from this software without specific prior written permission.
151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//
161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug
29592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// This test tests that full code compiled without debug break slots
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// is recompiled with debug break slots when debugging is started.
3285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get the Debug object exposed from the debug context global object.
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug = debug.Debug
3585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar bp;
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar done = false;
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar step_count = 0;
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar set_bp = false
40592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Debug event listener which steps until the global variable done is true.
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction listener(event, exec_state, event_data, data) {
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (event == Debug.DebugEvent.Break) {
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!done) exec_state.prepareStep(Debug.StepAction.StepNext);
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    step_count++;
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
48592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set the global variables state to prpare the stepping test.
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction prepare_step_test() {
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  done = false;
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  step_count = 0;
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
54592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test function to step through.
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f() {
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a = 0;
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (set_bp) { bp = Debug.setBreakPoint(f, 3); }
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var i = 1;
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var j = 2;
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  done = true;
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
63592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test();
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
6685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Add the debug event listener.
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(listener);
6985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Make f set a breakpoint with an activation on the stack.
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test();
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochset_bp = true;
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(1782): Fix issue to bring back this assert.
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//assertEquals(4, step_count);
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.clearBreakPoint(bp);
7785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set a breakpoint on the first var statement (line 1).
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochset_bp = false;
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbp = Debug.setBreakPoint(f, 3);
8185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Step through the function ensuring that the var statements are hit as well.
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test();
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(4, step_count);
8685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Clear the breakpoint and check that no stepping happens.
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.clearBreakPoint(bp);
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test();
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(0, step_count);
92592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get rid of the debug event listener.
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(null);
95