Commit 596cfbe6 authored by Joshua Litt's avatar Joshua Litt Committed by Commit Bot

[Interpreter] Await the input value of iterator.return for yield* on async generators

Per 262, yield* for async generators is supposed to Await the input value.
#sec-generator-function-definitions-runtime-semantics-evaluation
Section 14.4.13, yield *, 7.c.iii.1


Bug: v8:9051
Change-Id: Ie1e829309fe78683a9ff0adf816208c2bf0bb524
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1600508
Commit-Queue: Joshua Litt <joshualitt@google.com>
Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61390}
parent f117f9a2
......@@ -3922,7 +3922,10 @@ void BytecodeGenerator::VisitYield(Yield* expr) {
// break;
// case kReturn:
// let iteratorReturn = iterator.return;
// if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input;
// if (IS_NULL_OR_UNDEFINED(iteratorReturn)) {
// if (IS_ASYNC_GENERATOR) input = await input;
// return input;
// }
// output = iteratorReturn.[[Call]](iterator, «input»);
// break;
// case kThrow:
......@@ -4030,6 +4033,8 @@ void BytecodeGenerator::VisitYieldStar(YieldStar* expr) {
no_return_method.Bind(builder());
builder()->LoadAccumulatorWithRegister(input);
if (iterator_type == IteratorType::kAsync) {
// Await input.
BuildAwait(expr->position());
execution_control()->AsyncReturnAccumulator();
} else {
execution_control()->ReturnAccumulator();
......
......@@ -2756,7 +2756,8 @@ ParserBase<Impl>::ParseYieldExpression() {
impl()->RecordSuspendSourceRange(yieldstar, PositionAfterSemicolon());
function_state_->AddSuspend();
if (IsAsyncGeneratorFunction(function_state_->kind())) {
// iterator_close and delegated_iterator_output suspend ids.
// return, iterator_close and delegated_iterator_output suspend ids.
function_state_->AddSuspend();
function_state_->AddSuspend();
function_state_->AddSuspend();
}
......
......@@ -530,9 +530,6 @@
# https://bugs.chromium.org/p/v8/issues/detail?id=9050
'language/statements/async-generator/return-undefined-implicit-and-explicit': [FAIL],
# https://bugs.chromium.org/p/v8/issues/detail?id=9051
'language/statements/async-generator/yield-star-return-then-getter-ticks': [FAIL],
# https://bugs.chromium.org/p/v8/issues/detail?id=9228
'built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable': [FAIL],
'built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible': [FAIL],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment