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