1// Copyright 2011 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Flags: --expose-debug-as debug --expose-natives-as=builtins
29
30// Check that the ScopeIterator can properly recreate the scope at
31// every point when stepping through functions.
32
33var Debug = debug.Debug;
34
35function listener(event, exec_state, event_data, data) {
36  if (event == Debug.DebugEvent.Break) {
37    // Access scope details.
38    var scope_count = exec_state.frame().scopeCount();
39    for (var i = 0; i < scope_count; i++) {
40      var scope = exec_state.frame().scope(i);
41      // assertTrue(scope.isScope());
42      scope.scopeType();
43      scope.scopeObject();
44    }
45
46    // Do steps until we reach the global scope again.
47    if (true) {
48      exec_state.prepareStep(Debug.StepAction.StepInMin, 1);
49    }
50  }
51}
52
53Debug.setListener(listener);
54
55
56function test1() {
57  debugger;
58  with ({x:1}) {
59    x = 2;
60  }
61}
62test1();
63
64
65function test2() {
66  if (true) {
67    with ({}) {
68      debugger;
69    }
70  } else {
71    with ({}) {
72      return 10;
73    }
74  }
75}
76test2();
77
78
79function test3() {
80  if (true) {
81    debugger;
82  } else {
83    with ({}) {
84      return 10;
85    }
86  }
87}
88test3();
89
90
91function test4() {
92  debugger;
93  with ({x:1}) x = 1
94}
95test4();
96
97
98function test5() {
99  debugger;
100  var dummy = 1;
101  with ({}) {
102    with ({}) {
103      dummy = 2;
104    }
105  }
106  dummy = 3;
107}
108test5();
109
110
111function test6() {
112  debugger;
113  try {
114    throw 'stuff';
115  } catch (e) {
116    e = 1;
117  }
118}
119test6();
120
121
122function test7() {
123  debugger;
124  function foo() {}
125}
126test7();
127
128
129function test8() {
130  debugger;
131  (function foo() {})();
132}
133test8();
134
135
136function test10() {
137  debugger;
138  with ({}) {
139    return 10;
140  }
141}
142test10();
143
144
145function test11() {
146  debugger;
147  try {
148    throw 'stuff';
149  } catch (e) {
150    return 10;
151  }
152}
153test11();
154
155
156var prefixes = [
157    "debugger; ",
158    "if (false) { try { throw 0; } catch(x) { return x; } }; debugger; " ];
159
160
161// Return from function constructed with Function constructor.
162var anon = 12;
163for (var i = 0; i < prefixes.length; ++i) {
164  var pre = prefixes[i];
165  Function(pre + "return 42")();
166  Function(pre + "return 42 ")();
167  Function(pre + "return 42;")();
168  Function(pre + "return 42; ")();
169  Function(pre + "return anon")();
170  Function(pre + "return anon ")();
171  Function(pre + "return anon;")();
172  Function(pre + "return anon; ")();
173}
174
175
176try {
177  with({}) {
178    debugger;
179    eval("{}$%:^");
180  }
181} catch(e) {
182  nop();
183}
184
185
186function nop() {}
187
188
189// With block as the last(!) statement in global code.
190with ({}) { debugger; }