OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
(...skipping 4533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4544 expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i), | 4544 expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i), |
4545 expr->position()); | 4545 expr->position()); |
4546 } | 4546 } |
4547 return expr; | 4547 return expr; |
4548 } | 4548 } |
4549 | 4549 |
4550 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { | 4550 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
4551 // yield do { | 4551 // yield do { |
4552 // promise_tmp = .promise; | 4552 // promise_tmp = .promise; |
4553 // tmp = <operand>; | 4553 // tmp = <operand>; |
4554 // %AsyncFunctionAwait(.generator_object, tmp); | 4554 // %AsyncFunctionAwait(.generator_object, tmp, promise_tmp); |
4555 // promise_tmp | 4555 // promise_tmp |
4556 // } | 4556 // } |
4557 // The value of the expression is returned to the caller of the async | 4557 // The value of the expression is returned to the caller of the async |
4558 // function for the first yield statement; for this, .promise is the | 4558 // function for the first yield statement; for this, .promise is the |
4559 // appropriate return value, being a Promise that will be fulfilled or | 4559 // appropriate return value, being a Promise that will be fulfilled or |
4560 // rejected with the appropriate value by the desugaring. Subsequent yield | 4560 // rejected with the appropriate value by the desugaring. Subsequent yield |
4561 // occurrences will return to the AsyncFunctionNext call within the | 4561 // occurrences will return to the AsyncFunctionNext call within the |
4562 // implemementation of the intermediate throwaway Promise's then handler. | 4562 // implemementation of the intermediate throwaway Promise's then handler. |
4563 // This handler has nothing useful to do with the value, as the Promise is | 4563 // This handler has nothing useful to do with the value, as the Promise is |
4564 // ignored. If we yielded the value of the throwawayPromise that | 4564 // ignored. If we yielded the value of the throwawayPromise that |
(...skipping 24 matching lines...) Expand all Loading... |
4589 | 4589 |
4590 // Wrap value evaluation to provide a break location. | 4590 // Wrap value evaluation to provide a break location. |
4591 Variable* temp_var = NewTemporary(ast_value_factory()->empty_string()); | 4591 Variable* temp_var = NewTemporary(ast_value_factory()->empty_string()); |
4592 Expression* value_assignment = factory()->NewAssignment( | 4592 Expression* value_assignment = factory()->NewAssignment( |
4593 Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos); | 4593 Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos); |
4594 do_block->statements()->Add( | 4594 do_block->statements()->Add( |
4595 factory()->NewExpressionStatement(value_assignment, value->position()), | 4595 factory()->NewExpressionStatement(value_assignment, value->position()), |
4596 zone()); | 4596 zone()); |
4597 | 4597 |
4598 ZoneList<Expression*>* async_function_await_args = | 4598 ZoneList<Expression*>* async_function_await_args = |
4599 new (zone()) ZoneList<Expression*>(2, zone()); | 4599 new (zone()) ZoneList<Expression*>(3, zone()); |
4600 Expression* generator_object = | 4600 Expression* generator_object = |
4601 factory()->NewVariableProxy(generator_object_variable); | 4601 factory()->NewVariableProxy(generator_object_variable); |
4602 async_function_await_args->Add(generator_object, zone()); | 4602 async_function_await_args->Add(generator_object, zone()); |
4603 async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone()); | 4603 async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone()); |
| 4604 async_function_await_args->Add(factory()->NewVariableProxy(promise_temp_var), |
| 4605 zone()); |
4604 | 4606 |
4605 // The parser emits calls to AsyncFunctionAwaitCaught, but the | 4607 // The parser emits calls to AsyncFunctionAwaitCaught, but the |
4606 // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught | 4608 // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught |
4607 // if there is no local enclosing try/catch block. | 4609 // if there is no local enclosing try/catch block. |
4608 Expression* async_function_await = | 4610 Expression* async_function_await = |
4609 factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, | 4611 factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, |
4610 async_function_await_args, nopos); | 4612 async_function_await_args, nopos); |
4611 do_block->statements()->Add( | 4613 do_block->statements()->Add( |
4612 factory()->NewExpressionStatement(async_function_await, await_pos), | 4614 factory()->NewExpressionStatement(async_function_await, await_pos), |
4613 zone()); | 4615 zone()); |
(...skipping 1207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5821 node->Print(Isolate::Current()); | 5823 node->Print(Isolate::Current()); |
5822 } | 5824 } |
5823 #endif // DEBUG | 5825 #endif // DEBUG |
5824 | 5826 |
5825 #undef CHECK_OK | 5827 #undef CHECK_OK |
5826 #undef CHECK_OK_VOID | 5828 #undef CHECK_OK_VOID |
5827 #undef CHECK_FAILED | 5829 #undef CHECK_FAILED |
5828 | 5830 |
5829 } // namespace internal | 5831 } // namespace internal |
5830 } // namespace v8 | 5832 } // namespace v8 |
OLD | NEW |