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