mirror of https://github.com/tc39/test262.git
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
// 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",
|
|
]);
|