1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Flags: --expose-debug-as debug 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Get the Debug object exposed from the debug context global object. 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug = debug.Debug 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple debug event handler which first time hit will perform 1000 steps and 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// second time hit will evaluate and store the value of "i". If requires that 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the global property "state" is initially zero. 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar bp1, bp2; 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction listener(event, exec_state, event_data, data) { 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (event == Debug.DebugEvent.Break) { 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (state == 0) { 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block exec_state.prepareStep(Debug.StepAction.StepIn, 1000); 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block state = 1; 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (state == 1) { 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result = exec_state.frame().evaluate("i").value(); 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clear the break point on line 2 if set. 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (bp2) { 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Debug.clearBreakPoint(bp2); 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Add the debug event listener. 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.setListener(listener); 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test debug event for break point. 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction f() { 587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch var i; // Line 1. 597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch for (i = 0; i < 1000; i++) { // Line 2. 607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch x = 1; // Line 3. 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Set a breakpoint on the for statement (line 1). 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbp1 = Debug.setBreakPoint(f, 1); 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check that performing 1000 steps will make i 499. 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstate = 0; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockresult = -1; 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockf(); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(499, result); 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check that performing 1000 steps with a break point on the statement in the 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// for loop (line 2) will only make i 0 as a real break point breaks even when 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// multiple steps have been requested. 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstate = 0; 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockresult = -1; 787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbp2 = Debug.setBreakPoint(f, 3); 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockf(); 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(0, result); 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Get rid of the debug event listener. 83d91b9f7d46489a9ee00f9cb415630299c76a502bLeon ClarkeDebug.setListener(null); 84