async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js (2473B)
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-err.case 4 // - src/dstr-assignment-for-await/async-generator/async-gen-decl.template 5 /*--- 6 description: Abrupt completion returned from IteratorClose (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 6. 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 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, 39 status). 40 41 ---*/ 42 let nextCount = 0; 43 let returnCount = 0; 44 let x; 45 let iterator = { 46 next() { 47 nextCount += 1; 48 49 // Set an upper-bound to limit unnecessary iteration in non-conformant 50 // implementations 51 return { done: nextCount > 10 }; 52 }, 53 return() { 54 returnCount += 1; 55 throw new Test262Error(); 56 } 57 }; 58 let iterable = { 59 [Symbol.iterator]() { 60 return iterator; 61 } 62 }; 63 64 65 let iterCount = 0; 66 async function * fn() { 67 for await ([ x , , ] of [iterable]) { 68 69 iterCount += 1; 70 } 71 } 72 73 let iter = fn(); 74 75 iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { 76 assert.sameValue(iterCount, 0); 77 assert.sameValue(nextCount, 2); 78 assert.sameValue(returnCount, 1); 79 assert.sameValue(constructor, Test262Error); 80 }).then($DONE, $DONE);