| // 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); |
| }); |