| Index: test/mjsunit/harmony/block-scoping.js
|
| diff --git a/test/mjsunit/harmony/block-scoping.js b/test/mjsunit/harmony/block-scoping.js
|
| index f974de82b5ce35b94dc58acb0ed651246014e1f9..266e380725a4766cf34bb5c0c2b2925907ddf84e 100644
|
| --- a/test/mjsunit/harmony/block-scoping.js
|
| +++ b/test/mjsunit/harmony/block-scoping.js
|
| @@ -39,20 +39,178 @@ function f1() {
|
| }
|
| f1();
|
|
|
| -// Dynamic lookup through block scopes.
|
| +
|
| +// Dynamic lookup in and through block contexts.
|
| function f2(one) {
|
| var x = one + 1;
|
| - // TODO(keuchel): introduce let
|
| - // let y = one + 2;
|
| - if (one == 1) {
|
| - // Parameter
|
| + let y = one + 2;
|
| + {
|
| + let z = one + 3;
|
| assertEquals(1, eval('one'));
|
| - // Function local var variable
|
| assertEquals(2, eval('x'));
|
| - // Function local let variable
|
| - // TODO(keuchel): introduce let
|
| - // assertEquals(3, eval('y'));
|
| + assertEquals(3, eval('y'));
|
| + assertEquals(4, eval('z'));
|
| }
|
| }
|
| f2(1);
|
|
|
| +
|
| +// Lookup in and through block contexts.
|
| +function f3(one) {
|
| + var x = one + 1;
|
| + let y = one + 2;
|
| + {
|
| + let z = one + 3;
|
| + assertEquals(1, one);
|
| + assertEquals(2, x);
|
| + assertEquals(3, y);
|
| + assertEquals(4, z);
|
| + }
|
| +}
|
| +f3(1);
|
| +
|
| +
|
| +// Dynamic lookup from closure.
|
| +function f4(one) {
|
| + var x = one + 1;
|
| + let y = one + 2;
|
| + {
|
| + let z = one + 3;
|
| + function f() {
|
| + assertEquals(1, eval('one'));
|
| + assertEquals(2, eval('x'));
|
| + assertEquals(3, eval('y'));
|
| + assertEquals(4, eval('z'));
|
| + };
|
| + }
|
| +}
|
| +f4(1);
|
| +
|
| +
|
| +// Lookup from closure.
|
| +function f5(one) {
|
| + var x = one + 1;
|
| + let y = one + 2;
|
| + {
|
| + let z = one + 3;
|
| + function f() {
|
| + assertEquals(1, one);
|
| + assertEquals(2, x);
|
| + assertEquals(3, y);
|
| + assertEquals(4, z);
|
| + };
|
| + }
|
| +}
|
| +f5(1);
|
| +
|
| +
|
| +// Return from block.
|
| +function f6() {
|
| + let x = 1;
|
| + {
|
| + let y = 2;
|
| + return x + y;
|
| + }
|
| +}
|
| +assertEquals(3, f6(6));
|
| +
|
| +
|
| +// Variable shadowing and lookup.
|
| +function f7(a) {
|
| + let b = 1;
|
| + var c = 1;
|
| + var d = 1;
|
| + { // let variables shadowing argument, let and var variables
|
| + let a = 2;
|
| + let b = 2;
|
| + let c = 2;
|
| + assertEquals(2,a);
|
| + assertEquals(2,b);
|
| + assertEquals(2,c);
|
| + }
|
| + try {
|
| + throw 'stuff1';
|
| + } catch (a) {
|
| + assertEquals('stuff1',a);
|
| + // catch variable shadowing argument
|
| + a = 2;
|
| + assertEquals(2,a);
|
| + {
|
| + // let variable shadowing catch variable
|
| + let a = 3;
|
| + assertEquals(3,a);
|
| + try {
|
| + throw 'stuff2';
|
| + } catch (a) {
|
| + assertEquals('stuff2',a);
|
| + // catch variable shadowing let variable
|
| + a = 4;
|
| + assertEquals(4,a);
|
| + }
|
| + assertEquals(3,a);
|
| + }
|
| + assertEquals(2,a);
|
| + }
|
| + try {
|
| + throw 'stuff3';
|
| + } catch (c) {
|
| + // catch variable shadowing var variable
|
| + assertEquals('stuff3',c);
|
| + try {
|
| + throw 'stuff4';
|
| + } catch(c) {
|
| + assertEquals('stuff4',c);
|
| + // catch variable shadowing catch variable
|
| + c = 3;
|
| + assertEquals(3,c);
|
| + }
|
| + (function(c) {
|
| + // argument shadowing catch variable
|
| + c = 3;
|
| + assertEquals(3,c);
|
| + })();
|
| + assertEquals('stuff3', c);
|
| + (function() {
|
| + // var variable shadowing catch variable
|
| + var c = 3;
|
| + })();
|
| + assertEquals('stuff3', c);
|
| + c = 2;
|
| + }
|
| + assertEquals(1,c);
|
| + (function(a,b,c) {
|
| + // arguments shadowing argument, let and var variable
|
| + a = 2;
|
| + b = 2;
|
| + c = 2;
|
| + assertEquals(2,a);
|
| + assertEquals(2,b);
|
| + assertEquals(2,c);
|
| + // var variable shadowing var variable
|
| + var d = 2;
|
| + })(1,1);
|
| + assertEquals(1,a);
|
| + assertEquals(1,b);
|
| + assertEquals(1,c);
|
| + assertEquals(1,d);
|
| +}
|
| +f7(1);
|
| +
|
| +
|
| +// Ensure let variables are block local and var variables function local.
|
| +function f8() {
|
| + var let_accessors = [];
|
| + var var_accessors = [];
|
| + for (var i = 0; i < 10; i++) {
|
| + let x = i;
|
| + var y = i;
|
| + let_accessors[i] = function() { return x; }
|
| + var_accessors[i] = function() { return y; }
|
| + }
|
| + for (var j = 0; j < 10; j++) {
|
| + y = j + 10;
|
| + assertEquals(j, let_accessors[j]());
|
| + assertEquals(y, var_accessors[j]());
|
| + }
|
| +}
|
| +f8();
|
|
|