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