async-gen-yield-star-sync-next.js (6807B)
1 // |reftest| async 2 // This file was procedurally generated from the following sources: 3 // - src/async-generators/yield-star-sync-next.case 4 // - src/async-generators/default/async-obj-method.template 5 /*--- 6 description: execution order for yield* with sync iterator and next() (Async generator method) 7 esid: prod-AsyncGeneratorMethod 8 features: [Symbol.iterator, async-iteration, Symbol.asyncIterator] 9 flags: [generated, async] 10 info: | 11 Async Generator Function Definitions 12 13 AsyncGeneratorMethod : 14 async [no LineTerminator here] * PropertyName ( UniqueFormalParameters ) { AsyncGeneratorBody } 15 16 17 YieldExpression: yield * AssignmentExpression 18 19 ... 20 2. Let value be ? GetValue(exprRef). 21 3. Let generatorKind be ! GetGeneratorKind(). 22 4. Let iterator be ? GetIterator(value, generatorKind). 23 5. Let received be NormalCompletion(undefined). 24 6. Repeat 25 a. If received.[[Type]] is normal, then 26 i. Let innerResult be ? IteratorNext(iterator, received.[[Value]]). 27 ii. Let innerResult be ? Invoke(iterator, "next", 28 « received.[[Value]] »). 29 iii. If generatorKind is async, then set innerResult to 30 ? Await(innerResult). 31 ... 32 v. Let done be ? IteratorComplete(innerResult). 33 vi. If done is true, then 34 1. Return ? IteratorValue(innerResult). 35 vii. Let received be GeneratorYield(innerResult). 36 ... 37 38 GetIterator ( obj [ , hint ] ) 39 40 ... 41 3. If hint is async, 42 a. Set method to ? GetMethod(obj, @@asyncIterator). 43 b. If method is undefined, 44 i. Let syncMethod be ? GetMethod(obj, @@iterator). 45 ii. Let syncIterator be ? Call(syncMethod, obj). 46 iii. Return ? CreateAsyncFromSyncIterator(syncIterator). 47 ... 48 49 %AsyncFromSyncIteratorPrototype%.next ( value ) 50 51 ... 52 5. Let nextResult be IteratorNext(syncIterator, value). 53 ... 54 7. Let nextValue be IteratorValue(nextResult). 55 ... 56 9. Let nextDone be IteratorComplete(nextResult). 57 ... 58 12. Perform ! Call(valueWrapperCapability.[[Resolve]], undefined, 59 « nextValue »). 60 ... 61 14. Set onFulfilled.[[Done]] to nextDone. 62 15. Perform ! PerformPromiseThen(valueWrapperCapability.[[Promise]], 63 onFulfilled, undefined, promiseCapability). 64 ... 65 66 Async Iterator Value Unwrap Functions 67 68 1. Return ! CreateIterResultObject(value, F.[[Done]]). 69 70 ---*/ 71 var log = []; 72 var obj = { 73 get [Symbol.iterator]() { 74 log.push({ 75 name: "get [Symbol.iterator]", 76 thisValue: this 77 }); 78 return function() { 79 log.push({ 80 name: "call [Symbol.iterator]", 81 thisValue: this, 82 args: [...arguments] 83 }); 84 var nextCount = 0; 85 return { 86 name: "syncIterator", 87 get next() { 88 log.push({ 89 name: "get next", 90 thisValue: this 91 }); 92 return function() { 93 log.push({ 94 name: "call next", 95 thisValue: this, 96 args: [...arguments] 97 }); 98 99 nextCount++; 100 if (nextCount == 1) { 101 return { 102 name: "next-result-1", 103 get value() { 104 log.push({ 105 name: "get next value (1)", 106 thisValue: this 107 }); 108 return "next-value-1"; 109 }, 110 get done() { 111 log.push({ 112 name: "get next done (1)", 113 thisValue: this 114 }); 115 return false; 116 } 117 }; 118 } 119 120 return { 121 name: "next-result-2", 122 get value() { 123 log.push({ 124 name: "get next value (2)", 125 thisValue: this 126 }); 127 return "next-value-2"; 128 }, 129 get done() { 130 log.push({ 131 name: "get next done (2)", 132 thisValue: this 133 }); 134 return true; 135 } 136 }; 137 }; 138 } 139 }; 140 }; 141 }, 142 get [Symbol.asyncIterator]() { 143 log.push({ name: "get [Symbol.asyncIterator]" }); 144 return null; 145 } 146 }; 147 148 149 var callCount = 0; 150 151 var gen = { 152 async *method() { 153 callCount += 1; 154 log.push({ name: "before yield*" }); 155 var v = yield* obj; 156 log.push({ 157 name: "after yield*", 158 value: v 159 }); 160 return "return-value"; 161 162 } 163 }.method; 164 165 var iter = gen(); 166 167 assert.sameValue(log.length, 0, "log.length"); 168 169 iter.next("next-arg-1").then(v => { 170 assert.sameValue(log[0].name, "before yield*"); 171 172 assert.sameValue(log[1].name, "get [Symbol.asyncIterator]"); 173 174 assert.sameValue(log[2].name, "get [Symbol.iterator]"); 175 assert.sameValue(log[2].thisValue, obj, "get [Symbol.iterator] thisValue"); 176 177 assert.sameValue(log[3].name, "call [Symbol.iterator]"); 178 assert.sameValue(log[3].thisValue, obj, "[Symbol.iterator] thisValue"); 179 assert.sameValue(log[3].args.length, 0, "[Symbol.iterator] args.length"); 180 181 assert.sameValue(log[4].name, "get next"); 182 assert.sameValue(log[4].thisValue.name, "syncIterator", "get next thisValue"); 183 184 assert.sameValue(log[5].name, "call next"); 185 assert.sameValue(log[5].thisValue.name, "syncIterator", "next thisValue"); 186 assert.sameValue(log[5].args.length, 1, "next args.length"); 187 assert.sameValue(log[5].args[0], undefined, "next args[0]"); 188 189 assert.sameValue(log[6].name, "get next done (1)"); 190 assert.sameValue(log[6].thisValue.name, "next-result-1", "get next done thisValue"); 191 192 assert.sameValue(log[7].name, "get next value (1)"); 193 assert.sameValue(log[7].thisValue.name, "next-result-1", "get next value thisValue"); 194 195 assert.sameValue(v.value, "next-value-1"); 196 assert.sameValue(v.done, false); 197 198 assert.sameValue(log.length, 8, "log.length"); 199 200 iter.next("next-arg-2").then(v => { 201 assert.sameValue(log[8].name, "call next"); 202 assert.sameValue(log[8].thisValue.name, "syncIterator", "next thisValue"); 203 assert.sameValue(log[8].args.length, 1, "next args.length"); 204 assert.sameValue(log[8].args[0], "next-arg-2", "next args[0]"); 205 206 assert.sameValue(log[9].name, "get next done (2)"); 207 assert.sameValue(log[9].thisValue.name, "next-result-2", "get next done thisValue"); 208 209 assert.sameValue(log[10].name, "get next value (2)"); 210 assert.sameValue(log[10].thisValue.name, "next-result-2", "get next value thisValue"); 211 212 assert.sameValue(log[11].name, "after yield*"); 213 assert.sameValue(log[11].value, "next-value-2"); 214 215 assert.sameValue(v.value, "return-value"); 216 assert.sameValue(v.done, true); 217 218 assert.sameValue(log.length, 12, "log.length"); 219 }).then($DONE, $DONE); 220 }).catch($DONE); 221 222 assert.sameValue(callCount, 1);