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