Chromium Code Reviews| Index: test/mjsunit/harmony/block-function-sloppy.js |
| diff --git a/test/mjsunit/harmony/block-function-sloppy.js b/test/mjsunit/harmony/block-function-sloppy.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a26b6b41847efc6700dc5ff2a269cd9f703cb166 |
| --- /dev/null |
| +++ b/test/mjsunit/harmony/block-function-sloppy.js |
| @@ -0,0 +1,226 @@ |
| +// 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. |
| + |
| +// Flags: --harmony-sloppy --no-legacy-const |
| + |
| + |
| +(function TestHoistingToBlock() { |
| + assertEquals(undefined, f); |
| + { |
| + assertEquals(1, f()); |
| + function f() { return 1; } |
| + assertEquals(1, f()); |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestOnlyOneFunction() { |
| + var outer, inner; |
| + { |
| + function f() { return 1; } |
| + inner = f; |
| + } |
| + outer = f; |
| + assertEquals(inner, outer); |
| +})(); |
| + |
| + |
| +(function TestNoInitIf() { |
| + assertEquals(undefined, f); |
| + if (false) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitIf() { |
| + assertEquals(undefined, f); |
| + if (true) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitElse() { |
| + assertEquals(undefined, f); |
| + if (true) { |
| + } else { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitElse() { |
| + assertEquals(undefined, f); |
| + if (false) { |
| + } else { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitWhile() { |
| + assertEquals(undefined, f); |
| + while (false) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitWhile() { |
| + assertEquals(undefined, f); |
| + while (true) { |
| + function f() { return 1; } |
| + break; |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitFor() { |
| + assertEquals(undefined, f); |
| + for (; false; ) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitFor() { |
| + assertEquals(undefined, f); |
| + for (; true; ) { |
| + function f() { return 1; } |
| + break |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitForLet() { |
| + assertEquals(undefined, f); |
| + for (let x; false; ) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitForLet() { |
| + assertEquals(undefined, f); |
| + for (let x = 0; x < 1; x++) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitForIn() { |
| + assertEquals(undefined, f); |
| + for (var k in {}) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitForIn() { |
| + assertEquals(undefined, f); |
| + for (var k in {a: 1}) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitForInLet() { |
| + assertEquals(undefined, f); |
| + for (let k in {}) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitForInLet() { |
| + assertEquals(undefined, f); |
| + for (let k in {a: 1}) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitForOf() { |
| + assertEquals(undefined, f); |
| + for (var v of []) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestNoInitForOf() { |
| + assertEquals(undefined, f); |
| + for (var v of [0]) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoInitForOfLet() { |
| + assertEquals(undefined, f); |
| + for (let v of []) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(undefined, f); |
| +})(); |
| + |
| + |
| +(function TestInitForOfLet() { |
| + assertEquals(undefined, f); |
| + for (let v of [0]) { |
| + function f() { return 1; } |
| + } |
| + assertEquals(1, f()); |
| +})(); |
| + |
| + |
| +(function TestNoVarBindingInCaseOfEarlyError() { |
| + let f = 1; |
| + assertEquals(1, f); |
| + { |
| + assertEquals(2, f()); |
| + function f() { return 2; } |
| + assertEquals(2, f()); |
| + } |
| + assertEquals(1, f); |
| +})(); |
| + |
| + |
| +(function TestCorrectError() { |
| + var ex; |
| + try { |
| + eval(` |
| + function f() { |
| + let x = 1; |
| + { |
| + function x() {} |
| + } |
| + let y = 2; |
| + let y = 3; |
| + } |
| + f(); |
| + `); |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertEquals("Identifier 'y' has already been declared", ex.message); |
|
arv (Not doing code reviews)
2015/07/10 16:37:23
We are reporting 'x' here as I suspected. Will hav
|
| +})(); |