Add templated tests for new proposed Annex B semantics

These tests are againt a proposed fix for
https://github.com/tc39/ecma262/issues/753

They seem to pass in V8, JSC and SpiderMonkey, though ChakraCore
hews slightly closer to the previous specification.
This commit is contained in:
Daniel Ehrenberg 2017-04-12 13:52:18 +02:00 committed by Rick Waldron
parent e845e21bf5
commit 89a75a90f6
4 changed files with 151 additions and 12 deletions

View File

@ -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,

View File

@ -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
});

View File

@ -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
});
`);

View File

@ -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
});
`);