Skip to content

Commit

Permalink
Add templated tests for new proposed Annex B semantics
Browse files Browse the repository at this point in the history
These tests are againt a proposed fix for
tc39/ecma262#753

They seem to pass in V8, JSC and SpiderMonkey, though ChakraCore
hews slightly closer to the previous specification.
  • Loading branch information
littledan authored and rwaldron committed May 11, 2018
1 parent e845e21 commit 89a75a9
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 12 deletions.
22 changes: 10 additions & 12 deletions src/annex-b-fns/eval-global-existing-global-init.case
Original file line number Diff line number Diff line change
@@ -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]
---*/

Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
});
49 changes: 49 additions & 0 deletions src/annex-b-fns/global-existing-global-init.case
Original file line number Diff line number Diff line change
@@ -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
});
`);
50 changes: 50 additions & 0 deletions src/annex-b-fns/global-existing-non-enumerable-global-init.case
Original file line number Diff line number Diff line change
@@ -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
});
`);

0 comments on commit 89a75a9

Please sign in to comment.