169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Redistribution and use in source and binary forms, with or without
369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// modification, are permitted provided that the following conditions are
469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// met:
569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//
669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Redistributions of source code must retain the above copyright
769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       notice, this list of conditions and the following disclaimer.
869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Redistributions in binary form must reproduce the above
969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       copyright notice, this list of conditions and the following
1069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       disclaimer in the documentation and/or other materials provided
1169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       with the distribution.
1269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
1369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       contributors may be used to endorse or promote products derived
1469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//       from this software without specific prior written permission.
1569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch//
1669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug --harmony-scoping
2969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// The functions used for testing backtraces. They are at the top to make the
3069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// testing of source line/column easier.
3169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(ES6): properly activate extended mode
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
3469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Get the Debug object exposed from the debug context global object.
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar Debug = debug.Debug;
3769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar test_name;
3969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar listener_delegate;
4069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar listener_called;
4169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar exception;
4269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar begin_test_count = 0;
4369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar end_test_count = 0;
4469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar break_count = 0;
4569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Debug event listener which delegates.
4869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction listener(event, exec_state, event_data, data) {
4969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  try {
5069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (event == Debug.DebugEvent.Break) {
5169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      break_count++;
5269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      listener_called = true;
5369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      listener_delegate(exec_state);
5469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
5569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } catch (e) {
5669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    exception = e;
5769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
5869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
5969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Add the debug event listener.
6169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochDebug.setListener(listener);
6269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Initialize for a new test.
6569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction BeginTest(name) {
6669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  test_name = name;
6769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  listener_delegate = null;
6869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  listener_called = false;
6969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  exception = null;
7069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  begin_test_count++;
7169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
7269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
7369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
7469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Check result of a test.
7569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction EndTest() {
7669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertTrue(listener_called, "listerner not called for " + test_name);
7769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertNull(exception, test_name);
7869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  end_test_count++;
7969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
8069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar global_object = this;
8269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
8369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Check that the scope chain contains the expected types of scopes.
8469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction CheckScopeChain(scopes, exec_state) {
8569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertEquals(scopes.length, exec_state.frame().scopeCount());
8669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  for (var i = 0; i < scopes.length; i++) {
8769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    var scope = exec_state.frame().scope(i);
8869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertTrue(scope.isScope());
8969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertEquals(scopes[i], scope.scopeType());
9069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Check the global object when hitting the global scope.
9269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (scopes[i] == debug.ScopeType.Global) {
9369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      // Objects don't have same class (one is "global", other is "Object",
9469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      // so just check the properties directly.
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertPropertiesEqual(global_object, scope.scopeObject().value());
9669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
9769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
9869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Get the debug command processor.
10069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var dcp = exec_state.debugCommandProcessor("unspecified_running_state");
10169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
10269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Send a scopes request and check the result.
10369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var json;
10469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var request_json = '{"seq":0,"type":"request","command":"scopes"}';
10569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var response_json = dcp.processDebugJSONRequest(request_json);
10669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var response = JSON.parse(response_json);
10769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertEquals(scopes.length, response.body.scopes.length);
10869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  for (var i = 0; i < scopes.length; i++) {
10969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertEquals(i, response.body.scopes[i].index);
11069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertEquals(scopes[i], response.body.scopes[i].type);
11169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (scopes[i] == debug.ScopeType.Local ||
11269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        scopes[i] == debug.ScopeType.Closure) {
11369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      assertTrue(response.body.scopes[i].object.ref < 0);
11469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    } else {
11569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      assertTrue(response.body.scopes[i].object.ref >= 0);
11669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
11769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    var found = false;
11869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    for (var j = 0; j < response.refs.length && !found; j++) {
11969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      found = response.refs[j].handle == response.body.scopes[i].object.ref;
12069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
12169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertTrue(found, "Scope object " + response.body.scopes[i].object.ref + " not found");
12269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
12369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
12469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
12569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Check that the content of the scope is as expected. For functions just check
12669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// that there is a function.
12769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction CheckScopeContent(content, number, exec_state) {
12869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var scope = exec_state.frame().scope(number);
12969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var count = 0;
13069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  for (var p in content) {
13169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    var property_mirror = scope.scopeObject().property(p);
13269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (property_mirror.isUndefined()) {
13369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      print('property ' + p + ' not found in scope');
13469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
13569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertFalse(property_mirror.isUndefined(), 'property ' + p + ' not found in scope');
13669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (typeof(content[p]) === 'function') {
13769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      assertTrue(property_mirror.value().isFunction());
13869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    } else {
13969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      assertEquals(content[p], property_mirror.value().value(), 'property ' + p + ' has unexpected value');
14069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
14169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    count++;
14269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
14369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
14469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // 'arguments' and might be exposed in the local and closure scope. Just
14569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // ignore this.
14669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var scope_size = scope.scopeObject().properties().length;
14769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!scope.scopeObject().property('arguments').isUndefined()) {
14869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    scope_size--;
14969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
15069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Also ignore synthetic variable from catch block.
15169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!scope.scopeObject().property('.catch-var').isUndefined()) {
15269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    scope_size--;
15369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
15469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Skip property with empty name.
15569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!scope.scopeObject().property('').isUndefined()) {
15669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    scope_size--;
15769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
15869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Also ignore synthetic variable from block scopes.
15969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!scope.scopeObject().property('.block').isUndefined()) {
16069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    scope_size--;
16169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
16269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
16369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (count != scope_size) {
16469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    print('Names found in scope:');
16569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    var names = scope.scopeObject().propertyNames();
16669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    for (var i = 0; i < names.length; i++) {
16769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      print(names[i]);
16869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
16969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
17069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertEquals(count, scope_size);
17169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
17269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Get the debug command processor.
17369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var dcp = exec_state.debugCommandProcessor("unspecified_running_state");
17469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
17569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Send a scope request for information on a single scope and check the
17669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // result.
17769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var request_json = '{"seq":0,"type":"request","command":"scope","arguments":{"number":';
17869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  request_json += scope.scopeIndex();
17969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  request_json += '}}';
18069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var response_json = dcp.processDebugJSONRequest(request_json);
18169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var response = JSON.parse(response_json);
18269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertEquals(scope.scopeType(), response.body.type);
18369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertEquals(number, response.body.index);
18469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (scope.scopeType() == debug.ScopeType.Local ||
18569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      scope.scopeType() == debug.ScopeType.Closure) {
18669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertTrue(response.body.object.ref < 0);
18769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } else {
18869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    assertTrue(response.body.object.ref >= 0);
18969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
19069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  var found = false;
19169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  for (var i = 0; i < response.refs.length && !found; i++) {
19269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    found = response.refs[i].handle == response.body.object.ref;
19369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
19469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  assertTrue(found, "Scope object " + response.body.object.ref + " not found");
19569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
19669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
19769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
19869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Simple empty block scope in local scope.
19969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBeginTest("Local block 1");
20069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
20169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction local_block_1() {
20269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  {
20369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    debugger;
20469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
20569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
20669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
20769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
208589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
20969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
21069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeContent({}, 0, exec_state);
21169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
21269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlocal_block_1();
21369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
21469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
21569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
216589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Simple empty block scope in local scope with a parameter.
21769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBeginTest("Local 2");
21869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
21969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction local_2(a) {
22069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  {
22169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    debugger;
22269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
22369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
22469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
22569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
226589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Local,
22769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
228589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({a:1}, 0, exec_state);
22969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
23069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlocal_2(1);
23169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
23269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
23369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
23469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Local scope with a parameter and a local variable.
23569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBeginTest("Local 3");
23669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
23769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction local_3(a) {
23869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  let x = 3;
23969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  debugger;
24069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
24169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
24369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeChain([debug.ScopeType.Local,
24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
24569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeContent({a:1,x:3}, 0, exec_state);
24669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
24769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlocal_3(1);
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Local scope with parameters and local variables.
25269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBeginTest("Local 4");
25369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction local_4(a, b) {
25569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  let x = 3;
25669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  let y = 4;
25769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  debugger;
25869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
26169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeChain([debug.ScopeType.Local,
26269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
26369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeContent({a:1,b:2,x:3,y:4}, 0, exec_state);
26469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
26569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlocal_4(1, 2);
26669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
26769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
269589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Single variable in a block scope.
270589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Local 5");
271589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
272589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction local_5(a) {
273589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  {
274589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 5;
275589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
276589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
277589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
278589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
279589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
280589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Block,
281589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Local,
282589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
283589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x:5}, 0, exec_state);
284589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({a:1}, 1, exec_state);
285589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
286589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlocal_5(1);
287589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
288589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
289589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
290589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Two variables in a block scope.
291589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Local 6");
292589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
293589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction local_6(a) {
294589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  {
295589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 6;
296589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let y = 7;
297589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
298589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
299589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
300589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
301589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
302589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Block,
303589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Local,
304589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
305589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x:6,y:7}, 0, exec_state);
306589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({a:1}, 1, exec_state);
307589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
308589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlocal_6(1);
309589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
310589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
311589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
312589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Two variables in a block scope.
313589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochBeginTest("Local 7");
314589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
315589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction local_7(a) {
316589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  {
317589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    {
318589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 8;
319589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      debugger;
320589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
321589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
322589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
323589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
324589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
325589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Block,
326589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Local,
327589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
328589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({x:8}, 0, exec_state);
329589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeContent({a:1}, 1, exec_state);
330589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
331589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlocal_7(1);
332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Simple closure formed by returning an inner function referering to an outer
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// block local variable and an outer function's parameter.
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("Closure 1");
33869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction closure_1(a) {
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var x = 2;
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  let y = 3;
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (true) {
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let z = 4;
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    function f() {
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      debugger;
3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return a + x + y + z;
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    };
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return f;
34969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
35069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
35169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
35269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Local,
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Block,
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Closure,
35669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
35769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CheckScopeContent({}, 0, exec_state);
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({a:1,x:2,y:3}, 2, exec_state);
35969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclosure_1(1)();
36169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
36269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
36369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Simple for-in loop over the keys of an object.
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("For loop 1");
36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction for_loop_1() {
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (let x in {y:undefined}) {
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    debugger;
37069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
37169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
37269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
37369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Block,
37569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Local,
37669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:'y'}, 0, exec_state);
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The function scope contains a temporary iteration variable.
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:'y'}, 1, exec_state);
38069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor_loop_1();
38269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
38369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
38469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// For-in loop over the keys of an object with a block scoped let variable
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// shadowing the iteration variable.
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("For loop 2");
38869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction for_loop_2() {
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (let x in {y:undefined}) {
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let x = 3;
39269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    debugger;
39369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
39469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
39569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
39669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Block,
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Block,
39969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Local,
40069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:3}, 0, exec_state);
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:'y'}, 1, exec_state);
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The function scope contains a temporary iteration variable.
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:'y'}, 2, exec_state);
40569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor_loop_2();
40769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
40869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
40969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Simple for loop.
4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("For loop 3");
41269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction for_loop_3() {
4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (let x = 3; x < 4; ++x) {
4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    debugger;
41669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
41769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
41869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
41969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Block,
42169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Local,
42269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:3}, 0, exec_state);
4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({}, 1, exec_state);
42569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor_loop_3();
42769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
42869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
42969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// For loop with a block scoped let variable shadowing the iteration variable.
4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("For loop 4");
432589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction for_loop_4() {
4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (let x = 3; x < 4; ++x) {
4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    let x = 5;
436589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    debugger;
437589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
438589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
439589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
440589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochlistener_delegate = function(exec_state) {
441589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CheckScopeChain([debug.ScopeType.Block,
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Block,
443589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Local,
444589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                   debug.ScopeType.Global], exec_state);
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:5}, 0, exec_state);
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:3}, 1, exec_state);
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({}, 2, exec_state);
448589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch};
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor_loop_4();
450589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochEndTest();
451589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
452589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// For loop with two variable declarations.
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBeginTest("For loop 5");
45569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction for_loop_5() {
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (let x = 3, y = 5; x < 4; ++x) {
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    debugger;
45969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
46069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
46169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
46269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochlistener_delegate = function(exec_state) {
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeChain([debug.ScopeType.Block,
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   debug.ScopeType.Local,
46569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                   debug.ScopeType.Global], exec_state);
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({x:3,y:5}, 0, exec_state);
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CheckScopeContent({}, 1, exec_state);
46869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch};
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor_loop_5();
47069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochEndTest();
471