126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Copyright 2009 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
2926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Get the Debug object exposed from the debug context global object.
3026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgDebug = debug.Debug
3126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
3226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar listenerComplete = false;
3326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvar exception = false;
3426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
3526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgfunction listener(event, exec_state, event_data, data) {
3626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  try {
3726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    if (event == Debug.DebugEvent.Break) {
3826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      // Get the debug command processor.
3926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      var dcp = exec_state.debugCommandProcessor();
4026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
4126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      var request = {
4226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org         seq: 0,
4326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org         type: 'request',
4426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org         command: 'evaluate',
4526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org         arguments: {
4626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org           expression: 'a',
4726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org           frame: 0
4826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org         }
4926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      };
5026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      request = JSON.stringify(request);
5126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
5226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      var resp = dcp.processDebugJSONRequest(request);
5326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      var response = JSON.parse(resp);
5426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      assertTrue(response.success, 'Command failed: ' + resp);
5526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      assertEquals('object', response.body.type);
5626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      assertEquals('Object', response.body.className);
5726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
5826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      // Indicate that all was processed.
5926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org      listenerComplete = true;
6026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    }
6126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  } catch (e) {
6226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org   exception = e
6326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  };
6426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org};
6526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
6626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Add the debug event listener.
6726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgDebug.setListener(listener);
6826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
6926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgfunction callDebugger() {
7026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  // Add set constructor field to a non-function value.
7126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  var a = {constructor:true};
7226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  debugger;
7326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org}
7426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
7526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgcallDebugger();
7626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
7726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
7826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Make sure that the debug event listener vas invoked.
7926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertFalse(exception, "exception in listener")
8026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgassertTrue(listenerComplete, "listener did not run to completion");
81