11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 21e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Redistribution and use in source and binary forms, with or without 31e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// modification, are permitted provided that the following conditions are 41e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// met: 51e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 61e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions of source code must retain the above copyright 71e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// notice, this list of conditions and the following disclaimer. 81e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions in binary form must reproduce the above 91e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// copyright notice, this list of conditions and the following 101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// disclaimer in the documentation and/or other materials provided 111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// with the distribution. 121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Neither the name of Google Inc. nor the names of its 131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// contributors may be used to endorse or promote products derived 141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// from this software without specific prior written permission. 151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug 29592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// This test tests that full code compiled without debug break slots 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// is recompiled with debug break slots when debugging is started. 3285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get the Debug object exposed from the debug context global object. 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug = debug.Debug 3585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar bp; 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar done = false; 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar step_count = 0; 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar set_bp = false 40592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Debug event listener which steps until the global variable done is true. 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction listener(event, exec_state, event_data, data) { 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (event == Debug.DebugEvent.Break) { 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!done) exec_state.prepareStep(Debug.StepAction.StepNext); 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch step_count++; 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 48592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set the global variables state to prpare the stepping test. 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction prepare_step_test() { 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch done = false; 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch step_count = 0; 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 54592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Test function to step through. 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f() { 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a = 0; 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (set_bp) { bp = Debug.setBreakPoint(f, 3); } 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var i = 1; 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var j = 2; 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch done = true; 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 63592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test(); 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(); 6685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Add the debug event listener. 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(listener); 6985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Make f set a breakpoint with an activation on the stack. 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test(); 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochset_bp = true; 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(); 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(1782): Fix issue to bring back this assert. 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//assertEquals(4, step_count); 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.clearBreakPoint(bp); 7785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Set a breakpoint on the first var statement (line 1). 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochset_bp = false; 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbp = Debug.setBreakPoint(f, 3); 8185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Step through the function ensuring that the var statements are hit as well. 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test(); 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(); 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(4, step_count); 8685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Clear the breakpoint and check that no stepping happens. 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.clearBreakPoint(bp); 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochprepare_step_test(); 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(); 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(0, step_count); 92592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get rid of the debug event listener. 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(null); 95