126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Copyright 2008 the V8 project authors. All rights reserved. 226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Redistribution and use in source and binary forms, with or without 326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// modification, are permitted provided that the following conditions are 426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// met: 526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// 626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// * Redistributions of source code must retain the above copyright 726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// notice, this list of conditions and the following disclaimer. 826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// * Redistributions in binary form must reproduce the above 926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// copyright notice, this list of conditions and the following 1026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// disclaimer in the documentation and/or other materials provided 1126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// with the distribution. 1226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// * Neither the name of Google Inc. nor the names of its 1326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// contributors may be used to endorse or promote products derived 1426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// from this software without specific prior written permission. 1526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// 1626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 2826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Flags: --expose-debug-as debug 29ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org// Flags: --turbo-deoptimization 3026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Get the Debug object exposed from the debug context global object. 3126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar Debug = debug.Debug 3226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 3326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Simple function which stores the last debug event. 3426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar listenerComplete = false; 3526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar exception = false; 3626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 3726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar base_request = '"seq":0,"type":"request","command":"clearbreakpointgroup"'; 3826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar scriptId = null; 3926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 4026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgfunction safeEval(code) { 4126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org try { 4226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return eval('(' + code + ')'); 4326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } catch (e) { 4426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org assertEquals(void 0, e); 4526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org return undefined; 4626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 4726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 4826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 4926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgfunction testArguments(dcp, arguments, success) { 5026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org var request = '{' + base_request + ',"arguments":' + arguments + '}' 5126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org var json_response = dcp.processDebugJSONRequest(request); 5226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org var response = safeEval(json_response); 5326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (success) { 5426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org assertTrue(response.success, json_response); 5526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } else { 5626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org assertFalse(response.success, json_response); 5726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 5826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org} 5926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 6026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgfunction listener(event, exec_state, event_data, data) { 6126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org try { 6226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org if (event == Debug.DebugEvent.Break) { 6326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org // Get the debug command processor. 6426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org var dcp = exec_state.debugCommandProcessor("unspecified_running_state"); 6526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 6626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org // Clear breakpoint group 1. 6726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org testArguments(dcp, '{"groupId":1}', true); 6826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 6926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org // Indicate that all was processed. 7026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org listenerComplete = true; 7126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } else if (event == Debug.DebugEvent.AfterCompile) { 7226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org scriptId = event_data.script().id(); 7326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org assertEquals(source, event_data.script().source()); 7426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } 7526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org } catch (e) { 7626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org exception = e 7726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org }; 7826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org}; 7926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 8026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 8126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Add the debug event listener. 8226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgDebug.setListener(listener); 8326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 8426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar source = 'function f(n) {\nreturn n+1;\n}\nfunction g() {return f(10);}' + 8526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org '\nvar r = g(); g;'; 8626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgeval(source); 8726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 8826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertNotNull(scriptId); 8926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 9026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar groupId1 = 1; 9126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar groupId2 = 2; 9226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Set a break point and call to invoke the debug event listener. 9326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar bp1 = Debug.setScriptBreakPointById(scriptId, 1, null, null, groupId1); 9426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar bp2 = Debug.setScriptBreakPointById(scriptId, 1, null, null, groupId2); 9526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar bp3 = Debug.setScriptBreakPointById(scriptId, 1, null, null, null); 9626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar bp4 = Debug.setScriptBreakPointById(scriptId, 3, null, null, groupId1); 9726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar bp5 = Debug.setScriptBreakPointById(scriptId, 4, null, null, groupId2); 9826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 9926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertEquals(5, Debug.scriptBreakPoints().length); 10026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 10126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Call function 'g' from the compiled script to trigger breakpoint. 10226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgg(); 10326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 10426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Make sure that the debug event listener vas invoked. 10526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertTrue(listenerComplete, 10626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org "listener did not run to completion: " + exception); 10726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 10826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar breakpoints = Debug.scriptBreakPoints(); 10926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertEquals(3, breakpoints.length); 11026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar breakpointNumbers = breakpoints.map( 11126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org function(scriptBreakpoint) { return scriptBreakpoint.number(); }, 11226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org breakpointNumbers); 11326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 11426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Check that all breakpoints from group 1 were deleted and all the 11526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// rest are preserved. 11626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertEquals([bp2, bp3, bp5].sort(), breakpointNumbers.sort()); 11726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 11826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertFalse(exception, "exception in listener"); 119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Clear all breakpoints to allow the test to run again (--stress-opt). 121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgDebug.clearBreakPoint(bp2); 122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgDebug.clearBreakPoint(bp3); 123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgDebug.clearBreakPoint(bp5); 124