async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js (2318B)
1 // |reftest| async 2 // This file was procedurally generated from the following sources: 3 // - src/dstr-assignment-for-await/array-elem-trlg-iter-elision-iter-nrml-close-skip.case 4 // - src/dstr-assignment-for-await/async-generator/async-gen-decl.template 5 /*--- 6 description: IteratorClose not invoked when elision exhausts the iterator (for-await-of statement in an async generator declaration) 7 esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation 8 features: [Symbol.iterator, destructuring-binding, async-iteration] 9 flags: [generated, async] 10 info: | 11 IterationStatement : 12 for await ( LeftHandSideExpression of AssignmentExpression ) Statement 13 14 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », 15 AssignmentExpression, iterate). 16 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, 17 keyResult, assignment, labelSet). 18 19 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation 20 21 [...] 22 5. If destructuring is true and if lhsKind is assignment, then 23 a. Assert: lhs is a LeftHandSideExpression. 24 b. Let assignmentPattern be the parse of the source text corresponding to 25 lhs using AssignmentPattern as the goal symbol. 26 [...] 27 28 ArrayAssignmentPattern : 29 [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] 30 31 [...] 32 5. If Elision is present, then 33 a. Let status be the result of performing 34 IteratorDestructuringAssignmentEvaluation of Elision with 35 iteratorRecord as the argument. 36 b. If status is an abrupt completion, then 37 38 [...] 39 40 7. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, 41 status). 42 9. Return Completion(status). 43 44 ---*/ 45 let nextCount = 0; 46 let returnCount = 0; 47 let x; 48 let iterator = { 49 next() { 50 nextCount += 1; 51 52 return { done: nextCount > 1 }; 53 }, 54 return() { 55 returnCount += 1; 56 } 57 }; 58 let iterable = { 59 [Symbol.iterator]() { 60 return iterator; 61 } 62 }; 63 64 let iterCount = 0; 65 async function * fn() { 66 for await ([ x , , ] of [iterable]) { 67 assert.sameValue(nextCount, 2); 68 assert.sameValue(returnCount, 0); 69 70 71 iterCount += 1; 72 } 73 } 74 75 let iter = fn(); 76 77 iter.next() 78 .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) 79 .then($DONE, $DONE);