| // Copyright (C) 2019 André Bargull. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| |
| /*--- |
| esid: sec-generator-function-definitions-runtime-semantics-evaluation |
| description: > |
| Return resumption value is awaited upon and hence is treated as a thenable. |
| info: | |
| 14.4.14 Runtime Semantics: Evaluation |
| YieldExpression : yield AssignmentExpression |
| |
| ... |
| 3. Let value be ? GetValue(exprRef). |
| 4. If generatorKind is async, then return ? AsyncGeneratorYield(value). |
| ... |
| |
| 25.5.3.7 AsyncGeneratorYield ( value ) |
| ... |
| 5. Set value to ? Await(value). |
| ... |
| 8. Set the code evaluation state of genContext such that when evaluation is resumed with a |
| Completion resumptionValue the following steps will be performed: |
| ... |
| b. Let awaited be Await(resumptionValue.[[Value]]). |
| ... |
| e. Return Completion { [[Type]]: return, [[Value]]: awaited.[[Value]], [[Target]]: empty }. |
| ... |
| |
| 6.2.3.1 Await |
| ... |
| 2. Let promise be ? PromiseResolve(%Promise%, « value »). |
| ... |
| |
| 25.6.4.5.1 PromiseResolve ( C, x ) |
| ... |
| 3. Let promiseCapability be ? NewPromiseCapability(C). |
| 4. Perform ? Call(promiseCapability.[[Resolve]], undefined, « x »). |
| ... |
| |
| 25.6.1.5 NewPromiseCapability ( C ) |
| ... |
| 7. Let promise be ? Construct(C, « executor »). |
| ... |
| |
| 25.6.3.1 Promise ( executor ) |
| ... |
| 8. Let resolvingFunctions be CreateResolvingFunctions(promise). |
| ... |
| |
| 25.6.1.3 CreateResolvingFunctions ( promise ) |
| ... |
| 2. Let stepsResolve be the algorithm steps defined in Promise Resolve Functions (25.6.1.3.2). |
| 3. Let resolve be CreateBuiltinFunction(stepsResolve, « [[Promise]], [[AlreadyResolved]] »). |
| ... |
| |
| 25.6.1.3.2 Promise Resolve Functions |
| ... |
| 9. Let then be Get(resolution, "then"). |
| ... |
| |
| includes: [compareArray.js] |
| flags: [async] |
| features: [async-iteration] |
| ---*/ |
| |
| var expected = [ |
| "start", |
| |
| // `Await(value)` promise resolved. |
| "tick 1", |
| |
| // "then" of `resumptionValue.[[Value]]` accessed. |
| "get then", |
| |
| // `Await(resumptionValue.[[Value]])` promise resolved. |
| "tick 2", |
| ]; |
| |
| var actual = []; |
| |
| async function* f() { |
| actual.push("start"); |
| yield 123; |
| actual.push("stop - never reached"); |
| } |
| |
| Promise.resolve(0) |
| .then(() => actual.push("tick 1")) |
| .then(() => actual.push("tick 2")) |
| .then(() => { |
| assert.compareArray(actual, expected, "Ticks for return with thenable getter"); |
| }).then($DONE, $DONE); |
| |
| var it = f(); |
| |
| // Start generator execution. |
| it.next(); |
| |
| // Stop generator execution. |
| it.return({ |
| get then() { |
| actual.push("get then"); |
| } |
| }); |