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);