Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: src/parsing/parser.cc

Issue 2667983004: [async-await] don't eagerly resolve Promise before finally blocks have executed
Patch Set: clean merge Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecode-generator.cc ('k') | test/mjsunit/es8/async-function-try-finally.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1593 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 Expression* is_undefined = factory()->NewCompareOperation( 1604 Expression* is_undefined = factory()->NewCompareOperation(
1605 Token::EQ_STRICT, assign, 1605 Token::EQ_STRICT, assign,
1606 factory()->NewUndefinedLiteral(kNoSourcePosition), pos); 1606 factory()->NewUndefinedLiteral(kNoSourcePosition), pos);
1607 1607
1608 // is_undefined ? this : is_object_conditional 1608 // is_undefined ? this : is_object_conditional
1609 return_value = factory()->NewConditional(is_undefined, ThisExpression(pos), 1609 return_value = factory()->NewConditional(is_undefined, ThisExpression(pos),
1610 is_object_conditional, pos); 1610 is_object_conditional, pos);
1611 } 1611 }
1612 if (is_generator()) { 1612 if (is_generator()) {
1613 return_value = BuildIteratorResult(return_value, true); 1613 return_value = BuildIteratorResult(return_value, true);
1614 } else if (is_async_function()) {
1615 return_value = BuildResolvePromise(return_value, return_value->position());
1616 } 1614 }
1617 return return_value; 1615 return return_value;
1618 } 1616 }
1619 1617
1620 Expression* Parser::RewriteDoExpression(Block* body, int pos, bool* ok) { 1618 Expression* Parser::RewriteDoExpression(Block* body, int pos, bool* ok) {
1621 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); 1619 Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
1622 DoExpression* expr = factory()->NewDoExpression(body, result, pos); 1620 DoExpression* expr = factory()->NewDoExpression(body, result, pos);
1623 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { 1621 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) {
1624 *ok = false; 1622 *ok = false;
1625 return nullptr; 1623 return nullptr;
(...skipping 2014 matching lines...) Expand 10 before | Expand all | Expand 10 after
3640 3638
3641 // This method intoduces the line initializing the generator object 3639 // This method intoduces the line initializing the generator object
3642 // when desugaring the body of async_function. 3640 // when desugaring the body of async_function.
3643 void Parser::PrepareAsyncFunctionBody(ZoneList<Statement*>* body, 3641 void Parser::PrepareAsyncFunctionBody(ZoneList<Statement*>* body,
3644 FunctionKind kind, int pos) { 3642 FunctionKind kind, int pos) {
3645 // When parsing an async arrow function, we get here without having called 3643 // When parsing an async arrow function, we get here without having called
3646 // PrepareGeneratorVariables yet, so do it now. 3644 // PrepareGeneratorVariables yet, so do it now.
3647 if (function_state_->generator_object_variable() == nullptr) { 3645 if (function_state_->generator_object_variable() == nullptr) {
3648 PrepareGeneratorVariables(); 3646 PrepareGeneratorVariables();
3649 } 3647 }
3648 Variable* promise_var = PromiseVariable();
3649 DCHECK_NOT_NULL(promise_var);
3650 USE(promise_var);
3650 } 3651 }
3651 3652
3652 // This method completes the desugaring of the body of async_function. 3653 // This method completes the desugaring of the body of async_function.
3653 void Parser::RewriteAsyncFunctionBody(ZoneList<Statement*>* body, 3654 void Parser::RewriteAsyncFunctionBody(ZoneList<Statement*>* body,
3654 Expression* return_value, bool* ok) { 3655 Expression* return_value, bool* ok) {
3655 // function async_function() { 3656 // function async_function() {
3656 // .generator_object = %CreateJSGeneratorObject(); 3657 // .generator_object = %CreateJSGeneratorObject();
3657 // BuildRejectPromiseOnException({ 3658 // BuildRejectPromiseOnException({
3658 // ... block ... 3659 // ... block ...
3659 // return %ResolvePromise(.promise, expr), .promise; 3660 // return %ResolvePromise(.promise, expr), .promise;
3660 // }) 3661 // })
3661 // } 3662 // }
3662 3663
3663 return_value = BuildResolvePromise(return_value, return_value->position());
3664 body->Add( 3664 body->Add(
3665 factory()->NewReturnStatement(return_value, return_value->position()), 3665 factory()->NewReturnStatement(return_value, return_value->position()),
3666 zone()); 3666 zone());
3667 } 3667 }
3668 3668
3669 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { 3669 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) {
3670 // yield do { 3670 // yield do {
3671 // tmp = <operand>; 3671 // tmp = <operand>;
3672 // %AsyncFunctionAwait(.generator_object, tmp, .promise); 3672 // %AsyncFunctionAwait(.generator_object, tmp, .promise);
3673 // .promise 3673 // .promise
(...skipping 1224 matching lines...) Expand 10 before | Expand all | Expand 10 after
4898 4898
4899 return final_loop; 4899 return final_loop;
4900 } 4900 }
4901 4901
4902 #undef CHECK_OK 4902 #undef CHECK_OK
4903 #undef CHECK_OK_VOID 4903 #undef CHECK_OK_VOID
4904 #undef CHECK_FAILED 4904 #undef CHECK_FAILED
4905 4905
4906 } // namespace internal 4906 } // namespace internal
4907 } // namespace v8 4907 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-generator.cc ('k') | test/mjsunit/es8/async-function-try-finally.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698