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