| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 5f6d460d5468cf5d1271dece71cfa3353b3e5fcf..50d875feb687347ca72b2f163f3ae84750105911 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -5598,7 +5598,8 @@ void ParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier,
|
| parser_->RewriteNonPattern(classifier, ok);
|
| }
|
|
|
| -Expression* ParserTraits::RewriteAwaitExpression(Expression* value, int pos) {
|
| +Expression* ParserTraits::RewriteAwaitExpression(Expression* value,
|
| + int await_pos) {
|
| // yield %AsyncFunctionAwait(.generator_object, <operand>)
|
| Variable* generator_object_variable =
|
| parser_->function_state_->generator_object_variable();
|
| @@ -5606,21 +5607,38 @@ Expression* ParserTraits::RewriteAwaitExpression(Expression* value, int pos) {
|
| // If generator_object_variable is null,
|
| if (!generator_object_variable) return value;
|
|
|
| - Expression* generator_object =
|
| - parser_->factory()->NewVariableProxy(generator_object_variable);
|
| + auto factory = parser_->factory();
|
| + const int nopos = RelocInfo::kNoPosition;
|
| +
|
| + Variable* temp_var = parser_->scope_->NewTemporary(
|
| + parser_->ast_value_factory()->empty_string());
|
| + VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var);
|
| + Block* do_block = factory->NewBlock(nullptr, 2, false, nopos);
|
| +
|
| + // Wrap value evaluation to provide a break location.
|
| + Expression* value_assignment =
|
| + factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos);
|
| + do_block->statements()->Add(
|
| + factory->NewExpressionStatement(value_assignment, value->position()),
|
| + zone());
|
|
|
| ZoneList<Expression*>* async_function_await_args =
|
| new (zone()) ZoneList<Expression*>(2, zone());
|
| + Expression* generator_object =
|
| + factory->NewVariableProxy(generator_object_variable);
|
| async_function_await_args->Add(generator_object, zone());
|
| - async_function_await_args->Add(value, zone());
|
| + async_function_await_args->Add(temp_proxy, zone());
|
| Expression* async_function_await = parser_->factory()->NewCallRuntime(
|
| - Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args,
|
| - RelocInfo::kNoPosition);
|
| + Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, nopos);
|
| + // Wrap await to provide a break location between value evaluation and yield.
|
| + Expression* await_assignment = factory->NewAssignment(
|
| + Token::ASSIGN, temp_proxy, async_function_await, nopos);
|
| + do_block->statements()->Add(
|
| + factory->NewExpressionStatement(await_assignment, await_pos), zone());
|
| + Expression* do_expr = factory->NewDoExpression(do_block, temp_var, nopos);
|
|
|
| - generator_object =
|
| - parser_->factory()->NewVariableProxy(generator_object_variable);
|
| - return parser_->factory()->NewYield(generator_object, async_function_await,
|
| - pos);
|
| + generator_object = factory->NewVariableProxy(generator_object_variable);
|
| + return factory->NewYield(generator_object, do_expr, nopos);
|
| }
|
|
|
| Zone* ParserTraits::zone() const {
|
|
|