13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug --allow-natives-syntax
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The functions used for testing backtraces. They are at the top to make the
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// testing of source line/column easier.
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Get the Debug object exposed from the debug context global object.
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar Debug = debug.Debug;
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar test_name;
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar listener_delegate;
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar listener_called;
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar exception;
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar begin_test_count = 0;
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar end_test_count = 0;
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar break_count = 0;
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debug event listener which delegates.
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction listener(event, exec_state, event_data, data) {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (event == Debug.DebugEvent.Break) {
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break_count++;
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      listener_called = true;
50257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      listener_delegate(exec_state);
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    exception = e;
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Add the debug event listener.
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.setListener(listener);
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Initialize for a new test.
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction BeginTest(name) {
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  test_name = name;
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  listener_delegate = null;
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  listener_called = false;
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  exception = null;
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  begin_test_count++;
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check result of a test.
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction EndTest() {
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertTrue(listener_called, "listerner not called for " + test_name);
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertNull(exception, test_name);
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  end_test_count++;
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check that the scope chain contains the expected types of scopes.
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction CheckScopeChain(scopes, exec_state) {
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(scopes.length, exec_state.frame().scopeCount());
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < scopes.length; i++) {
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var scope = exec_state.frame().scope(i);
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertTrue(scope.isScope());
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertEquals(scopes[i], scope.scopeType());
866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check the global object when hitting the global scope.
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (scopes[i] == debug.ScopeType.Global) {
89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // Objects don't have same class (one is "global", other is "Object",
90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // so just check the properties directly.
91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      assertPropertiesEqual(this, scope.scopeObject().value());
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the debug command processor.
963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var dcp = exec_state.debugCommandProcessor("unspecified_running_state");
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Send a scopes request and check the result.
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var json;
100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var request_json = '{"seq":0,"type":"request","command":"scopes"}';
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response_json = dcp.processDebugJSONRequest(request_json);
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response = JSON.parse(response_json);
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(scopes.length, response.body.scopes.length);
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < scopes.length; i++) {
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertEquals(i, response.body.scopes[i].index);
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertEquals(scopes[i], response.body.scopes[i].type);
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (scopes[i] == debug.ScopeType.Local ||
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        scopes[i] == debug.ScopeType.Closure) {
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertTrue(response.body.scopes[i].object.ref < 0);
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertTrue(response.body.scopes[i].object.ref >= 0);
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var found = false;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var j = 0; j < response.refs.length && !found; j++) {
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      found = response.refs[j].handle == response.body.scopes[i].object.ref;
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertTrue(found, "Scope object " + response.body.scopes[i].object.ref + " not found");
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Check that the content of the scope is as expected. For functions just check
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// that there is a function.
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction CheckScopeContent(content, number, exec_state) {
125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var scope = exec_state.frame().scope(number);
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var count = 0;
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var p in content) {
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var property_mirror = scope.scopeObject().property(p);
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertFalse(property_mirror.isUndefined(), 'property ' + p + ' not found in scope');
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (typeof(content[p]) === 'function') {
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertTrue(property_mirror.value().isFunction());
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(content[p], property_mirror.value().value(), 'property ' + p + ' has unexpected value');
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    count++;
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 'arguments' and might be exposed in the local and closure scope. Just
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ignore this.
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var scope_size = scope.scopeObject().properties().length;
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!scope.scopeObject().property('arguments').isUndefined()) {
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    scope_size--;
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Also ignore synthetic variable from catch block.
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!scope.scopeObject().property('.catch-var').isUndefined()) {
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    scope_size--;
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Skip property with empty name.
1498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (!scope.scopeObject().property('').isUndefined()) {
1508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    scope_size--;
1518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (count != scope_size) {
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    print('Names found in scope:');
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var names = scope.scopeObject().propertyNames();
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < names.length; i++) {
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      print(names[i]);
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(count, scope_size);
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the debug command processor.
1633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var dcp = exec_state.debugCommandProcessor("unspecified_running_state");
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Send a scope request for information on a single scope and check the
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // result.
167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var request_json = '{"seq":0,"type":"request","command":"scope","arguments":{"number":';
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request_json += scope.scopeIndex();
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  request_json += '}}';
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response_json = dcp.processDebugJSONRequest(request_json);
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response = JSON.parse(response_json);
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(scope.scopeType(), response.body.type);
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(number, response.body.index);
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (scope.scopeType() == debug.ScopeType.Local ||
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      scope.scopeType() == debug.ScopeType.Closure) {
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertTrue(response.body.object.ref < 0);
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    assertTrue(response.body.object.ref >= 0);
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var found = false;
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < response.refs.length && !found; i++) {
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    found = response.refs[i].handle == response.body.object.ref;
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertTrue(found, "Scope object " + response.body.object.ref + " not found");
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple empty local scope.
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 1");
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_1() {
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 0, exec_state);
199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_1();
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Local scope with a parameter.
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 2");
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_2(a) {
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1}, 0, exec_state);
215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_2(1);
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Local scope with a parameter and a local variable.
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 3");
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_3(a) {
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,x:3}, 0, exec_state);
232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_3(1);
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Local scope with parameters and local variables.
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 4");
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_4(a, b) {
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = 4;
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4}, 0, exec_state);
250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_4(1, 2);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Empty local scope with use of eval.
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 5");
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_5() {
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('');
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 0, exec_state);
267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_5();
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Local introducing local variable using eval.
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 6");
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_6() {
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var i = 5');
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({i:5}, 0, exec_state);
284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_6();
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Local scope with parameters, local variables and local variable introduced
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// using eval.
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Local 7");
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction local_7(a, b) {
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = 4;
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var i = 5');
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var j = 6');
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debugger;
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,i:5,j:6}, 0, exec_state);
305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochlocal_7(1, 2);
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Single empty with block.
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("With 1");
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction with_1() {
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  with({}) {
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 0, exec_state);
324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith_1();
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Nested empty with blocks.
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("With 2");
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction with_2() {
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  with({}) {
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with({}) {
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.With,
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 0, exec_state);
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 1, exec_state);
347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith_2();
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// With block using an in-place object literal.
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("With 3");
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction with_3() {
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  with({a:1,b:2}) {
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2}, 0, exec_state);
366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith_3();
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Nested with blocks using in-place object literals.
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("With 4");
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction with_4() {
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  with({a:1,b:2}) {
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with({a:2,b:1}) {
377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.With,
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:2,b:1}, 0, exec_state);
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2}, 1, exec_state);
389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith_4();
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Nested with blocks using existing object.
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("With 5");
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar with_object = {c:3,d:4};
398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction with_5() {
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  with(with_object) {
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with(with_object) {
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.With,
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent(with_object, 0, exec_state);
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent(with_object, 1, exec_state);
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(exec_state.frame().scope(0).scopeObject(), exec_state.frame().scope(1).scopeObject());
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assertEquals(with_object, exec_state.frame().scope(1).scopeObject().value());
415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith_5();
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
420589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Nested with blocks using existing object in global code.
421589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("With 6");
422589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
423589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.With,
424589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.With,
425589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
426589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent(with_object, 0, exec_state);
427589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent(with_object, 1, exec_state);
428589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  assertEquals(exec_state.frame().scope(0).scopeObject(), exec_state.frame().scope(1).scopeObject());
429589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  assertEquals(with_object, exec_state.frame().scope(1).scopeObject().value());
430589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
431589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
432589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar with_object = {c:3,d:4};
433589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochwith(with_object) {
434589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  with(with_object) {
435589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
436589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
437589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
438589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
439589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
440589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// With block in function that is marked for optimization while being executed.
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("With 7");
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction with_7() {
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  with({}) {
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %OptimizeFunctionOnNextCall(with_7);
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    debugger;
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochlistener_delegate = function(exec_state) {
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.With,
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Local,
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Global], exec_state);
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({}, 0, exec_state);
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochwith_7();
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochEndTest();
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple closure formed by returning an inner function referering the outer
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions arguments.
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 1");
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_1(a) {
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f() {
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return a;
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f;
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1}, 1, exec_state);
478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_1(1)();
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple closure formed by returning an inner function referering the outer
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions arguments. Due to VM optimizations parts of the actual closure is
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// missing from the debugger information.
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 2");
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_2(a, b) {
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = a + 2;
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = b + 2;
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f() {
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return a + x;
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f;
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,x:3}, 1, exec_state);
503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_2(1, 2)();
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple closure formed by returning an inner function referering the outer
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions arguments. Using all arguments and locals from the outer function
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// in the inner function makes these part of the debugger information on the
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// closure.
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 3");
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_3(a, b) {
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = a + 2;
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = b + 2;
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f() {
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return a + b + x + y;
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f;
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4}, 1, exec_state);
529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_3(1, 2)();
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple closure formed by returning an inner function referering the outer
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions arguments. Using all arguments and locals from the outer function
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// in the inner function makes these part of the debugger information on the
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// closure. Use the inner function as well...
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 4");
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_4(a, b) {
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = a + 2;
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = b + 2;
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f() {
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (f) {
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return a + b + x + y;
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f;
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,f:function(){}}, 1, exec_state);
558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_4(1, 2)();
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Simple closure formed by returning an inner function referering the outer
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions arguments. In the presence of eval all arguments and locals
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (including the inner function itself) from the outer function becomes part of
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the debugger infformation on the closure.
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 5");
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_5(a, b) {
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = 4;
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f() {
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval('');
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return 1;
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f;
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,f:function(){}}, 1, exec_state);
586257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_5(1, 2)();
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Two closures. Due to optimizations only the parts actually used are provided
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// through the debugger information.
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 6");
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_6(a, b) {
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f(a, b) {
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var x = 3;
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var y = 4;
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return function() {
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var x = 3;
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var y = 4;
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      some_global = a;
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return f;
604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    };
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f(a, b);
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1}, 1, exec_state);
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({f:function(){}}, 2, exec_state);
616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
617257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_6(1, 2)();
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Two closures. In the presence of eval all information is provided as the
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// compiler cannot determine which parts are used.
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Closure 7");
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction closure_7(a, b) {
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = 4;
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var i = 5');
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var j = 6');
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f(a, b) {
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var x = 3;
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var y = 4;
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval('var i = 5');
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval('var j = 6');
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return function() {
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      some_global = a;
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return f;
638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    };
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f(a, b);
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Local,
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({}, 0, exec_state);
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,i:5,j:6}, 1, exec_state);
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,i:5,j:6,f:function(){}}, 2, exec_state);
651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclosure_7(1, 2)();
6538b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochEndTest();
6548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Closure that may be optimized out.
6578b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochBeginTest("Closure 8");
6588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction closure_8() {
6598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  (function inner(x) {
6608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    debugger;
6618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  })(2);
6628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
6638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochlistener_delegate = function(exec_state) {
6658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
6668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Global], exec_state);
6678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeContent({x: 2}, 0, exec_state);
668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
6698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclosure_8();
6708b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochEndTest();
6718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6738b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochBeginTest("Closure 9");
6748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction closure_9() {
6758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  eval("var y = 1;");
6768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  eval("var z = 1;");
6778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  (function inner(x) {
678257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    y++;
6798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    z++;
6808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    debugger;
6818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  })(2);
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochlistener_delegate = function(exec_state) {
6858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
6868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Closure,
6878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Global], exec_state);
688257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
6898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclosure_9();
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test a mixture of scopes.
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("The full monty");
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction the_full_monty(a, b) {
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 3;
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var y = 4;
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var i = 5');
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval('var j = 6');
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function f(a, b) {
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var x = 9;
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var y = 10;
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval('var i = 11');
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval('var j = 12');
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with ({j:13}){
706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return function() {
707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var x = 14;
7086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        with ({a:15}) {
709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          with ({b:16}) {
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            debugger;
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            some_global = a;
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            return f;
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      };
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return f(a, b);
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.With,
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.With,
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Closure,
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({b:16}, 0, exec_state);
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:15}, 1, exec_state);
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({x:14}, 2, exec_state);
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({j:13}, 3, exec_state);
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:9,y:10,i:11,j:12}, 4, exec_state);
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({a:1,b:2,x:3,y:4,i:5,j:6,f:function(){}}, 5, exec_state);
735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
736257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochthe_full_monty(1, 2)();
7378b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochEndTest();
7388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7408b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochBeginTest("Closure inside With 1");
7418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction closure_in_with_1() {
7428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  with({x:1}) {
7438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    (function inner(x) {
7448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      debugger;
7458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    })(2);
7468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochlistener_delegate = function(exec_state) {
7508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
7518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.With,
7528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Closure,
7538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Global], exec_state);
7548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeContent({x: 2}, 0, exec_state);
755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
7568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclosure_in_with_1();
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7608b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochBeginTest("Closure inside With 2");
7618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction closure_in_with_2() {
7628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  with({x:1}) {
7638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    (function inner(x) {
7648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      with({x:3}) {
7658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        debugger;
7668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      }
7678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    })(2);
7688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
7698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
7708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochlistener_delegate = function(exec_state) {
7728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeChain([debug.ScopeType.With,
7738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Local,
7748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.With,
7758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Closure,
7768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Global], exec_state);
7778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeContent({x: 3}, 0, exec_state);
7788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeContent({x: 2}, 1, exec_state);
7798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeContent({x: 1}, 2, exec_state);
780257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
7818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclosure_in_with_2();
7828b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochEndTest();
7838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7858b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochBeginTest("Closure inside With 3");
7868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction createClosure(a) {
7878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   var b = a + 1;
7888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   return function closure() {
7898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch     var c = b;
7908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch     (function inner(x) {
7918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch       with({x:c}) {
7928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch         debugger;
7938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch       }
7948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch     })(2);
795257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch   };
7968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
7978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction closure_in_with_3() {
7998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  var f = createClosure(0);
8008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  f();
8018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
8028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
8038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochlistener_delegate = function(exec_state) {
8048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  CheckScopeChain([debug.ScopeType.With,
8058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Local,
8068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Closure,
8078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Closure,
8088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   debug.ScopeType.Global], exec_state);
8098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
8108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclosure_in_with_3();
8118b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochEndTest();
8128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
8138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
814589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Closure inside With 4");
815589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
816589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
817589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.With,
818589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
819589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x: 2}, 0, exec_state);
820589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x: 1}, 1, exec_state);
821589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
822589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
823589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochwith({x:1}) {
824589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  (function(x) {
825589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
826589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  })(2);
827589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
828589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
829589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
830589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test global scope.
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Global");
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Global], exec_state);
835257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdebugger;
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Catch block 1");
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction catch_block_1() {
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw 'Exception';
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Catch,
852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({e:'Exception'}, 0, exec_state);
855257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
856257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochcatch_block_1();
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Catch block 2");
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction catch_block_2() {
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw 'Exception';
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with({n:10}) {
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Catch,
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({n:10}, 0, exec_state);
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({e:'Exception'}, 1, exec_state);
879257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
880257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochcatch_block_2();
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Catch block 3");
8856ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfunction catch_block_3() {
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Do eval to dynamically declare a local variable so that the context's
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // extension slot is initialized with JSContextExtensionObject.
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval("var y = 78;");
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw 'Exception';
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    debugger;
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.Catch,
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({e:'Exception'}, 0, exec_state);
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({y:78}, 1, exec_state);
903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochcatch_block_3();
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBeginTest("Catch block 4");
9096ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfunction catch_block_4() {
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Do eval to dynamically declare a local variable so that the context's
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // extension slot is initialized with JSContextExtensionObject.
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval("var y = 98;");
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw 'Exception';
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    with({n:10}) {
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      debugger;
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocklistener_delegate = function(exec_state) {
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeChain([debug.ScopeType.With,
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Catch,
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Local,
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   debug.ScopeType.Global], exec_state);
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({n:10}, 0, exec_state);
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({e:'Exception'}, 1, exec_state);
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CheckScopeContent({y:98}, 2, exec_state);
930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochcatch_block_4();
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockEndTest();
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
935589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Test catch in global scope.
936589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Catch block 5");
937589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
938589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Catch,
939589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
940589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({e:'Exception'}, 0, exec_state);
941589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
942589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
943589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
944589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  throw 'Exception';
945589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
946589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  debugger;
947589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
948589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
949589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
950589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
951589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
952589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Closure inside catch in global code.
953589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Catch block 6");
954589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
955589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
956589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Catch,
957589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
958589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x: 2}, 0, exec_state);
959589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({e:'Exception'}, 1, exec_state);
960589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
961589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
962589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
963589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  throw 'Exception';
964589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
965589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  (function(x) {
966589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
967589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  })(2);
968589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
969589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
970589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
971589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Catch block in function that is marked for optimization while being executed.
9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("Catch block 7");
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction catch_block_7() {
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(catch_block_7);
9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  try {
9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw 'Exception';
9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } catch (e) {
9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    debugger;
9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochlistener_delegate = function(exec_state) {
9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Catch,
9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Local,
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Global], exec_state);
9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({e:'Exception'}, 0, exec_state);
9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochcatch_block_7();
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochEndTest();
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
994257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(begin_test_count, break_count,
995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             'one or more tests did not enter the debugger');
996257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(begin_test_count, end_test_count,
997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             'one or more tests did not have its result checked');
998