Add class to existing lexical scoping tests

This patch strengthens testing of classes by verifying that the binding
that they export externally follows block scoping, as opposed to var-style
scoping. The tests are based on existing tests for let and const.

R=adamk
LOG=N
BUG=v8:3305

Review URL: https://codereview.chromium.org/1286923002

Cr-Commit-Position: refs/heads/master@{#30140}
This commit is contained in:
littledan 2015-08-12 11:42:48 -07:00 committed by Commit bot
parent a904b569a2
commit e261540b9e
8 changed files with 184 additions and 38 deletions

View File

@ -79,7 +79,11 @@ var letbinds = [ "let x;",
"const x = function() {};",
"const x = 2, y = 3;",
"const y = 4, x = 5;",
"class x { }",
];
function forCompatible(bind) {
return !bind.startsWith('class');
}
var varbinds = [ "var x;",
"var x = 0;",
"var x = undefined;",
@ -101,7 +105,9 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(varbinds[v] + '{' + letbinds[l] + '}');
TestNoConflict('{' + letbinds[l] + '}' + varbinds[v]);
// For loop.
TestConflict('for (' + letbinds[l] + '0;) {' + varbinds[v] + '}');
if (forCompatible(letbinds[l])) {
TestConflict('for (' + letbinds[l] + '0;) {' + varbinds[v] + '}');
}
TestNoConflict('for (' + varbinds[v] + '0;) {' + letbinds[l] + '}');
}
@ -114,8 +120,12 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(letbinds[l] + '{ ' + letbinds[k] + '}');
TestNoConflict('{' + letbinds[k] +'} ' + letbinds[l]);
// For loop.
TestNoConflict('for (' + letbinds[l] + '0;) {' + letbinds[k] + '}');
TestNoConflict('for (' + letbinds[k] + '0;) {' + letbinds[l] + '}');
if (forCompatible(letbinds[l])) {
TestNoConflict('for (' + letbinds[l] + '0;) {' + letbinds[k] + '}');
}
if (forCompatible(letbinds[k])) {
TestNoConflict('for (' + letbinds[k] + '0;) {' + letbinds[l] + '}');
}
}
// Test conflicting function/let bindings.
@ -128,7 +138,9 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(funbind + '{' + letbinds[l] + '}');
TestNoConflict('{' + letbinds[l] + '}' + funbind);
// For loop.
TestNoConflict('for (' + letbinds[l] + '0;) {' + funbind + '}');
if (forCompatible(letbinds[l])) {
TestNoConflict('for (' + letbinds[l] + '0;) {' + funbind + '}');
}
// Test conflicting parameter/let bindings.
TestConflict('(function(x) {' + letbinds[l] + '})();');

View File

