async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js (2751B)
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-null.case 4 // - src/dstr-assignment-for-await/default/async-gen-decl.template 5 /*--- 6 description: IteratorClose throws a TypeError when `return` returns a non-Object value (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 7.4.6 IteratorClose( iterator, completion ) 42 43 [...] 44 6. Let innerResult be Call(return, iterator, « »). 45 7. If completion.[[type]] is throw, return Completion(completion). 46 8. If innerResult.[[type]] is throw, return Completion(innerResult). 47 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError 48 exception. 49 50 ---*/ 51 let x; 52 let nextCount = 0; 53 let iterator = { 54 next() { 55 nextCount += 1; 56 // Set an upper-bound to limit unnecessary iteration in non-conformant 57 // implementations 58 return { done: nextCount > 10 }; 59 }, 60 return() { 61 return null; 62 } 63 }; 64 let iterable = { 65 [Symbol.iterator]() { 66 return iterator; 67 } 68 }; 69 70 71 let iterCount = 0; 72 async function * fn() { 73 for await ([ x , , ] of [iterable]) { 74 75 iterCount += 1; 76 } 77 } 78 79 let promise = fn().next(); 80 81 promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { 82 assert.sameValue(iterCount, 0); 83 assert.sameValue(nextCount, 2); 84 assert.sameValue(constructor, TypeError); 85 }).then($DONE, $DONE);