1ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
3ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// modification, are permitted provided that the following conditions are
4ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// met:
5ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//
6ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
7ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
8ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
9ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       copyright notice, this list of conditions and the following
10ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
11ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       with the distribution.
12ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
13ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       contributors may be used to endorse or promote products derived
14ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       from this software without specific prior written permission.
15ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//
16ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
28ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Flags: --expose-debug-as debug --allow-natives-syntax
29ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org// Flags: --turbo-deoptimization
30ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
31ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgDebug = debug.Debug;
32ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar listened = false;
33ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
34ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction listener(event, exec_state, event_data, data) {
35ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  if (event != Debug.DebugEvent.Break) return;
36ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  try {
37ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("goo", exec_state.frame(0).evaluate("goo").value());
38ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(0).evaluate("goo = 'goo foo'");
39ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("bar return", exec_state.frame(0).evaluate("bar()").value());
40ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("inner bar", exec_state.frame(0).evaluate("inner").value());
41ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("outer bar", exec_state.frame(0).evaluate("outer").value());
42ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("baz inner", exec_state.frame(0).evaluate("baz").value());
43ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    assertEquals("baz outer", exec_state.frame(1).evaluate("baz").value());
44ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(0).evaluate("w = 'w foo'");
45ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(0).evaluate("inner = 'inner foo'");
46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(0).evaluate("outer = 'outer foo'");
47ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(0).evaluate("baz = 'baz inner foo'");
48ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    exec_state.frame(1).evaluate("baz = 'baz outer foo'");
49ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    listened = true;
50ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  } catch (e) {
51ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    print(e);
52ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    print(e.stack);
53ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
54ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
55ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
56ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgDebug.setListener(listener);
57ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
58ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar outer = "outer";
59ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar baz = "baz outer";
60ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
61ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction foo() {
62ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var inner = "inner";
63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var baz = "baz inner";
64ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var goo = "goo";
65ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var withw = { w: "w" };
66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  var withv = { v: "v" };
67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
68ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  with (withv) {
69ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    var bar = function bar() {
70ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      assertEquals("goo foo", goo);
71ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      inner = "inner bar";
72ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      outer = "outer bar";
73ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      v = "v bar";
74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      return "bar return";
75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    };
76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  with (withw) {
79ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    debugger;
80ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
82ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertEquals("inner foo", inner);
83ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertEquals("baz inner foo", baz);
84ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertEquals("w foo", withw.w);
85ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  assertEquals("v bar", withv.v);
86ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
87ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
88ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfoo();
89ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals("outer foo", outer);
90ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals("baz outer foo", baz);
91ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertTrue(listened);
92ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgDebug.setListener(null);
93