13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 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// Get the Debug object exposed from the debug context global object. 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug = debug.Debug 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction sendCommand(state, cmd) { 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Get the debug command processor in paused state. 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var dcp = state.debugCommandProcessor(false); 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var request = JSON.stringify(cmd); 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var response = dcp.processDebugJSONRequest(request); 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar state = 0; 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction listener(event, exec_state, event_data, data) { 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (event == Debug.DebugEvent.Break) { 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var line = event_data.sourceLineText(); 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print('break: ' + line); 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print('event data: ' + event_data.toJSONProtocol()); 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print(); 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals('// BREAK', line.substr(-8), 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch "should not break outside evaluate"); 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (state) { 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case 0: 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch state = 1; 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // While in the debugger and stepping through a set of instructions 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // executed in the evaluate command, the stepping must stop at the end 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // of the said set of instructions and not step further into native 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // debugger code. 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch sendCommand(exec_state, { 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch seq : 0, 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch type : "request", 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch command : "evaluate", 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments : { 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'expression' : 'print("A"); debugger; print("B"); // BREAK', 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 'global' : true 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case 1: 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch sendCommand(exec_state, { 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch seq : 0, 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch type : "request", 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch command : "continue", 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments : { 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stepaction : "next" 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }); 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } catch (e) { 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch print(e); 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Add the debug event listener. 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(listener); 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction a() { 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} // BREAK 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set a break point and call to invoke the debug event listener. 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setBreakPoint(a, 0, 0); 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdocha(); 94