// |reftest| async // Copyright (C) 2019 André Bargull. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-return-statement-runtime-semantics-evaluation description: > Return with an explicit return value awaits this value. info: | 13.10.1 Runtime Semantics: Evaluation ReturnStatement : return; 1. Return Completion { [[Type]]: return, [[Value]]: undefined, [[Target]]: empty }. ReturnStatement : return Expression ; 1. Let exprRef be the result of evaluating Expression. 2. Let exprValue be ? GetValue(exprRef). 3. If ! GetGeneratorKind() is async, set exprValue to ? Await(exprValue). 4. Return Completion { [[Type]]: return, [[Value]]: exprValue, [[Target]]: empty }. 25.5.3.2 AsyncGeneratorStart ( generator, generatorBody ) ... 5. Set the code evaluation state of genContext such that when evaluation is resumed for that execution context the following steps will be performed: a. Let result be the result of evaluating generatorBody. ... e. If result is a normal completion, let resultValue be undefined. ... g. Return ! AsyncGeneratorResolve(generator, resultValue, true). includes: [compareArray.js] flags: [async] features: [async-iteration] ---*/ // 25.5.3.2, step 5.e: |generatorBody| execution ends with a normal completion. async function* g1() { // no return } // 13.10.1: No expression form means direct return. async function* g2() { return; } // 13.10.1: Explicit expression requires Await. async function* g3() { return undefined; // Return undefined via global value `undefined`. } // 13.10.1: Explicit expression requires Await. async function* g4() { return void 0; // Return undefined via void expression. } var expected = [ "tick 1", "g1 ret", "g2 ret", "tick 2", "g3 ret", "g4 ret", ]; var actual = []; Promise.resolve(0) .then(() => actual.push("tick 1")) .then(() => actual.push("tick 2")) .then(() => { assert.compareArray(actual, expected, "Ticks for implicit and explicit return undefined"); }).then($DONE, $DONE); g1().next().then(v => actual.push("g1 ret")); g2().next().then(v => actual.push("g2 ret")); g3().next().then(v => actual.push("g3 ret")); g4().next().then(v => actual.push("g4 ret"));