From 87e259c6e50c0021b097b680ec0f5f54ee102362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com> Date: Sat, 16 Sep 2017 17:00:56 +0200 Subject: [PATCH] Add replacement tests for destructuring evaluation order with property reference as target --- ...perty-reference-target-evaluation-order.js | 80 +++++++++++++++++++ ...perty-reference-target-evaluation-order.js | 75 +++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js create mode 100644 test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js diff --git a/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js new file mode 100644 index 0000000000..f5ada21f42 --- /dev/null +++ b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js @@ -0,0 +1,80 @@ +// Copyright (C) 2017 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-runtime-semantics-iteratordestructuringassignmentevaluation +description: > + Ensure correct evaluation order when destructuring target is property reference. +info: | + 12.15.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation + + AssignmentElement : DestructuringAssignmentTarget Initializer + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + 2. If iteratorRecord.[[Done]] is false, then + a. Let next be IteratorStep(iteratorRecord.[[Iterator]]). + ... + 3. If iteratorRecord.[[Done]] is true, let value be undefined. + ... + 5. Else, let v be value. + ... + 8. Return ? PutValue(lref, v). +features: [Symbol.iterator] +includes: [compareArray.js] +---*/ + + +var log = []; + +function source() { + log.push("source"); + var iterator = { + next: function() { + log.push("iterator-step"); + return { + get done() { + log.push("iterator-done"); + return true; + }, + get value() { + // Note: This getter shouldn't be called. + log.push("iterator-value"); + } + }; + } + }; + var source = {}; + source[Symbol.iterator] = function() { + log.push("iterator"); + return iterator; + }; + return source; +} +function target() { + log.push("target"); + return target = { + set q(v) { + log.push("set"); + } + }; +} +function targetKey() { + log.push("target-key"); + return { + toString: function() { + log.push("target-key-tostring"); + return "q"; + } + }; +} + +([target()[targetKey()]] = source()); + +assert.compareArray(log, [ + "source", "iterator", + "target", "target-key", "target-key-tostring", + "iterator-step", "iterator-done", + "set", +]); diff --git a/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js new file mode 100644 index 0000000000..81d8a6a728 --- /dev/null +++ b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js @@ -0,0 +1,75 @@ +// Copyright (C) 2017 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-runtime-semantics-keyeddestructuringassignmentevaluation +description: > + Ensure correct evaluation order when destructuring target is property reference. +info: | + 12.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation + + AssignmentProperty : PropertyName : AssignmentElement + + 1. Let name be the result of evaluating PropertyName. + 2. ReturnIfAbrupt(name). + 3. Return the result of performing KeyedDestructuringAssignmentEvaluation of + AssignmentElement with value and name as the arguments. + + 12.15.5.4 Runtime Semantics: KeyedDestructuringAssignmentEvaluation + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + 2. Let v be ? GetV(value, propertyName). + ... + 4. Else, let rhsValue be v. + ... + 7. Return ? PutValue(lref, rhsValue). +includes: [compareArray.js] +---*/ + + +var log = []; + +function source() { + log.push("source"); + return { + get p() { + log.push("get"); + } + }; +} +function target() { + log.push("target"); + return { + set q(v) { + log.push("set"); + } + }; +} +function sourceKey() { + log.push("source-key"); + return { + toString: function() { + log.push("source-key-tostring"); + return "p"; + } + }; +} +function targetKey() { + log.push("target-key"); + return { + toString: function() { + log.push("target-key-tostring"); + return "q"; + } + }; +} + +({[sourceKey()]: target()[targetKey()]} = source()); + +assert.compareArray(log, [ + "source", "source-key", "source-key-tostring", + "target", "target-key", "target-key-tostring", + "get", "set", +]); -- GitLab