| // Copyright (C) 2023 Alexey Shvayka. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-globaldeclarationinstantiation |
| description: No let binding collision with existing var declaration due to eval(). |
| info: | |
| In strict mode: |
| |
| PerformEval ( x, strictCaller, direct ) |
| |
| [...] |
| 16. If direct is true, then |
| a. Let lexEnv be NewDeclarativeEnvironment(runningContext's LexicalEnvironment). |
| [...] |
| 18. If strictEval is true, set varEnv to lexEnv. |
| |
| In sloppy mode: |
| |
| GlobalDeclarationInstantiation ( script, env ) |
| |
| [...] |
| 3. For each element name of lexNames, do |
| a. If env.HasLexicalDeclaration(name) is true, throw a SyntaxError exception. |
| b. Let hasRestrictedGlobal be ? env.HasRestrictedGlobalProperty(name). |
| c. NOTE: Global var and function bindings (except those that are introduced by non-strict direct eval) are non-configurable and are therefore restricted global properties. |
| d. If hasRestrictedGlobal is true, throw a SyntaxError exception. |
| ---*/ |
| |
| eval('var test262Var;'); |
| eval('function test262Fn() {}'); |
| |
| $262.evalScript('let test262Var = 1;'); |
| assert.sameValue(test262Var, 1); |
| |
| $262.evalScript('const test262Fn = 2;'); |
| assert.sameValue(test262Fn, 2); |