diff options
Diffstat (limited to 'js/src/tests/test262/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js')
-rw-r--r-- | js/src/tests/test262/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/js/src/tests/test262/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js b/js/src/tests/test262/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js new file mode 100644 index 0000000000..3b610f6035 --- /dev/null +++ b/js/src/tests/test262/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js @@ -0,0 +1,77 @@ +// 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", +]); + +reportCompare(0, 0); |