mirror of
https://github.com/tc39/test262.git
synced 2025-07-17 02:54:37 +02:00
Add tests for Nullish Coalesce Expression
This commit is contained in:
parent
6b66b82d88
commit
ec41c1a417
@ -0,0 +1,58 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Abrupt completions are also a Short circuit and prevent evaluation of the right-side expressions
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
function poison() {
|
||||||
|
throw new Test262Error('poison handled');
|
||||||
|
}
|
||||||
|
|
||||||
|
function morePoison() {
|
||||||
|
throw 'poison!!!!';
|
||||||
|
}
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
undefined ?? poison() ?? morePoison();
|
||||||
|
}, 'undefined ?? poison() ?? morePoison();');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
null ?? poison() ?? morePoison();
|
||||||
|
}, 'null ?? poison() ?? morePoison();');
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
poison() ?? morePoison();
|
||||||
|
}, 'poison() ?? morePoison();');
|
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Cannot immediately contain, or be contained within, an && or || operation.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
features: [coalesce-expression]
|
||||||
|
negative:
|
||||||
|
phase: early
|
||||||
|
type: SyntaxError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
0 && 0 ?? true;
|
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Cannot immediately contain, or be contained within, an && or || operation.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
features: [coalesce-expression]
|
||||||
|
negative:
|
||||||
|
phase: early
|
||||||
|
type: SyntaxError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
0 || 0 ?? true;
|
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
If the CoalesceExpressionHead is undefined or null, follow return the right-side value.
|
||||||
|
Otherwise, return the left-side value.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
features: [coalesce-expression]
|
||||||
|
negative:
|
||||||
|
phase: early
|
||||||
|
type: SyntaxError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
0 ?? 0 && true;
|
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
If the CoalesceExpressionHead is undefined or null, follow return the right-side value.
|
||||||
|
Otherwise, return the left-side value.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
features: [coalesce-expression]
|
||||||
|
negative:
|
||||||
|
phase: early
|
||||||
|
type: SyntaxError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
0 ?? 0 || true;
|
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
CoalesceExpression is chainable with the BitwiseANDExpression
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = null ?? 42 & 43;
|
||||||
|
assert.sameValue(x, 42, 'null ?? 42 & 43');
|
||||||
|
|
||||||
|
x = undefined ?? 42 & 43;
|
||||||
|
assert.sameValue(x, 42, 'null ?? 42 & 43');
|
||||||
|
|
||||||
|
x = false ?? 42 & 43;
|
||||||
|
assert.sameValue(x, false, 'false ?? 42 & 43');
|
||||||
|
|
||||||
|
x = true ?? 42 & 43;
|
||||||
|
assert.sameValue(x, true, 'true ?? 42 & 43');
|
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
CoalesceExpression is chainable with the BitwiseORExpression
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = null ?? 1 | 42;
|
||||||
|
assert.sameValue(x, 43, 'null ?? 1 | 42');
|
||||||
|
|
||||||
|
x = undefined ?? 1 | 42;
|
||||||
|
assert.sameValue(x, 43, 'null ?? 1 | 42');
|
||||||
|
|
||||||
|
x = false ?? 1 | 42;
|
||||||
|
assert.sameValue(x, false, 'false ?? 1 | 42');
|
||||||
|
|
||||||
|
x = true ?? 1 | 42;
|
||||||
|
assert.sameValue(x, true, 'true ?? 1 | 42');
|
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
CoalesceExpression is chainable with the BitwiseXORExpression
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = null ?? 1 ^ 42;
|
||||||
|
assert.sameValue(x, 43, 'null ?? 1 ^ 42');
|
||||||
|
|
||||||
|
x = undefined ?? 1 ^ 42;
|
||||||
|
assert.sameValue(x, 43, 'null ?? 1 ^ 42');
|
||||||
|
|
||||||
|
x = false ?? 1 ^ 42;
|
||||||
|
assert.sameValue(x, false, 'false ?? 1 ^ 42');
|
||||||
|
|
||||||
|
x = true ?? 1 ^ 42;
|
||||||
|
assert.sameValue(x, true, 'true ?? 1 ^ 42');
|
50
test/language/expressions/coalesce/chainable.js
Normal file
50
test/language/expressions/coalesce/chainable.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
If the CoalesceExpressionHead is undefined or null, follow return the right-side value.
|
||||||
|
Otherwise, return the left-side value.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = null ?? undefined ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'null ?? undefined ?? 42');
|
||||||
|
|
||||||
|
x = undefined ?? null ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'undefined ?? null ?? 42');
|
||||||
|
|
||||||
|
x = null ?? null ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'null ?? null ?? 42');
|
||||||
|
|
||||||
|
x = undefined ?? undefined ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'null ?? null ?? 42');
|
49
test/language/expressions/coalesce/follows-null.js
Normal file
49
test/language/expressions/coalesce/follows-null.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
If the CoalesceExpressionHead is null, follow return the right-side eval.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = null ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'null ?? 42');
|
||||||
|
|
||||||
|
x = null ?? undefined;
|
||||||
|
assert.sameValue(x, undefined, 'null ?? undefined');
|
||||||
|
|
||||||
|
x = null ?? null;
|
||||||
|
assert.sameValue(x, null, 'null ?? null');
|
||||||
|
|
||||||
|
x = null ?? false;
|
||||||
|
assert.sameValue(x, false, 'null ?? false');
|
49
test/language/expressions/coalesce/follows-undefined.js
Normal file
49
test/language/expressions/coalesce/follows-undefined.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
If the CoalesceExpressionHead is undefined, follow return the right-side eval.
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined ?? 42;
|
||||||
|
assert.sameValue(x, 42, 'undefined ?? 42');
|
||||||
|
|
||||||
|
x = undefined ?? undefined;
|
||||||
|
assert.sameValue(x, undefined, 'undefined ?? undefined');
|
||||||
|
|
||||||
|
x = undefined ?? null;
|
||||||
|
assert.sameValue(x, null, 'undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined ?? false;
|
||||||
|
assert.sameValue(x, false, 'undefined ?? false');
|
81
test/language/expressions/coalesce/short-circuit-number-0.js
Normal file
81
test/language/expressions/coalesce/short-circuit-number-0.js
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (0)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? 1;
|
||||||
|
assert.sameValue(x, 0, '0 ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? null;
|
||||||
|
assert.sameValue(x, 0, '0 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? undefined;
|
||||||
|
assert.sameValue(x, 0, '0 ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, 0, '0 ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, 0, '0 ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? null ?? null;
|
||||||
|
assert.sameValue(x, 0, '0 ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, 0, '0 ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? 0 ?? null;
|
||||||
|
assert.sameValue(x, 0, 'null ?? 0 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? 0 ?? undefined;
|
||||||
|
assert.sameValue(x, 0, 'null ?? 0 ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 0 ?? null;
|
||||||
|
assert.sameValue(x, 0, 'undefined ?? 0 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 0 ?? undefined;
|
||||||
|
assert.sameValue(x, 0, 'undefined ?? 0 ?? undefined');
|
@ -0,0 +1,81 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (42)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? 1;
|
||||||
|
assert.sameValue(x, 42, '42 ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? null;
|
||||||
|
assert.sameValue(x, 42, '42 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? undefined;
|
||||||
|
assert.sameValue(x, 42, '42 ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, 42, '42 ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, 42, '42 ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? null ?? null;
|
||||||
|
assert.sameValue(x, 42, '42 ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, 42, '42 ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? 42 ?? null;
|
||||||
|
assert.sameValue(x, 42, 'null ?? 42 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? 42 ?? undefined;
|
||||||
|
assert.sameValue(x, 42, 'null ?? 42 ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 42 ?? null;
|
||||||
|
assert.sameValue(x, 42, 'undefined ?? 42 ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 42 ?? undefined;
|
||||||
|
assert.sameValue(x, 42, 'undefined ?? 42 ?? undefined');
|
@ -0,0 +1,82 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (the empty string)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
var str = '';
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? 1;
|
||||||
|
assert.sameValue(x, str, 'str ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? str ?? null;
|
||||||
|
assert.sameValue(x, str, 'null ?? str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'null ?? str ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? str ?? null;
|
||||||
|
assert.sameValue(x, str, 'undefined ?? str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'undefined ?? str ?? undefined');
|
@ -0,0 +1,81 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (false)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? 1;
|
||||||
|
assert.sameValue(x, false, 'false ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? null;
|
||||||
|
assert.sameValue(x, false, 'false ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? undefined;
|
||||||
|
assert.sameValue(x, false, 'false ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, false, 'false ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, false, 'false ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? null ?? null;
|
||||||
|
assert.sameValue(x, false, 'false ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, false, 'false ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? false ?? null;
|
||||||
|
assert.sameValue(x, false, 'null ?? false ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? false ?? undefined;
|
||||||
|
assert.sameValue(x, false, 'null ?? false ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? false ?? null;
|
||||||
|
assert.sameValue(x, false, 'undefined ?? false ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? false ?? undefined;
|
||||||
|
assert.sameValue(x, false, 'undefined ?? false ?? undefined');
|
@ -0,0 +1,89 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (object)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
var obj = {
|
||||||
|
toString() {
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
valueOf() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? 1;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? null;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? undefined;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? null ?? null;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = obj ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, obj, 'obj ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? obj ?? null;
|
||||||
|
assert.sameValue(x, obj, 'null ?? obj ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? obj ?? undefined;
|
||||||
|
assert.sameValue(x, obj, 'null ?? obj ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? obj ?? null;
|
||||||
|
assert.sameValue(x, obj, 'undefined ?? obj ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? obj ?? undefined;
|
||||||
|
assert.sameValue(x, obj, 'undefined ?? obj ?? undefined');
|
@ -0,0 +1,82 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (string)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
var str = 'undefined';
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? 1;
|
||||||
|
assert.sameValue(x, str, 'str ?? 1');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? null ?? null;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = str ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'str ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? str ?? null;
|
||||||
|
assert.sameValue(x, str, 'null ?? str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'null ?? str ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? str ?? null;
|
||||||
|
assert.sameValue(x, str, 'undefined ?? str ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? str ?? undefined;
|
||||||
|
assert.sameValue(x, str, 'undefined ?? str ?? undefined');
|
@ -0,0 +1,82 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (Symbol)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
var s = Symbol();
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? 1;
|
||||||
|
assert.sameValue(x, s, 's ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? null;
|
||||||
|
assert.sameValue(x, s, 's ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? undefined;
|
||||||
|
assert.sameValue(x, s, 's ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, s, 's ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, s, 's ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? null ?? null;
|
||||||
|
assert.sameValue(x, s, 's ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = s ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, s, 's ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? s ?? null;
|
||||||
|
assert.sameValue(x, s, 'null ?? s ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? s ?? undefined;
|
||||||
|
assert.sameValue(x, s, 'null ?? s ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? s ?? null;
|
||||||
|
assert.sameValue(x, s, 'undefined ?? s ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? s ?? undefined;
|
||||||
|
assert.sameValue(x, s, 'undefined ?? s ?? undefined');
|
@ -0,0 +1,81 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit if the CoalesceExpressionHead is not undefined or null (true)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? 1;
|
||||||
|
assert.sameValue(x, true, 'true ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? null;
|
||||||
|
assert.sameValue(x, true, 'true ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? undefined;
|
||||||
|
assert.sameValue(x, true, 'true ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? null ?? undefined;
|
||||||
|
assert.sameValue(x, true, 'true ?? null ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? undefined ?? null;
|
||||||
|
assert.sameValue(x, true, 'true ?? undefined ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? null ?? null;
|
||||||
|
assert.sameValue(x, true, 'true ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? undefined ?? undefined;
|
||||||
|
assert.sameValue(x, true, 'true ?? null ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? true ?? null;
|
||||||
|
assert.sameValue(x, true, 'null ?? true ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? true ?? undefined;
|
||||||
|
assert.sameValue(x, true, 'null ?? true ?? undefined');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? true ?? null;
|
||||||
|
assert.sameValue(x, true, 'undefined ?? true ?? null');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? true ?? undefined;
|
||||||
|
assert.sameValue(x, true, 'undefined ?? true ?? undefined');
|
@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
Short circuit can prevent evaluation of the right-side expressions
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
Runtime Semantics: Evaluation
|
||||||
|
|
||||||
|
CoalesceExpression:CoalesceExpressionHead??BitwiseORExpression
|
||||||
|
|
||||||
|
1. Let lref be the result of evaluating CoalesceExpressionHead.
|
||||||
|
2. Let lval be ? GetValue(lref).
|
||||||
|
3. If lval is undefined or null,
|
||||||
|
a. Let rref be the result of evaluating BitwiseORExpression.
|
||||||
|
b. Return ? GetValue(rref).
|
||||||
|
4. Otherwise, return lval.
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
function poison() {
|
||||||
|
throw new Test262Error('should not evaluate poison');
|
||||||
|
}
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 42 ?? undefined ?? poison();
|
||||||
|
assert.sameValue(x, 42);
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? undefined ?? poison();
|
||||||
|
assert.sameValue(x, 42);
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? 42 ?? poison();
|
||||||
|
assert.sameValue(x, 42);
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 42 ?? poison();
|
||||||
|
assert.sameValue(x, 42);
|
19
test/language/expressions/coalesce/tco-cond.js
Normal file
19
test/language/expressions/coalesce/tco-cond.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
description: Expression is a candidate for tail-call optimization.
|
||||||
|
esid: sec-static-semantics-hascallintailposition
|
||||||
|
flags: [onlyStrict]
|
||||||
|
features: [tail-call-optimization, coalesce-expression]
|
||||||
|
includes: [tcoHelper.js]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var callCount = 0;
|
||||||
|
(function f(n) {
|
||||||
|
if (n === 0) {
|
||||||
|
callCount += 1
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return f(n - 1) ?? false;
|
||||||
|
}($MAX_ITERATIONS));
|
||||||
|
assert.sameValue(callCount, 1);
|
19
test/language/expressions/coalesce/tco-pos-null.js
Normal file
19
test/language/expressions/coalesce/tco-pos-null.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
description: Expression is a candidate for tail-call optimization.
|
||||||
|
esid: sec-static-semantics-hascallintailposition
|
||||||
|
flags: [onlyStrict]
|
||||||
|
features: [tail-call-optimization, coalesce-expression]
|
||||||
|
includes: [tcoHelper.js]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var callCount = 0;
|
||||||
|
(function f(n) {
|
||||||
|
if (n === 0) {
|
||||||
|
callCount += 1
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return null ?? f(n - 1);
|
||||||
|
}($MAX_ITERATIONS));
|
||||||
|
assert.sameValue(callCount, 1);
|
19
test/language/expressions/coalesce/tco-pos-undefined.js
Normal file
19
test/language/expressions/coalesce/tco-pos-undefined.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
description: Expression is a candidate for tail-call optimization.
|
||||||
|
esid: sec-static-semantics-hascallintailposition
|
||||||
|
flags: [onlyStrict]
|
||||||
|
features: [tail-call-optimization, coalesce-expression]
|
||||||
|
includes: [tcoHelper.js]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var callCount = 0;
|
||||||
|
(function f(n) {
|
||||||
|
if (n === 0) {
|
||||||
|
callCount += 1
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return undefined ?? f(n - 1);
|
||||||
|
}($MAX_ITERATIONS));
|
||||||
|
assert.sameValue(callCount, 1);
|
@ -0,0 +1,73 @@
|
|||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
description: >
|
||||||
|
ShortCircuitExpression in the Conditional Expression (? :)
|
||||||
|
esid: sec-conditional-operator
|
||||||
|
info: |
|
||||||
|
ShortCircuitExpression :
|
||||||
|
LogicalORExpression
|
||||||
|
CoalesceExpression
|
||||||
|
|
||||||
|
CoalesceExpression :
|
||||||
|
CoalesceExpressionHead ?? BitwiseORExpression
|
||||||
|
|
||||||
|
CoalesceExpressionHead :
|
||||||
|
CoalesceExpression
|
||||||
|
BitwiseORExpression
|
||||||
|
|
||||||
|
ConditionalExpression :
|
||||||
|
ShortCircuitExpression
|
||||||
|
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
|
||||||
|
features: [coalesce-expression]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = undefined ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'undefined ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'null ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = undefined ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 42, 'undefined ?? false ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = null ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 42, 'null ?? false ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = false ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 42, 'false ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 0 ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 42, '0 ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = 1 ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, '1 ?? false ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'true ?? false ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = true ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'true ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = '' ?? true ? 0 : 42;
|
||||||
|
assert.sameValue(x, 42, '"" ?? true ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = Symbol() ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'Symbol() ?? false ? 0 : 42');
|
||||||
|
|
||||||
|
x = undefined;
|
||||||
|
x = {} ?? false ? 0 : 42;
|
||||||
|
assert.sameValue(x, 0, 'object ?? false ? 0 : 42');
|
Loading…
x
Reference in New Issue
Block a user