62572e011e
The enumerable expression in a for-in/of loop is supposed to have a TDZ for any lexically bound names in that loop (there can be more than one with destructuring). This patch accomplishes this with an almost-correct desugaring. The only thing missing is proper debugger support (the let declarations added by the desugaring, while invisible to code due to shadowing, are visible to the debugger). BUG=v8:4210 LOG=n Review URL: https://codereview.chromium.org/1218543003 Cr-Commit-Position: refs/heads/master@{#29396}
77 lines
1.2 KiB
JavaScript
77 lines
1.2 KiB
JavaScript
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
'use strict';
|
|
|
|
// Top-level code
|
|
let s = 0;
|
|
let f = [undefined, undefined, undefined]
|
|
for (const x of [1,2,3]) {
|
|
s += x;
|
|
f[x-1] = function() { return x; }
|
|
}
|
|
assertEquals(6, s);
|
|
assertEquals(1, f[0]());
|
|
assertEquals(2, f[1]());
|
|
assertEquals(3, f[2]());
|
|
|
|
let x = 1;
|
|
s = 0;
|
|
for (const z of [x, x+1, x+2]) {
|
|
s += z;
|
|
}
|
|
assertEquals(6, s);
|
|
|
|
s = 0;
|
|
var q = 1;
|
|
for (const x of [q, q+1, q+2]) {
|
|
s += x;
|
|
}
|
|
assertEquals(6, s);
|
|
|
|
let z = 1;
|
|
s = 0;
|
|
for (const x = 1; z < 2; z++) {
|
|
s += x + z;
|
|
}
|
|
assertEquals(2, s);
|
|
|
|
|
|
s = "";
|
|
for (const x in [1,2,3]) {
|
|
s += x;
|
|
}
|
|
assertEquals("012", s);
|
|
|
|
assertThrows("'use strict'; for (const x in [1,2,3]) { x++ }", TypeError);
|
|
|
|
// Function scope
|
|
(function() {
|
|
let s = 0;
|
|
for (const x of [1,2,3]) {
|
|
s += x;
|
|
}
|
|
assertEquals(6, s);
|
|
|
|
let x = 1;
|
|
s = 0;
|
|
for (const q of [x, x+1, x+2]) {
|
|
s += q;
|
|
}
|
|
assertEquals(6, s);
|
|
|
|
s = 0;
|
|
var q = 1;
|
|
for (const x of [q, q+1, q+2]) {
|
|
s += x;
|
|
}
|
|
assertEquals(6, s);
|
|
|
|
s = "";
|
|
for (const x in [1,2,3]) {
|
|
s += x;
|
|
}
|
|
assertEquals("012", s);
|
|
}());
|