@ -33,17 +33,20 @@
let x;
let y = 2;
const z = 4;
class c { static foo() { return 1; } }
// Block local
{
let y;
let x = 3;
const z = 5;
class c { static foo() { return 2; } }
}
assertEquals(undefined, x);
assertEquals(2,y);
assertEquals(4,z);
assertEquals(1, c.foo());
if (true) {
let y;
@ -106,6 +109,16 @@ TestLocalDoesNotThrow("for (;false;) var x;");
TestLocalDoesNotThrow("switch (true) { case true: var x; }");
TestLocalDoesNotThrow("switch (true) { default: var x; }");
// Test class declarations with initialisers in statement positions.
TestLocalThrows("if (true) class x { };", SyntaxError);
TestLocalThrows("if (true) {} else class x { };", SyntaxError);
TestLocalThrows("do class x { }; while (false)", SyntaxError);
TestLocalThrows("while (false) class x { };", SyntaxError);
TestLocalThrows("label: class x { };", SyntaxError);
TestLocalThrows("for (;false;) class x { };", SyntaxError);
TestLocalDoesNotThrow("switch (true) { case true: class x { }; }");
TestLocalDoesNotThrow("switch (true) { default: class x { }; }");
// Test that redeclarations of functions are only allowed in outermost scope.
TestLocalThrows("{ let f; var f; }");
TestLocalThrows("{ var f; let f; }");
@ -113,9 +126,13 @@ TestLocalThrows("{ function f() {} let f; }");
TestLocalThrows("{ let f; function f() {} }");
TestLocalThrows("{ function f() {} var f; }");
TestLocalThrows("{ var f; function f() {} }");
TestLocalThrows("{ function f() {} class f {} }");
TestLocalThrows("{ class f {}; function f() {} }");
TestLocalThrows("{ function f() {} function f() {} }");
TestLocalThrows("function f() {} let f;");
TestLocalThrows("let f; function f() {}");
TestLocalThrows("function f() {} class f {}");
TestLocalThrows("class f {}; function f() {}");
TestLocalDoesNotThrow("function arg() {}");
TestLocalDoesNotThrow("function f() {} var f;");
TestLocalDoesNotThrow("var f; function f() {}");

View File

@ -70,6 +70,7 @@ TestAll('x += 1; let x;');
TestAll('++x; let x;');
TestAll('x++; let x;');
TestAll('let y = x; const x = 1;');
TestAll('let y = x; class x {}');
TestAll('f(); let x; function f() { return x + 1; }');
TestAll('f(); let x; function f() { x = 1; }');
@ -77,6 +78,7 @@ TestAll('f(); let x; function f() { x += 1; }');
TestAll('f(); let x; function f() { ++x; }');
TestAll('f(); let x; function f() { x++; }');
TestAll('f(); const x = 1; function f() { return x; }');
TestAll('f(); class x { }; function f() { return x; }');
TestAll('f()(); let x; function f() { return function() { return x + 1; } }');
TestAll('f()(); let x; function f() { return function() { x = 1; } }');
@ -84,22 +86,23 @@ TestAll('f()(); let x; function f() { return function() { x += 1; } }');
TestAll('f()(); let x; function f() { return function() { ++x; } }');
TestAll('f()(); let x; function f() { return function() { x++; } }');
TestAll('f()(); const x = 1; function f() { return function() { return x; } }');
TestAll('f()(); class x { }; function f() { return function() { return x; } }');
for (var kw of ['let', 'const']) {
for (var kw of ['let x = 2', 'const x = 2', 'class x { }']) {
// Use before initialization with a dynamic lookup.
TestAll(`eval("x"); ${kw} x = 2;`);
TestAll(`eval("x + 1;"); ${kw} x = 2;`);
TestAll(`eval("x = 1;"); ${kw} x = 2;`);
TestAll(`eval("x += 1;"); ${kw} x = 2;`);
TestAll(`eval("++x;"); ${kw} x = 2;`);
TestAll(`eval("x++;"); ${kw} x = 2;`);
TestAll(`eval("x"); ${kw};`);
TestAll(`eval("x + 1;"); ${kw};`);
TestAll(`eval("x = 1;"); ${kw};`);
TestAll(`eval("x += 1;"); ${kw};`);
TestAll(`eval("++x;"); ${kw};`);
TestAll(`eval("x++;"); ${kw};`);
// Use before initialization with check for eval-shadowed bindings.
TestAll(`function f() { eval("var y = 2;"); x + 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x = 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x += 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); ++x; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x++; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x + 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x = 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x += 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); ++x; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x++; }; f(); ${kw};`);
}
// Test that variables introduced by function declarations are created and

View File

@ -49,15 +49,19 @@ function f2(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
assertEquals(1, eval('one'));
assertEquals(2, eval('x'));
assertEquals(3, eval('y'));
assertEquals(4, eval('z'));
assertEquals(5, eval('u'));
assertEquals(6, eval('v'));
assertEquals(7, eval('a.foo()'));
assertEquals(8, eval('b.foo()'));
}
}
@ -68,15 +72,19 @@ function f3(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
assertEquals(1, one);
assertEquals(2, x);
assertEquals(3, y);
assertEquals(4, z);
assertEquals(5, u);
assertEquals(6, v);
assertEquals(7, a.foo());
assertEquals(8, b.foo());
}
}
for (var j = 0; j < 5; ++j) f3(1);
@ -91,9 +99,11 @@ function f4(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
function f() {
assertEquals(1, eval('one'));
assertEquals(2, eval('x'));
@ -101,6 +111,8 @@ function f4(one) {
assertEquals(4, eval('z'));
assertEquals(5, eval('u'));
assertEquals(6, eval('v'));
assertEquals(7, eval('a.foo()'));
assertEquals(8, eval('b.foo()'));
}
f();
}
@ -113,9 +125,11 @@ function f5(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
function f() {
assertEquals(1, one);
assertEquals(2, x);
@ -123,6 +137,8 @@ function f5(one) {
assertEquals(4, z);
assertEquals(5, u);
assertEquals(6, v);
assertEquals(7, a.foo());
assertEquals(8, b.foo());
}
f();
}
@ -149,25 +165,43 @@ function f7(a) {
var c = 1;
var d = 1;
const e = 1;
{ // let variables shadowing argument, let, const and var variables
class f { static foo() { return 1; } }
{ // let variables shadowing argument, let, const, class and var variables
let a = 2;
let b = 2;
let c = 2;
let e = 2;
let f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
}
{ // const variables shadowing argument, let, const and var variables
const a = 2;
const b = 2;
const c = 2;
const e = 2;
const f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
}
{ // class variables shadowing argument, let, const and var variables
class a { static foo() { return 2; } }
class b { static foo() { return 2; } }
class c { static foo() { return 2; } }
class d { static foo() { return 2; } }
class e { static foo() { return 2; } }
class f { static foo() { return 2; } }
assertEquals(2,a.foo());
assertEquals(2,b.foo());
assertEquals(2,c.foo());
assertEquals(2,e.foo());
assertEquals(2,f.foo());
}
try {
throw 'stuff1';
@ -225,16 +259,18 @@ function f7(a) {
c = 2;
}
assertEquals(1,c);
(function(a,b,c,e) {
// arguments shadowing argument, let, const and var variable
(function(a,b,c,e,f) {
// arguments shadowing argument, let, const, class and var variable
a = 2;
b = 2;
c = 2;
e = 2;
f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
// var variable shadowing var variable
var d = 2;
})(1,1);
@ -243,6 +279,7 @@ function f7(a) {
assertEquals(1,c);
assertEquals(1,d);
assertEquals(1,e);
assertEquals(1,f.foo());
}
f7(1);
@ -253,19 +290,23 @@ function f8() {
var let_accessors = [];
var var_accessors = [];
var const_accessors = [];
var class_accessors = [];
for (var i = 0; i < 10; i++) {
let x = i;
var y = i;
const z = i;
class a { static foo() { return x; } }
let_accessors[i] = function() { return x; }
var_accessors[i] = function() { return y; }
const_accessors[i] = function() { return z; }
class_accessors[i] = function() { return a; }
}
for (var j = 0; j < 10; j++) {
y = j + 10;
assertEquals(j, let_accessors[j]());
assertEquals(y, var_accessors[j]());
assertEquals(j, const_accessors[j]());
assertEquals(j, class_accessors[j]().foo());
}
}
f8();

View File

@ -81,7 +81,11 @@ var letbinds = [ "let x;",
"const x = function() {};",
"const x = 2, y = 3;",
"const y = 4, x = 5;",
"class x { }",
];
function forCompatible(bind) {
return !bind.startsWith('class');
}
var varbinds = [ "var x;",
"var x = 0;",
"var x = undefined;",
@ -103,7 +107,9 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(varbinds[v] + '{' + letbinds[l] + '}');
TestNoConflict('{' + letbinds[l] + '}' + varbinds[v]);
// For loop.
TestConflict('for (' + letbinds[l] + '0;) {' + varbinds[v] + '}');
if (forCompatible(letbinds[l])) {
TestConflict('for (' + letbinds[l] + '0;) {' + varbinds[v] + '}');
}
TestNoConflict('for (' + varbinds[v] + '0;) {' + letbinds[l] + '}');
}
@ -116,8 +122,12 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(letbinds[l] + '{ ' + letbinds[k] + '}');
TestNoConflict('{' + letbinds[k] +'} ' + letbinds[l]);
// For loop.
TestNoConflict('for (' + letbinds[l] + '0;) {' + letbinds[k] + '}');
TestNoConflict('for (' + letbinds[k] + '0;) {' + letbinds[l] + '}');
if (forCompatible(letbinds[l])) {
TestNoConflict('for (' + letbinds[l] + '0;) {' + letbinds[k] + '}');
}
if (forCompatible(letbinds[k])) {
TestNoConflict('for (' + letbinds[k] + '0;) {' + letbinds[l] + '}');
}
}
// Test conflicting function/let bindings.
@ -130,7 +140,9 @@ for (var l = 0; l < letbinds.length; ++l) {
TestNoConflict(funbind + '{' + letbinds[l] + '}');
TestNoConflict('{' + letbinds[l] + '}' + funbind);
// For loop.
TestNoConflict('for (' + letbinds[l] + '0;) {' + funbind + '}');
if (forCompatible(letbinds[l])) {
TestNoConflict('for (' + letbinds[l] + '0;) {' + funbind + '}');
}
// Test conflicting parameter/let bindings.
TestConflict('(function(x) {' + letbinds[l] + '})();');

View File

@ -33,17 +33,20 @@
let x;
let y = 2;
const z = 4;
class c { static foo() { return 1; } }
// Block local
{
let y;
let x = 3;
const z = 5;
class c { static foo() { return 2; } }
}
assertEquals(undefined, x);
assertEquals(2,y);
assertEquals(4,z);
assertEquals(1, c.foo());
if (true) {
let y;
@ -106,6 +109,16 @@ TestLocalDoesNotThrow("for (;false;) var x;");
TestLocalDoesNotThrow("switch (true) { case true: var x; }");
TestLocalDoesNotThrow("switch (true) { default: var x; }");
// Test class declarations with initialisers in statement positions.
TestLocalThrows("if (true) class x { };", SyntaxError);
TestLocalThrows("if (true) {} else class x { };", SyntaxError);
TestLocalThrows("do class x { }; while (false)", SyntaxError);
TestLocalThrows("while (false) class x { };", SyntaxError);
TestLocalThrows("label: class x { };", SyntaxError);
TestLocalThrows("for (;false;) class x { };", SyntaxError);
TestLocalDoesNotThrow("switch (true) { case true: class x { }; }");
TestLocalDoesNotThrow("switch (true) { default: class x { }; }");
// Test that redeclarations of functions are only allowed in outermost scope.
TestLocalThrows("{ let f; var f; }");
TestLocalThrows("{ var f; let f; }");
@ -113,9 +126,13 @@ TestLocalThrows("{ function f() {} let f; }");
TestLocalThrows("{ let f; function f() {} }");
TestLocalThrows("{ function f() {} var f; }");
TestLocalThrows("{ var f; function f() {} }");
TestLocalThrows("{ function f() {} class f {} }");
TestLocalThrows("{ class f {}; function f() {} }");
TestLocalThrows("{ function f() {} function f() {} }");
TestLocalThrows("function f() {} let f;");
TestLocalThrows("let f; function f() {}");
TestLocalThrows("function f() {} class f {}");
TestLocalThrows("class f {}; function f() {}");
TestLocalDoesNotThrow("function arg() {}");
TestLocalDoesNotThrow("function f() {} var f;");
TestLocalDoesNotThrow("var f; function f() {}");

View File

@ -70,6 +70,7 @@ TestAll('x += 1; let x;');
TestAll('++x; let x;');
TestAll('x++; let x;');
TestAll('let y = x; const x = 1;');
TestAll('let y = x; class x {}');
TestAll('f(); let x; function f() { return x + 1; }');
TestAll('f(); let x; function f() { x = 1; }');
@ -77,6 +78,7 @@ TestAll('f(); let x; function f() { x += 1; }');
TestAll('f(); let x; function f() { ++x; }');
TestAll('f(); let x; function f() { x++; }');
TestAll('f(); const x = 1; function f() { return x; }');
TestAll('f(); class x { }; function f() { return x; }');
TestAll('f()(); let x; function f() { return function() { return x + 1; } }');
TestAll('f()(); let x; function f() { return function() { x = 1; } }');
@ -84,22 +86,23 @@ TestAll('f()(); let x; function f() { return function() { x += 1; } }');
TestAll('f()(); let x; function f() { return function() { ++x; } }');
TestAll('f()(); let x; function f() { return function() { x++; } }');
TestAll('f()(); const x = 1; function f() { return function() { return x; } }');
TestAll('f()(); class x { }; function f() { return function() { return x; } }');
for (var kw of ['let', 'const']) {
for (var kw of ['let x = 2', 'const x = 2', 'class x { }']) {
// Use before initialization with a dynamic lookup.
TestAll(`eval("x"); ${kw} x = 2;`);
TestAll(`eval("x + 1;"); ${kw} x = 2;`);
TestAll(`eval("x = 1;"); ${kw} x = 2;`);
TestAll(`eval("x += 1;"); ${kw} x = 2;`);
TestAll(`eval("++x;"); ${kw} x = 2;`);
TestAll(`eval("x++;"); ${kw} x = 2;`);
TestAll(`eval("x"); ${kw};`);
TestAll(`eval("x + 1;"); ${kw};`);
TestAll(`eval("x = 1;"); ${kw};`);
TestAll(`eval("x += 1;"); ${kw};`);
TestAll(`eval("++x;"); ${kw};`);
TestAll(`eval("x++;"); ${kw};`);
// Use before initialization with check for eval-shadowed bindings.
TestAll(`function f() { eval("var y = 2;"); x + 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x = 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x += 1; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); ++x; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x++; }; f(); ${kw} x = 2;`);
TestAll(`function f() { eval("var y = 2;"); x + 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x = 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x += 1; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); ++x; }; f(); ${kw};`);
TestAll(`function f() { eval("var y = 2;"); x++; }; f(); ${kw};`);
}
// Test that variables introduced by function declarations are created and

View File

@ -47,15 +47,19 @@ function f2(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
assertEquals(1, eval('one'));
assertEquals(2, eval('x'));
assertEquals(3, eval('y'));
assertEquals(4, eval('z'));
assertEquals(5, eval('u'));
assertEquals(6, eval('v'));
assertEquals(7, eval('a.foo()'));
assertEquals(8, eval('b.foo()'));
}
}
@ -66,15 +70,19 @@ function f3(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
assertEquals(1, one);
assertEquals(2, x);
assertEquals(3, y);
assertEquals(4, z);
assertEquals(5, u);
assertEquals(6, v);
assertEquals(7, a.foo());
assertEquals(8, b.foo());
}
}
for (var j = 0; j < 5; ++j) f3(1);
@ -89,9 +97,11 @@ function f4(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
function f() {
assertEquals(1, eval('one'));
assertEquals(2, eval('x'));
@ -99,6 +109,8 @@ function f4(one) {
assertEquals(4, eval('z'));
assertEquals(5, eval('u'));
assertEquals(6, eval('v'));
assertEquals(7, eval('a.foo()'));
assertEquals(8, eval('b.foo()'));
}
f();
}
@ -111,9 +123,11 @@ function f5(one) {
var x = one + 1;
let y = one + 2;
const u = one + 4;
class a { static foo() { return one + 6; } }
{
let z = one + 3;
const v = one + 5;
class b { static foo() { return one + 7; } }
function f() {
assertEquals(1, one);
assertEquals(2, x);
@ -121,6 +135,8 @@ function f5(one) {
assertEquals(4, z);
assertEquals(5, u);
assertEquals(6, v);
assertEquals(7, a.foo());
assertEquals(8, b.foo());
}
f();
}
@ -147,25 +163,43 @@ function f7(a) {
var c = 1;
var d = 1;
const e = 1;
{ // let variables shadowing argument, let, const and var variables
class f { static foo() { return 1; } }
{ // let variables shadowing argument, let, const, class and var variables
let a = 2;
let b = 2;
let c = 2;
let e = 2;
let f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
}
{ // const variables shadowing argument, let, const and var variables
const a = 2;
const b = 2;
const c = 2;
const e = 2;
const f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
}
{ // class variables shadowing argument, let, const and var variables
class a { static foo() { return 2; } }
class b { static foo() { return 2; } }
class c { static foo() { return 2; } }
class d { static foo() { return 2; } }
class e { static foo() { return 2; } }
class f { static foo() { return 2; } }
assertEquals(2,a.foo());
assertEquals(2,b.foo());
assertEquals(2,c.foo());
assertEquals(2,e.foo());
assertEquals(2,f.foo());
}
try {
throw 'stuff1';
@ -223,16 +257,18 @@ function f7(a) {
c = 2;
}
assertEquals(1,c);
(function(a,b,c,e) {
// arguments shadowing argument, let, const and var variable
(function(a,b,c,e,f) {
// arguments shadowing argument, let, const, class and var variable
a = 2;
b = 2;
c = 2;
e = 2;
f = 2;
assertEquals(2,a);
assertEquals(2,b);
assertEquals(2,c);
assertEquals(2,e);
assertEquals(2,f);
// var variable shadowing var variable
var d = 2;
})(1,1);
@ -241,6 +277,7 @@ function f7(a) {
assertEquals(1,c);
assertEquals(1,d);
assertEquals(1,e);
assertEquals(1,f.foo());
}
f7(1);
@ -251,19 +288,23 @@ function f8() {
var let_accessors = [];
var var_accessors = [];
var const_accessors = [];
var class_accessors = [];
for (var i = 0; i < 10; i++) {
let x = i;
var y = i;
const z = i;
class a { static foo() { return x; } }
let_accessors[i] = function() { return x; }
var_accessors[i] = function() { return y; }
const_accessors[i] = function() { return z; }
class_accessors[i] = function() { return a; }
}
for (var j = 0; j < 10; j++) {
y = j + 10;
assertEquals(j, let_accessors[j]());
assertEquals(y, var_accessors[j]());
assertEquals(j, const_accessors[j]());
assertEquals(j, class_accessors[j]().foo());
}
}
f8();