| Index: test/mjsunit/regress/redeclaration-error-types.js
|
| diff --git a/test/mjsunit/regress/redeclaration-error-types.js b/test/mjsunit/regress/redeclaration-error-types.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72e097db5707c06c5f9eea9f5a4cc1c227c66515
|
| --- /dev/null
|
| +++ b/test/mjsunit/regress/redeclaration-error-types.js
|
| @@ -0,0 +1,145 @@
|
| +// 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.
|
| +
|
| +
|
| +function doTest(scripts, expectedError) {
|
| + var realm = Realm.create();
|
| +
|
| + for (var i = 0; i < scripts.length - 1; i++) {
|
| + Realm.eval(realm, scripts[i]);
|
| + }
|
| + assertThrows(function() {
|
| + Realm.eval(realm, scripts[scripts.length - 1]);
|
| + }, Realm.eval(realm, expectedError));
|
| +
|
| + Realm.dispose(realm);
|
| +}
|
| +
|
| +var tests = [
|
| + {
|
| + // ES#sec-globaldeclarationinstantiation 5.a:
|
| + // If envRec.HasVarDeclaration(name) is true, throw a SyntaxError
|
| + // exception.
|
| + scripts: [
|
| + "var a;",
|
| + "let a;",
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-globaldeclarationinstantiation 6.a:
|
| + // If envRec.HasLexicalDeclaration(name) is true, throw a SyntaxError
|
| + // exception.
|
| + scripts: [
|
| + "let a;",
|
| + "var a;",
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-globaldeclarationinstantiation 5.b:
|
| + // If envRec.HasLexicalDeclaration(name) is true, throw a SyntaxError
|
| + // exception.
|
| + scripts: [
|
| + "let a;",
|
| + "let a;",
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 5.a.i.1:
|
| + // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError
|
| + // exception.
|
| + scripts: [
|
| + 'let a; eval("var a;");',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 5.a.i.1:
|
| + // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError
|
| + // exception.
|
| + scripts: [
|
| + 'let a; eval("function a() {}");',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i:
|
| + // Throw a SyntaxError exception.
|
| + scripts: [
|
| + '(function() { let a; eval("var a;"); })();',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i:
|
| + // Throw a SyntaxError exception.
|
| + scripts: [
|
| + '(function() { let a; eval("function a() {}"); })();',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-globaldeclarationinstantiation 5.d:
|
| + // If hasRestrictedGlobal is true, throw a SyntaxError exception.
|
| + scripts: [
|
| + 'let NaN;',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| + {
|
| + // ES#sec-globaldeclarationinstantiation 5.d:
|
| + // If hasRestrictedGlobal is true, throw a SyntaxError exception.
|
| + scripts: [
|
| + 'function NaN() {}',
|
| + ],
|
| + expectedError: "SyntaxError",
|
| + },
|
| +
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b:
|
| + // If fnDefinable is false, throw a TypeError exception.
|
| + scripts: [
|
| + 'eval("function NaN() {}");',
|
| + ],
|
| + expectedError: "TypeError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b:
|
| + // If fnDefinable is false, throw a TypeError exception.
|
| + scripts: [
|
| + `
|
| + let a;
|
| + try {
|
| + eval("function a() {}");
|
| + } catch (e) {}
|
| + eval("function NaN() {}");
|
| + `,
|
| + ],
|
| + expectedError: "TypeError",
|
| + },
|
| + {
|
| + // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b:
|
| + // If fnDefinable is false, throw a TypeError exception.
|
| + scripts: [
|
| + `
|
| + eval("
|
| + function f() {
|
| + function b() {
|
| + (0, eval)('function NaN() {}');
|
| + }
|
| + b();
|
| + }
|
| + f();
|
| + ");
|
| + `.replace(/"/g, '`'),
|
| + ],
|
| + expectedError: "TypeError",
|
| + },
|
| +];
|
| +
|
| +tests.forEach(function(test) {
|
| + doTest(test.scripts, test.expectedError);
|
| +});
|
|
|