1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2008 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --expose-debug-as debug 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Get the Debug object exposed from the debug context global object. 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochDebug = debug.Debug 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Tests how debugger can step over not necessarily in the top frame. 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Simple 3 functions, that protocol their execution state in global 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// variable state. 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar state; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction f() { 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = 1978; 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (state[2] = 0; state[2] < 3; state[2]++) { 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void String(a); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction g() { 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (state[1] = 0; state[1] < 3; state[1]++) { 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f(); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction h() { 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch state = [-1, -1, -1]; 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (state[0] = 0; state[0] < 3; state[0]++) { 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch g(); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction TestCase(expected_final_state) { 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var listener_exception = null; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var state_snapshot; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var listener_state; 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var bp; 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function listener(event, exec_state, event_data, data) { 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("Here ("+event+"/"+listener_state+"): " + 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exec_state.frame(0).sourceLineText()); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try { 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (event == Debug.DebugEvent.Break) { 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (listener_state == 0) { 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug.clearBreakPoint(bp); 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch exec_state.prepareStep(Debug.StepAction.StepNext); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch listener_state = 1; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (listener_state == 1) { 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch state_snapshot = String(state); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("State: " + state_snapshot); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug.setListener(null); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch listener_state = 2; 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } catch (e) { 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch listener_exception = e; 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add the debug event listener. 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch listener_state = 0; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug.setListener(listener); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bp = Debug.setBreakPoint(f, 1); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch h(); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug.setListener(null); 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (listener_exception !== null) { 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("Exception caught: " + listener_exception); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertUnreachable(); 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(expected_final_state, state_snapshot); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Warm-up -- make sure all is compiled and ready for breakpoint. 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochh(); 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTestCase("0,0,-1"); 104