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-with-bindings.js (2059B)


      1 // Copyright (C) 2024 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-propertydestructuringassignmentevaluation
      6 description: >
      7  Ensure correct evaluation order for binding lookups when destructuring target is var-binding.
      8 info: |
      9  13.15.5.3 Runtime Semantics: PropertyDestructuringAssignmentEvaluation
     10 
     11    AssignmentProperty : PropertyName : AssignmentElement
     12 
     13    1. Let name be ? Evaluation of PropertyName.
     14    2. Perform ? KeyedDestructuringAssignmentEvaluation of AssignmentElement with arguments value and name.
     15    ...
     16 
     17  13.15.5.6 Runtime Semantics: KeyedDestructuringAssignmentEvaluation
     18 
     19    AssignmentElement : DestructuringAssignmentTarget Initializer_opt
     20 
     21    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
     22      a. Let lRef be ? Evaluation of DestructuringAssignmentTarget.
     23    2. Let v be ? GetV(value, propertyName).
     24    3. If Initializer is present and v is undefined, then
     25      ...
     26      b. Else,
     27        i. Let defaultValue be ? Evaluation of Initializer.
     28        ii. Let rhsValue be ? GetValue(defaultValue).
     29    ...
     30    6. Return ? PutValue(lRef, rhsValue).
     31 
     32 includes: [compareArray.js]
     33 features: [Proxy]
     34 flags: [noStrict]
     35 ---*/
     36 
     37 var log = [];
     38 
     39 var targetKey = {
     40  toString: () => {
     41    log.push("targetKey");
     42    return "q";
     43  }
     44 };
     45 
     46 var sourceKey = {
     47  toString: () => {
     48    log.push("sourceKey");
     49    return "p";
     50  }
     51 };
     52 
     53 var source = {
     54  get p() {
     55    log.push("get source");
     56    return undefined;
     57  }
     58 };
     59 
     60 var target = {
     61  set q(v) {
     62    log.push("set target");
     63  },
     64 };
     65 
     66 var env = new Proxy({}, {
     67  has(t, pk) {
     68    log.push("binding::" + pk);
     69  }
     70 });
     71 
     72 var defaultValue = 0;
     73 
     74 with (env) {
     75  ({
     76    [sourceKey]: target[targetKey] = defaultValue
     77  } = source);
     78 }
     79 
     80 assert.compareArray(log, [
     81  "binding::source",
     82  "binding::sourceKey",
     83  "sourceKey",
     84  "binding::target",
     85  "binding::targetKey",
     86  "get source",
     87  "binding::defaultValue",
     88  "targetKey",
     89  "set target",
     90 ]);
     91 
     92 reportCompare(0, 0);