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// Get the Debug object exposed from the debug context global object. 30589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug = debug.Debug 31589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar breaks = 0; 32589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 33589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction sendCommand(state, cmd) { 34589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Get the debug command processor in paused state. 35589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var dcp = state.debugCommandProcessor(false); 36589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var request = JSON.stringify(cmd); 37589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var response = dcp.processDebugJSONRequest(request); 38589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 39589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 40589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction listener(event, exec_state, event_data, data) { 41589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch try { 42589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (event == Debug.DebugEvent.Break) { 43589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var line = event_data.sourceLineText(); 44589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch print('break: ' + line); 45589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 46589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(-1, line.indexOf('NOBREAK'), 47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "should not break on unexpected lines") 48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals('BREAK ' + breaks, line.substr(-7)); 49589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch breaks++; 50589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch sendCommand(exec_state, { 51589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch seq: 0, 52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch type: "request", 53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch command: "continue", 54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch arguments: { stepaction: "next" } 55589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }); 56589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 57589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } catch (e) { 58589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch print(e); 59589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 60589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 61589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 62589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Add the debug event listener. 63589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.setListener(listener); 64589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 65589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction a(f) { 66589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (f) { // NOBREAK: should not break here! 67589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch try { 68589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch f(); 69589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } catch(e) { 70589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 71589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 72589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} // BREAK 2 73589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 74589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction b() { 75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch c(); // BREAK 0 76589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} // BREAK 1 77589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 78589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction c() { 79589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch a(); 80589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 81589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 82589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Set a break point and call to invoke the debug event listener. 83589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochDebug.setBreakPoint(b, 0, 0); 84589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdocha(b); 85589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// BREAK 3 86