11e8c03f94
This patch adds a UseCounter for each of the following: - Allowing duplicate sloppy-mode block-scoped function declarations in the exact same scope - for-in loops with an initializer The patch also refactors some of the declaration code to clean it up and enable the first counter, and adds additional unit tests to nail down the semantics of edge cases of sloppy-mode block-scoped function declarations. BUG=v8:4693,chromium:579395 LOG=N R=adamk Review URL: https://codereview.chromium.org/1633743003 Cr-Commit-Position: refs/heads/master@{#33650}
81 lines
1.6 KiB
JavaScript
81 lines
1.6 KiB
JavaScript
// Copyright 2016 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-function --nolegacy-const
|
|
|
|
// In sloppy mode we allow function redeclarations within blocks for webcompat.
|
|
(function() {
|
|
assertEquals(undefined, f); // Annex B
|
|
if (true) {
|
|
assertEquals(2, f());
|
|
function f() { return 1 }
|
|
assertEquals(2, f());
|
|
function f() { return 2 }
|
|
assertEquals(2, f());
|
|
}
|
|
assertEquals(2, f()); // Annex B
|
|
})();
|
|
|
|
// Should still fail in strict mode
|
|
assertThrows(`
|
|
(function() {
|
|
"use strict";
|
|
if (true) {
|
|
function f() { return 1 }
|
|
function f() { return 2 }
|
|
}
|
|
})();
|
|
`, SyntaxError);
|
|
|
|
// Conflicts between let and function still throw
|
|
assertThrows(`
|
|
(function() {
|
|
if (true) {
|
|
let f;
|
|
function f() { return 2 }
|
|
}
|
|
})();
|
|
`, SyntaxError);
|
|
|
|
assertThrows(`
|
|
(function() {
|
|
if (true) {
|
|
function f() { return 2 }
|
|
let f;
|
|
}
|
|
})();
|
|
`, SyntaxError);
|
|
|
|
// Conflicts between const and function still throw
|
|
assertThrows(`
|
|
(function() {
|
|
if (true) {
|
|
const f;
|
|
function f() { return 2 }
|
|
}
|
|
})();
|
|
`, SyntaxError);
|
|
|
|
assertThrows(`
|
|
(function() {
|
|
if (true) {
|
|
function f() { return 2 }
|
|
const f;
|
|
}
|
|
})();
|
|
`, SyntaxError);
|
|
|
|
// Annex B redefinition semantics still apply with more blocks
|
|
(function() {
|
|
assertEquals(undefined, f); // Annex B
|
|
if (true) {
|
|
assertEquals(undefined, f);
|
|
{ function f() { return 1 } }
|
|
assertEquals(1, f());
|
|
{ function f() { return 2 } }
|
|
assertEquals(2, f());
|
|
}
|
|
assertEquals(2, f()); // Annex B
|
|
})();
|