Chromium Code Reviews| Index: src/parsing/parser.cc |
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
| index 4973857c37ea0f2cf2854c35000be559db065e3a..30da25a9eb67861579c0e7f13be640036da88e08 100644 |
| --- a/src/parsing/parser.cc |
| +++ b/src/parsing/parser.cc |
| @@ -4379,8 +4379,10 @@ Expression* Parser::ExpressionListToExpression(ZoneList<Expression*>* args) { |
| Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| // yield do { |
| + // promise_tmp = .promise; |
| // tmp = <operand>; |
| - // tmp = %AsyncFunctionAwait(.generator_object, tmp); |
| + // %AsyncFunctionAwait(.generator_object, tmp, promise_tmp); |
| + // promise_tmp |
| // } |
| Variable* generator_object_variable = |
| function_state_->generator_object_variable(); |
| @@ -4394,6 +4396,15 @@ Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| // Wrap value evaluation to provide a break location. |
| + Variable* promise_temp_var = |
|
adamk
2016/09/15 22:39:40
Why do we need a new var here? Is something going
Dan Ehrenberg
2016/09/17 00:04:31
- To output something from a block, we need a Vari
|
| + NewTemporary(ast_value_factory()->empty_string()); |
| + Expression* promise_assignment = factory()->NewAssignment( |
| + Token::ASSIGN, factory()->NewVariableProxy(promise_temp_var), |
| + BuildDotPromise(), nopos); |
| + do_block->statements()->Add( |
| + factory()->NewExpressionStatement(promise_assignment, value->position()), |
|
adamk
2016/09/15 22:39:40
Is it important that this uses the same position a
Dan Ehrenberg
2016/09/17 00:04:31
It does not; changed it to nopos.
|
| + zone()); |
| + |
| Expression* value_assignment = factory()->NewAssignment( |
| Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos); |
| do_block->statements()->Add( |
| @@ -4401,11 +4412,13 @@ Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| zone()); |
| ZoneList<Expression*>* async_function_await_args = |
| - new (zone()) ZoneList<Expression*>(2, zone()); |
| + new (zone()) ZoneList<Expression*>(3, zone()); |
| Expression* generator_object = |
| factory()->NewVariableProxy(generator_object_variable); |
| async_function_await_args->Add(generator_object, zone()); |
| async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone()); |
| + async_function_await_args->Add(factory()->NewVariableProxy(promise_temp_var), |
| + zone()); |
| // The parser emits calls to AsyncFunctionAwaitCaught, but the |
| // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught |
| @@ -4413,14 +4426,13 @@ Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| Expression* async_function_await = |
| factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, |
| async_function_await_args, nopos); |
| + do_block->statements()->Add( |
| + factory()->NewExpressionStatement(async_function_await, await_pos), |
| + zone()); |
| // Wrap await to provide a break location between value evaluation and yield. |
| - Expression* await_assignment = factory()->NewAssignment( |
| - Token::ASSIGN, factory()->NewVariableProxy(temp_var), |
| - 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); |
| + Expression* do_expr = |
| + factory()->NewDoExpression(do_block, promise_temp_var, nopos); |
| generator_object = factory()->NewVariableProxy(generator_object_variable); |
| return factory()->NewYield(generator_object, do_expr, nopos, |