mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 03:34:08 +01:00 
			
		
		
		
	Ensure that the following cases are covered: - https://github.com/tc39/ecma262/issues/3295#issuecomment-2058110314 - https://github.com/tc39/ecma262/issues/2659#issue-1131245695
		
			
				
	
	
		
			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",
 | |
|     "get", "target-key-tostring", "set",
 | |
| ]);
 |