Allow global var-via-eval be declared

See https://github.com/tc39/ecma262/pull/3226
This commit is contained in:
Shu-yu Guo 2024-04-08 15:22:14 -07:00 committed by Philip Chimento
parent 046dff4b33
commit c5a80993cd
4 changed files with 28 additions and 55 deletions

View File

@ -1,21 +0,0 @@
// 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: Let binding collision with existing var declaration that was created for hoisted function.
info: |
[...]
3. For each element name of lexNames, do
a. If env.HasVarDeclaration(name) is true, throw a SyntaxError exception.
flags: [noStrict]
---*/
eval('if (true) { function test262Fn() {} }');
assert.throws(SyntaxError, function() {
$262.evalScript('var x; let test262Fn;');
});
assert.throws(ReferenceError, function() {
x;
}, 'no bindings created');

View File

@ -2,8 +2,10 @@
// 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 strict-mode eval().
description: No let binding collision with existing var declaration due to eval().
info: |
In strict mode:
PerformEval ( x, strictCaller, direct )
[...]
@ -11,7 +13,17 @@ info: |
a. Let lexEnv be NewDeclarativeEnvironment(runningContext's LexicalEnvironment).
[...]
18. If strictEval is true, set varEnv to lexEnv.
flags: [onlyStrict]
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('if (true) { function test262Fn() {} }');

View File

@ -1,30 +0,0 @@
// 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: Let binding collision with existing var declaration that was created via eval().
info: |
[...]
3. For each element name of lexNames, do
a. If env.HasVarDeclaration(name) is true, throw a SyntaxError exception.
flags: [noStrict]
---*/
eval('var test262Var;');
eval('function test262Fn() {}');
assert.throws(SyntaxError, function() {
$262.evalScript('var x; let test262Var;');
}, 'variable');
assert.throws(ReferenceError, function() {
x;
}, 'no bindings created (script shadowing variable)');
assert.throws(SyntaxError, function() {
$262.evalScript('var x; let test262Fn;');
}, 'function');
assert.throws(ReferenceError, function() {
x;
}, 'no bindings created (script shadowing function)');

View File

@ -2,8 +2,10 @@
// 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 strict-mode eval().
description: No let binding collision with existing var declaration due to eval().
info: |
In strict mode:
PerformEval ( x, strictCaller, direct )
[...]
@ -11,7 +13,17 @@ info: |
a. Let lexEnv be NewDeclarativeEnvironment(runningContext's LexicalEnvironment).
[...]
18. If strictEval is true, set varEnv to lexEnv.
flags: [onlyStrict]
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;');