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

Unified Diff: src/parsing/parser.cc

Issue 2317383002: Async/await Promise dependency graph (Closed)
Patch Set: format Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698