19ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Copyright 2009 the V8 project authors. All rights reserved. 29ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Redistribution and use in source and binary forms, with or without 39ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// modification, are permitted provided that the following conditions are 49ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// met: 59ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// 69ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// * Redistributions of source code must retain the above copyright 79ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// notice, this list of conditions and the following disclaimer. 89ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// * Redistributions in binary form must reproduce the above 99ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// copyright notice, this list of conditions and the following 109ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// disclaimer in the documentation and/or other materials provided 119ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// with the distribution. 129ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// * Neither the name of Google Inc. nor the names of its 139ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// contributors may be used to endorse or promote products derived 149ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// from this software without specific prior written permission. 159ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// 169ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 289ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Flags: --expose-debug-as debug 299ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Get the Debug object exposed from the debug context global object. 309ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel DunbarDebug = debug.Debug 319ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 329ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar exception = null; 339ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar state = 0; 349ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar expected_function_name = null; 359ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar expected_source_line_text = null; 369ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar expected_caller_source_line = null; 379ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarvar step_in_count = 2; 389ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 399ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Simple debug event handler which first time will cause 'step in' action 409ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// to get into g.call and than check that execution is pauesed inside 419ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// function 'g'. 429ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfunction listener(event, exec_state, event_data, data) { 439ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar try { 449ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar if (event == Debug.DebugEvent.Break) { 459ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar if (state == 0) { 469ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar // Step into f(). 479ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar exec_state.prepareStep(Debug.StepAction.StepIn, step_in_count); 489ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar state = 2; 499ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar } else if (state == 2) { 509ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar assertEquals(expected_source_line_text, 519ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar event_data.sourceLineText()); 529ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar assertEquals(expected_function_name, event_data.func().name()); 539ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar state = 3; 549ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar } 559ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar } 569ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar } catch(e) { 579ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar exception = e; 589ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar } 599ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar}; 609ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 619ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Add the debug event listener. 629ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel DunbarDebug.setListener(listener); 639ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 649ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 659ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfunction g() { 669ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar return "s"; // expected line 679ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar} 689ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 699ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfunction testFunction() { 709ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar var f = g; 719ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar var s = 1 +f(10); 729ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar} 739ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 749ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfunction g2() { 759ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar return "s2"; // expected line 769ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar} 779ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 789ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfunction testFunction2() { 799ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar var f = g2; 809ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar var s = 1 +f(10, 20); 819ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar} 829ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 839ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Run three times. First time the function will be compiled lazily, 849ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// second time cached version will be used. 859ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfor (var i = 0; i < 3; i++) { 869ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar state = 0; 879ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar expected_function_name = 'g'; 889ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar expected_source_line_text = ' return "s"; // expected line'; 899ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar step_in_count = 2; 90996677cffa764e70e85f289a2edd88aa48b57c2dDouglas Gregor // Set a break point and call to invoke the debug event listener. 919ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar Debug.setBreakPoint(testFunction, 1, 0); 929ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar testFunction(); 939ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar assertNull(exception); 949ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar assertEquals(3, state); 959ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar} 969ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar 979ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Test stepping into function call when a breakpoint is set at the place 989ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// of call. Use different pair of functions so that g2 is compiled lazily. 999ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// Run twice: first time function will be compiled lazily, second time 1009ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar// cached version will be used. 1019ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbarfor (var i = 0; i < 3; i++) { 1029ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar state = 0; 1039ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar expected_function_name = 'g2'; 104df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar expected_source_line_text = ' return "s2"; // expected line'; 105df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar step_in_count = 1; 106df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar // Set a break point and call to invoke the debug event listener. 1079d96b32ad1fc99cb75cc7075d7d385ee688e7de6Daniel Dunbar Debug.setBreakPoint(testFunction2, 2, 0); 1089ad54e3adcf7c05d76106a464ea6046fa02a5fadDaniel Dunbar testFunction2(); 109df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar assertNull(exception); 110df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar assertEquals(3, state); 111df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar} 112df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar 113df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar 114df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar// Get rid of the debug event listener. 115df78041952371ff37ff0b619294c2b94ebc9e7baDaniel DunbarDebug.setListener(null); 116df78041952371ff37ff0b619294c2b94ebc9e7baDaniel Dunbar