13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test whether scripts compiled after setting the break point are
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// updated correctly.
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug = debug.Debug;
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar break_count = 0;
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar test_break_1 = false;
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar test_break_2 = false;
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction sendCommand(state, cmd) {
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Get the debug command processor in paused state.
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var dcp = state.debugCommandProcessor(false);
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var request = JSON.stringify(cmd);
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var response = dcp.processDebugJSONRequest(request);
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return JSON.parse(response);
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction setBreakPointByName(state) {
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  sendCommand(state, {
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    seq: 0,
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    type: "request",
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    command: "setbreakpoint",
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    arguments: {
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      type: "script",
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      target: "testScriptOne",
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      line: 2
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  });
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction setBreakPointByRegExp(state) {
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  sendCommand(state, {
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    seq: 0,
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    type: "request",
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    command: "setbreakpoint",
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    arguments: {
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      type: "scriptRegExp",
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      target: "Scrip.Two",
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      line: 2
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  });
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction listener(event, exec_state, event_data, data) {
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  try {
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (event == Debug.DebugEvent.Break) {
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      switch (break_count) {
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case 0:
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          // Set break points before the code has been compiled.
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          setBreakPointByName(exec_state);
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          setBreakPointByRegExp(exec_state);
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case 1:
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          // Set the flag to prove that we hit the first break point.
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          test_break_1 = true;
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case 2:
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          // Set the flag to prove that we hit the second break point.
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          test_break_2 = true;
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break_count++;
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } catch (e) {
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    print(e);
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(listener);
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdebugger;
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdocheval('function test1() {                \n' +
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '  assertFalse(test_break_1);      \n' +
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '  assertTrue(test_break_1);       \n' +
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '}                                 \n' +
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '//@ sourceURL=testScriptOne');
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdocheval('function test2() {                \n' +
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '  assertFalse(test_break_2);      \n' +
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '  assertTrue(test_break_2);       \n' +
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '}                                 \n' +
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch     '//@ sourceURL=testScriptTwo');
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtest1();
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtest2();
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(3, break_count);
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
117