tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

keyed-destructuring-property-reference-target-evaluation-order.js (1978B)


      1 // Copyright (C) 2017 André Bargull. All rights reserved.
      2 // This code is governed by the BSD license found in the LICENSE file.
      3 
      4 /*---
      5 esid: sec-runtime-semantics-keyeddestructuringassignmentevaluation
      6 description: >
      7    Ensure correct evaluation order when destructuring target is property reference.
      8 info: |
      9    12.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation
     10 
     11    AssignmentProperty : PropertyName : AssignmentElement
     12 
     13    1. Let name be the result of evaluating PropertyName.
     14    2. ReturnIfAbrupt(name).
     15    3. Return the result of performing KeyedDestructuringAssignmentEvaluation of
     16       AssignmentElement with value and name as the arguments. 
     17 
     18    12.15.5.4 Runtime Semantics: KeyedDestructuringAssignmentEvaluation
     19 
     20    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
     21        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
     22        b. ReturnIfAbrupt(lref).
     23    2. Let v be ? GetV(value, propertyName).
     24    ...
     25    4. Else, let rhsValue be v.
     26    ...
     27    7. Return ? PutValue(lref, rhsValue).
     28 includes: [compareArray.js]
     29 ---*/
     30 
     31 
     32 var log = [];
     33 
     34 function source() {
     35    log.push("source");
     36    return {
     37        get p() {
     38            log.push("get");
     39        }
     40    };
     41 }
     42 function target() {
     43    log.push("target");
     44    return {
     45        set q(v) {
     46            log.push("set");
     47        }
     48    };
     49 }
     50 function sourceKey() {
     51    log.push("source-key");
     52    return {
     53        toString: function() {
     54            log.push("source-key-tostring");
     55            return "p";
     56        }
     57    };
     58 }
     59 function targetKey() {
     60    log.push("target-key");
     61    return {
     62        toString: function() {
     63            log.push("target-key-tostring");
     64            return "q";
     65        }
     66    };
     67 }
     68 
     69 ({[sourceKey()]: target()[targetKey()]} = source());
     70 
     71 assert.compareArray(log, [
     72    "source", "source-key", "source-key-tostring",
     73    "target", "target-key",
     74    "get", "target-key-tostring", "set",
     75 ]);
     76 
     77 reportCompare(0, 0);