15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2011 the V8 project authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Redistribution and use in source and binary forms, with or without 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// modification, are permitted provided that the following conditions are 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// met: 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Redistributions of source code must retain the above copyright 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// notice, this list of conditions and the following disclaimer. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Redistributions in binary form must reproduce the above 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// copyright notice, this list of conditions and the following 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// disclaimer in the documentation and/or other materials provided 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// contributors may be used to endorse or promote products derived 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// from this software without specific prior written permission. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Flags: --allow-natives-syntax --harmony-scoping 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Test functionality of block scopes. 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)"use strict"; 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Hoisting of var declarations. 3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)function f1() { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var x = 1; 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) var y; 385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(1, x) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(undefined, y) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for (var j = 0; j < 5; ++j) f1(); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)%OptimizeFunctionOnNextCall(f1); 44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochf1(); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)assertTrue(%GetOptimizationStatus(f1) != 2); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Dynamic lookup in and through block contexts. 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function f2(one) { 49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var x = one + 1; 50f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) let y = one + 2; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const u = one + 4; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) let z = one + 3; 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const v = one + 5; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(1, eval('one')); 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(2, eval('x')); 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(3, eval('y')); 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(4, eval('z')); 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(5, eval('u')); 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(6, eval('v')); 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)f2(1); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Lookup in and through block contexts. 67f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)function f3(one) { 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var x = one + 1; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) let y = one + 2; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const u = one + 4; 71323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) { 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) let z = one + 3; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const v = one + 5; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(1, one); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(2, x); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(3, y); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(4, z); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(5, u); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(6, v); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for (var j = 0; j < 5; ++j) f3(1); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)%OptimizeFunctionOnNextCall(f3); 84591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochf3(1); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)assertTrue(%GetOptimizationStatus(f3) != 2); 86f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)// Dynamic lookup from closure. 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function f4(one) { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var x = one + 1; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) let y = one + 2; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const u = one + 4; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) let z = one + 3; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const v = one + 5; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function f() { 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(1, eval('one')); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(2, eval('x')); 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch assertEquals(3, eval('y')); 10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) assertEquals(4, eval('z')); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assertEquals(5, eval('u')); 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch assertEquals(6, eval('v')); 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch }; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccif4(1); 108 109 110// Lookup from closure. 111function f5(one) { 112 var x = one + 1; 113 let y = one + 2; 114 const u = one + 4; 115 { 116 let z = one + 3; 117 const v = one + 5; 118 function f() { 119 assertEquals(1, one); 120 assertEquals(2, x); 121 assertEquals(3, y); 122 assertEquals(4, z); 123 assertEquals(5, u); 124 assertEquals(6, v); 125 }; 126 } 127} 128f5(1); 129 130 131// Return from block. 132function f6() { 133 let x = 1; 134 const u = 3; 135 { 136 let y = 2; 137 const v = 4; 138 return x + y; 139 } 140} 141assertEquals(3, f6(6)); 142 143 144// Variable shadowing and lookup. 145function f7(a) { 146 let b = 1; 147 var c = 1; 148 var d = 1; 149 const e = 1; 150 { // let variables shadowing argument, let, const and var variables 151 let a = 2; 152 let b = 2; 153 let c = 2; 154 let e = 2; 155 assertEquals(2,a); 156 assertEquals(2,b); 157 assertEquals(2,c); 158 assertEquals(2,e); 159 } 160 { // const variables shadowing argument, let, const and var variables 161 const a = 2; 162 const b = 2; 163 const c = 2; 164 const e = 2; 165 assertEquals(2,a); 166 assertEquals(2,b); 167 assertEquals(2,c); 168 assertEquals(2,e); 169 } 170 try { 171 throw 'stuff1'; 172 } catch (a) { 173 assertEquals('stuff1',a); 174 // catch variable shadowing argument 175 a = 2; 176 assertEquals(2,a); 177 { 178 // let variable shadowing catch variable 179 let a = 3; 180 assertEquals(3,a); 181 try { 182 throw 'stuff2'; 183 } catch (a) { 184 assertEquals('stuff2',a); 185 // catch variable shadowing let variable 186 a = 4; 187 assertEquals(4,a); 188 } 189 assertEquals(3,a); 190 } 191 assertEquals(2,a); 192 } 193 try { 194 throw 'stuff3'; 195 } catch (c) { 196 // catch variable shadowing var variable 197 assertEquals('stuff3',c); 198 { 199 // const variable shadowing catch variable 200 const c = 3; 201 assertEquals(3,c); 202 } 203 assertEquals('stuff3',c); 204 try { 205 throw 'stuff4'; 206 } catch(c) { 207 assertEquals('stuff4',c); 208 // catch variable shadowing catch variable 209 c = 3; 210 assertEquals(3,c); 211 } 212 (function(c) { 213 // argument shadowing catch variable 214 c = 3; 215 assertEquals(3,c); 216 })(); 217 assertEquals('stuff3', c); 218 (function() { 219 // var variable shadowing catch variable 220 var c = 3; 221 })(); 222 assertEquals('stuff3', c); 223 c = 2; 224 } 225 assertEquals(1,c); 226 (function(a,b,c,e) { 227 // arguments shadowing argument, let, const and var variable 228 a = 2; 229 b = 2; 230 c = 2; 231 e = 2; 232 assertEquals(2,a); 233 assertEquals(2,b); 234 assertEquals(2,c); 235 assertEquals(2,e); 236 // var variable shadowing var variable 237 var d = 2; 238 })(1,1); 239 assertEquals(1,a); 240 assertEquals(1,b); 241 assertEquals(1,c); 242 assertEquals(1,d); 243 assertEquals(1,e); 244} 245f7(1); 246 247 248// Ensure let and const variables are block local 249// and var variables function local. 250function f8() { 251 var let_accessors = []; 252 var var_accessors = []; 253 var const_accessors = []; 254 for (var i = 0; i < 10; i++) { 255 let x = i; 256 var y = i; 257 const z = i; 258 let_accessors[i] = function() { return x; } 259 var_accessors[i] = function() { return y; } 260 const_accessors[i] = function() { return z; } 261 } 262 for (var j = 0; j < 10; j++) { 263 y = j + 10; 264 assertEquals(j, let_accessors[j]()); 265 assertEquals(y, var_accessors[j]()); 266 assertEquals(j, const_accessors[j]()); 267 } 268} 269f8(); 270