diff --git a/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-global-init.js index 2a13d176d6..896d68fdfe 100644 --- a/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-block.template /*--- -description: Variable binding is set to `undefined` (Block statement in eval code containing a function declaration) +description: Variable binding is left in place by legacy function hoisting (Block statement in eval code containing a function declaration) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,11 +25,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });{ function f() { } }' + }, { restore: true });{ function f() { } }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..b243c84a4a --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-block-decl-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-block.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Block statement in eval code containing a function declaration) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });{ function f() { } }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-global-init.js index 00ea957a05..3f7162529e 100644 --- a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-if-decl-else-decl-a.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in both statement positions in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in both statement positions in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.3 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { } else function _f() {}' + }, { restore: true });if (true) function f() { } else function _f() {}' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..af2ad02575 --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-if-decl-else-decl-a.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { } else function _f() {}' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-global-init.js index 5f7133f00a..4b7657874b 100644 --- a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-if-decl-else-decl-b.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in both statement positions in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in both statement positions in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (false) function _f() {} else function f() { }' + }, { restore: true });if (false) function _f() {} else function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..86b22c6321 --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-if-decl-else-decl-b.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (false) function _f() {} else function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-global-init.js index 43d20ce0f3..04cc9494e8 100644 --- a/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-if-decl-else-stmt.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in the first statement position in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in the first statement position in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { } else ;' + }, { restore: true });if (true) function f() { } else ;' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..93a54c854c --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-if-decl-else-stmt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the first statement position in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { } else ;' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-global-init.js index 00018f0333..84f8eaa7f8 100644 --- a/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-if-decl-no-else.template /*--- -description: Variable binding is set to `undefined` (IfStatement without an else clause in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement without an else clause in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { }' + }, { restore: true });if (true) function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..3a8fb4c2ea --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-if-decl-no-else.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement without an else clause in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-global-init.js index 6162b8fa9d..c921002a53 100644 --- a/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-if-stmt-else-decl.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in the second statement position in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in the second statement position in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (false) ; else function f() { }' + }, { restore: true });if (false) ; else function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..a94cd19098 --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-if-stmt-else-decl.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the second statement position in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (false) ; else function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-global-init.js index 2fcad46604..64f56aa291 100644 --- a/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-switch-case.template /*--- -description: Variable binding is set to `undefined` (Function declaration in the `case` clause of a `switch` statement in eval code) +description: Variable binding is left in place by legacy function hoisting (Function declaration in the `case` clause of a `switch` statement in eval code) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,15 +25,22 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });switch (1) {' + + }, { restore: true });switch (1) {' + ' case 1:' + ' function f() { }' + '}\ ' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..eef493c4ec --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-switch-case-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-switch-case.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Function declaration in the `case` clause of a `switch` statement in eval code) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });switch (1) {' + + ' case 1:' + + ' function f() { }' + + '}\ + ' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-global-init.js b/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-global-init.js index 2648596bd8..663804a3ea 100644 --- a/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/direct-switch-dflt.template /*--- -description: Variable binding is set to `undefined` (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) +description: Variable binding is left in place by legacy function hoisting (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,15 +25,22 @@ Object.defineProperty(fnGlobalObject(), 'f', { eval( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });switch (1) {' + + }, { restore: true });switch (1) {' + ' default:' + ' function f() { }' + '}\ ' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..e00f662b69 --- /dev/null +++ b/test/annexB/language/eval-code/direct/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/direct-switch-dflt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +eval( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });switch (1) {' + + ' default:' + + ' function f() { }' + + '}\ + ' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-global-init.js index e4b70a43b2..cbed95ce73 100644 --- a/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-block.template /*--- -description: Variable binding is set to `undefined` (Block statement in eval code containing a function declaration) +description: Variable binding is left in place by legacy function hoisting (Block statement in eval code containing a function declaration) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,11 +25,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });{ function f() { } }' + }, { restore: true });{ function f() { } }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..30384c147c --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-block-decl-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-block.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Block statement in eval code containing a function declaration) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });{ function f() { } }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-global-init.js index c4bfe800e7..6be3b2cad1 100644 --- a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-if-decl-else-decl-a.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in both statement positions in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in both statement positions in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.3 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { } else function _f() {}' + }, { restore: true });if (true) function f() { } else function _f() {}' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..2b74b79777 --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-a-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-if-decl-else-decl-a.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { } else function _f() {}' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-global-init.js index c5944b8a60..9e5a5e5cb1 100644 --- a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-if-decl-else-decl-b.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in both statement positions in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in both statement positions in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (false) function _f() {} else function f() { }' + }, { restore: true });if (false) function _f() {} else function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..8836f45c6f --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-decl-b-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-if-decl-else-decl-b.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (false) function _f() {} else function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-global-init.js index 380d46bac2..fd2cc3d449 100644 --- a/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-if-decl-else-stmt.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in the first statement position in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in the first statement position in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { } else ;' + }, { restore: true });if (true) function f() { } else ;' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..4e4e14ba9c --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-if-decl-else-stmt-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-if-decl-else-stmt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the first statement position in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { } else ;' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-global-init.js index 7663f96807..624f423290 100644 --- a/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-if-decl-no-else.template /*--- -description: Variable binding is set to `undefined` (IfStatement without an else clause in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement without an else clause in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (true) function f() { }' + }, { restore: true });if (true) function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..d381e308ca --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-if-decl-no-else-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-if-decl-no-else.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement without an else clause in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (true) function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-global-init.js index d78d1c1aa9..e8e7b1519b 100644 --- a/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-if-stmt-else-decl.template /*--- -description: Variable binding is set to `undefined` (IfStatement with a declaration in the second statement position in eval code) +description: Variable binding is left in place by legacy function hoisting (IfStatement with a declaration in the second statement position in eval code) esid: sec-functiondeclarations-in-ifstatement-statement-clauses es6id: B.3.4 flags: [generated, noStrict] @@ -21,17 +21,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -44,11 +34,18 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });if (false) ; else function f() { }' + }, { restore: true });if (false) ; else function f() { }' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..5729a4694b --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-if-stmt-else-decl-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-if-stmt-else-decl.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the second statement position in eval code) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });if (false) ; else function f() { }' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-global-init.js index 8efb7cfe1c..ec8d2097f0 100644 --- a/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-switch-case.template /*--- -description: Variable binding is set to `undefined` (Function declaration in the `case` clause of a `switch` statement in eval code) +description: Variable binding is left in place by legacy function hoisting (Function declaration in the `case` clause of a `switch` statement in eval code) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,15 +25,22 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });switch (1) {' + + }, { restore: true });switch (1) {' + ' case 1:' + ' function f() { }' + '}\ ' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..61c6015687 --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-switch-case-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-switch-case.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Function declaration in the `case` clause of a `switch` statement in eval code) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });switch (1) {' + + ' case 1:' + + ' function f() { }' + + '}\ + ' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-global-init.js b/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-global-init.js index 5f48593b44..a145b0198c 100644 --- a/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-global-init.js +++ b/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-global-init.js @@ -2,7 +2,7 @@ // - src/annex-b-fns/eval-global-existing-global-init.case // - src/annex-b-fns/eval-global/indirect-switch-dflt.template /*--- -description: Variable binding is set to `undefined` (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) +description: Variable binding is left in place by legacy function hoisting (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) esid: sec-web-compat-evaldeclarationinstantiation es6id: B.3.3.3 flags: [generated, noStrict] @@ -12,17 +12,7 @@ info: | [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). - [...] - - 8.1.1.4.18 CreateGlobalFunctionBinding - - [...] - 5. If existingProp is undefined or existingProp.[[Configurable]] is true, - then - [...] - 6. Else, - a. Let desc be the PropertyDescriptor{[[Value]]: V }. + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). [...] ---*/ @@ -35,15 +25,22 @@ Object.defineProperty(fnGlobalObject(), 'f', { (0,eval)( 'var global = fnGlobalObject();\ - assert.sameValue(f, undefined, "binding is initialized to `undefined`");\ + assert.sameValue(f, "x", "binding is not reinitialized");\ \ verifyProperty(global, "f", {\ enumerable: true,\ writable: true,\ configurable: false\ - });switch (1) {' + + }, { restore: true });switch (1) {' + ' default:' + ' function f() { }' + '}\ ' ); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, "f", { + enumerable: true, + writable: true, + configurable: false +}); diff --git a/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js b/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..3ccfd9ddaf --- /dev/null +++ b/test/annexB/language/eval-code/indirect/global-switch-dflt-eval-global-existing-non-enumerable-global-init.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/eval-global/indirect-switch-dflt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Funtion declaration in the `default` clause of a `switch` statement in eval code in the global scope) +esid: sec-web-compat-evaldeclarationinstantiation +es6id: B.3.3.3 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +(0,eval)( + 'var global = fnGlobalObject();\ + assert.sameValue(f, "x", "binding is not reinitialized");\ + \ + verifyProperty(global, "f", {\ + enumerable: false,\ + writable: true,\ + configurable: true\ + }, { restore: true });switch (1) {' + + ' default:' + + ' function f() { }' + + '}\ + ' +); + +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/annexB/language/global-code/block-decl-global-existing-global-init.js b/test/annexB/language/global-code/block-decl-global-existing-global-init.js new file mode 100644 index 0000000000..9b0bdad6c7 --- /dev/null +++ b/test/annexB/language/global-code/block-decl-global-existing-global-init.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/block.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Block statement in the global scope containing a function declaration) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +{ + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/block-decl-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/block-decl-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..3c58d281a6 --- /dev/null +++ b/test/annexB/language/global-code/block-decl-global-existing-non-enumerable-global-init.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/block.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Block statement in the global scope containing a function declaration) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +{ + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-global-init.js b/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-global-init.js new file mode 100644 index 0000000000..4c929b5521 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-global-init.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/if-decl-else-decl-a.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } else function _f() {} + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..b4fc5f1962 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-decl-a-global-existing-non-enumerable-global-init.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/if-decl-else-decl-a.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } else function _f() {} + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-global-init.js b/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-global-init.js new file mode 100644 index 0000000000..f8381f9905 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-global-init.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/if-decl-else-decl-b.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +if (false) function _f() {} else function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..17f825747b --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-decl-b-global-existing-non-enumerable-global-init.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/if-decl-else-decl-b.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in both statement positions in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +if (false) function _f() {} else function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-stmt-global-existing-global-init.js b/test/annexB/language/global-code/if-decl-else-stmt-global-existing-global-init.js new file mode 100644 index 0000000000..1d6b9f35a3 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-stmt-global-existing-global-init.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/if-decl-else-stmt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the first statement position in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } else ; + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/if-decl-else-stmt-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/if-decl-else-stmt-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..cbaccf7c42 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-else-stmt-global-existing-non-enumerable-global-init.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/if-decl-else-stmt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the first statement position in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } else ; + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/if-decl-no-else-global-existing-global-init.js b/test/annexB/language/global-code/if-decl-no-else-global-existing-global-init.js new file mode 100644 index 0000000000..f3b94130fd --- /dev/null +++ b/test/annexB/language/global-code/if-decl-no-else-global-existing-global-init.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/if-decl-no-else.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement without an else clause in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/if-decl-no-else-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/if-decl-no-else-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..f3767e6014 --- /dev/null +++ b/test/annexB/language/global-code/if-decl-no-else-global-existing-non-enumerable-global-init.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/if-decl-no-else.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement without an else clause in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +if (true) function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/if-stmt-else-decl-global-existing-global-init.js b/test/annexB/language/global-code/if-stmt-else-decl-global-existing-global-init.js new file mode 100644 index 0000000000..7c3cfcd259 --- /dev/null +++ b/test/annexB/language/global-code/if-stmt-else-decl-global-existing-global-init.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/if-stmt-else-decl.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the second statement position in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +if (false) ; else function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/if-stmt-else-decl-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/if-stmt-else-decl-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..6a1a8b4cb5 --- /dev/null +++ b/test/annexB/language/global-code/if-stmt-else-decl-global-existing-non-enumerable-global-init.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/if-stmt-else-decl.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (IfStatement with a declaration in the second statement position in the global scope) +esid: sec-functiondeclarations-in-ifstatement-statement-clauses +es6id: B.3.4 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + The following rules for IfStatement augment those in 13.6: + + IfStatement[Yield, Return]: + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else Statement[?Yield, ?Return] + if ( Expression[In, ?Yield] ) Statement[?Yield, ?Return] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] else FunctionDeclaration[?Yield] + if ( Expression[In, ?Yield] ) FunctionDeclaration[?Yield] + + + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +if (false) ; else function f() { return 'inner declaration'; } + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/switch-case-global-existing-global-init.js b/test/annexB/language/global-code/switch-case-global-existing-global-init.js new file mode 100644 index 0000000000..5feed4c3d1 --- /dev/null +++ b/test/annexB/language/global-code/switch-case-global-existing-global-init.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/switch-case.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Function declaration in the `case` clause of a `switch` statement in the global scope) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +switch (1) { + case 1: + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/switch-case-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/switch-case-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..f448c0c18a --- /dev/null +++ b/test/annexB/language/global-code/switch-case-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/switch-case.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Function declaration in the `case` clause of a `switch` statement in the global scope) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +switch (1) { + case 1: + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`); diff --git a/test/annexB/language/global-code/switch-dflt-global-existing-global-init.js b/test/annexB/language/global-code/switch-dflt-global-existing-global-init.js new file mode 100644 index 0000000000..bfccf69376 --- /dev/null +++ b/test/annexB/language/global-code/switch-dflt-global-existing-global-init.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-global-init.case +// - src/annex-b-fns/global/switch-dflt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Funtion declaration in the `default` clause of a `switch` statement in the global scope) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: true, + writable: true, + configurable: false +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}, { restore: true }); +`); + +$262.evalScript(` + +switch (1) { + default: + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/test/annexB/language/global-code/switch-dflt-global-existing-non-enumerable-global-init.js b/test/annexB/language/global-code/switch-dflt-global-existing-non-enumerable-global-init.js new file mode 100644 index 0000000000..c6bd5d862b --- /dev/null +++ b/test/annexB/language/global-code/switch-dflt-global-existing-non-enumerable-global-init.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/annex-b-fns/global-existing-non-enumerable-global-init.case +// - src/annex-b-fns/global/switch-dflt.template +/*--- +description: Variable binding is left in place by legacy function hoisting. CreateGlobalVariableBinding leaves the binding as non-enumerable even if it has the chance to change it to be enumerable. (Funtion declaration in the `default` clause of a `switch` statement in the global scope) +esid: sec-web-compat-globaldeclarationinstantiation +es6id: B.3.3.2 +flags: [generated, noStrict] +includes: [fnGlobalObject.js, propertyHelper.js] +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +---*/ +var global = fnGlobalObject(); +Object.defineProperty(global, 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); + +$262.evalScript(` +assert.sameValue(f, 'x'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +`); + +$262.evalScript(` + +switch (1) { + default: + function f() { return 'inner declaration'; } +} + +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`);