Chromium Code Reviews| 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()); |
|
Dan Ehrenberg
2016/06/03 12:56:16
To confirm my understanding, you needed to put thi
Yang
2016/06/03 15:01:10
The assignment is just an expression, not a statem
|
| 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 { |