diff --git a/src/annex-b-fns/eval-global-existing-global-init.case b/src/annex-b-fns/eval-global-existing-global-init.case index 02d9aa778959d92c5cfb5496e54ab8f28ce25e50..0ac273e8e5c018ab5a1717b2b550dde876d0befe 100644 --- a/src/annex-b-fns/eval-global-existing-global-init.case +++ b/src/annex-b-fns/eval-global-existing-global-init.case @@ -1,25 +1,16 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -desc: Variable binding is set to `undefined` +desc: Variable binding is left in place by legacy function hoisting template: eval-global info: | B.3.3.3 Changes to EvalDeclarationInstantiation [...] i. If varEnvRec is a global Environment Record, then - i. Perform ? varEnvRec.CreateGlobalFunctionBinding(F, undefined, true). + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, 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 }. - [...] includes: [fnGlobalObject.js, propertyHelper.js] ---*/ @@ -32,8 +23,15 @@ Object.defineProperty(fnGlobalObject(), 'f', { }); //- before 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 +}, { restore: true }); +//- teardown +assert.sameValue(typeof f, "function"); verifyProperty(global, "f", { enumerable: true, writable: true, diff --git a/src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case b/src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case new file mode 100644 index 0000000000000000000000000000000000000000..4e8484aee4bad24428773c3684666a0582b9d4a9 --- /dev/null +++ b/src/annex-b-fns/eval-global-existing-non-enumerable-global-init.case @@ -0,0 +1,42 @@ +// Copyright (C) 2017 Igalia, S. L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +desc: > + 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. +template: eval-global +info: | + B.3.3.3 Changes to EvalDeclarationInstantiation + + [...] + i. If varEnvRec is a global Environment Record, then + i. Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +includes: [fnGlobalObject.js, propertyHelper.js] +---*/ + +//- setup +Object.defineProperty(fnGlobalObject(), 'f', { + value: 'x', + enumerable: false, + writable: true, + configurable: true +}); +//- before +var global = fnGlobalObject(); +assert.sameValue(f, 'x', "binding is not reinitialized"); + +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}, { restore: true }); +//- teardown +assert.sameValue(typeof f, "function"); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/src/annex-b-fns/global-existing-global-init.case b/src/annex-b-fns/global-existing-global-init.case new file mode 100644 index 0000000000000000000000000000000000000000..b0d7d1eadc5334ae5385dd26ac3c3e364b418a76 --- /dev/null +++ b/src/annex-b-fns/global-existing-global-init.case @@ -0,0 +1,49 @@ +// Copyright (C) 2017 Igalia, S. L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +desc: > + 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. +template: global +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +includes: [fnGlobalObject.js, propertyHelper.js] +---*/ + +//- setup +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(` +//- body +return 'inner declaration'; +//- teardown +`); + +$262.evalScript(` +verifyProperty(global, 'f', { + enumerable: true, + writable: true, + configurable: false +}); +`); diff --git a/src/annex-b-fns/global-existing-non-enumerable-global-init.case b/src/annex-b-fns/global-existing-non-enumerable-global-init.case new file mode 100644 index 0000000000000000000000000000000000000000..c9e97cf9d1f8fa88570e4efacd67ba5b58ad69a5 --- /dev/null +++ b/src/annex-b-fns/global-existing-non-enumerable-global-init.case @@ -0,0 +1,50 @@ +// Copyright (C) 2017 Igalia, S. L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +desc: > + 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. +template: global +info: | + B.3.3.3 Changes to GlobalDeclarationInstantiation + + [...] + Perform ? varEnvRec.CreateGlobalVarBinding(F, true). + [...] + +includes: [fnGlobalObject.js, propertyHelper.js] +---*/ + +//- setup +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(` +//- body +return 'inner declaration'; +//- teardown +`); + +$262.evalScript(` +assert.sameValue(f(), 'inner declaration'); +verifyProperty(global, 'f', { + enumerable: false, + writable: true, + configurable: true +}); +`);