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