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