// 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",
]);
