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

Unified Diff: runtime/vm/parser.cc

Issue 484933003: Await it! (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 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: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index d80d951afc0fab08637eb1c456a4d57f554acaa2..8d4f60a722a88fc4072a2b0ef8246e8a2d4abc5c 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -5426,7 +5426,7 @@ void Parser::OpenFunctionBlock(const Function& func) {
void Parser::OpenAsyncClosure() {
TRACE_PARSER("OpenAsyncClosure");
parsed_function()->set_await_temps_scope(current_block_->scope);
- // TODO(mlippautz): Set up explicit jump table for await continuations.
+ current_block_->scope->LookupVariable(Symbols::Completer(), false);
hausner 2014/08/20 19:47:48 Could you add a comment why the variable is looked
Michael Lippautz (Google) 2014/08/20 20:56:06 Yes, it's about capturing it. Moved into CloseAsyn
}
@@ -5523,6 +5523,8 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
// Add to AST:
// var :async_op;
// var :async_completer;
+ // var :await_jump_var;
+ // var :await_ctx_var;
LocalVariable* async_op_var = new (I) LocalVariable(
Scanner::kNoSourcePos,
Symbols::AsyncOperation(),
@@ -5537,11 +5539,34 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
current_block_->scope->AddVariable(async_completer);
found = closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter());
ASSERT(found);
+ LocalVariable* await_jump_var = new (I) LocalVariable(
+ Scanner::kNoSourcePos,
+ Symbols::AwaitJumpVar(),
+ Type::ZoneHandle(I, Type::DynamicType()));
+ current_block_->scope->AddVariable(await_jump_var);
+ found = closure_body->scope()->CaptureVariable(Symbols::AwaitJumpVar());
+ ASSERT(found);
+ LocalVariable* await_ctx_var = new (I) LocalVariable(
+ Scanner::kNoSourcePos,
+ Symbols::AwaitContextVar(),
+ Type::ZoneHandle(I, Type::DynamicType()));
+ current_block_->scope->AddVariable(await_ctx_var);
+ found = closure_body->scope()->CaptureVariable(Symbols::AwaitContextVar());
+ ASSERT(found);
+
+ // Add to AST:
+ // :await_jump_var = null;
+ // :await_ctx_var = null;
+ AstNode* null_literal = new(I) LiteralNode(
hausner 2014/08/20 19:47:48 You should not need to initialize these to null ex
Michael Lippautz (Google) 2014/08/20 20:56:06 Done.
+ Scanner::kNoSourcePos, Object::null_instance());
+ current_block_->statements->Add(new(I) StoreLocalNode(
+ Scanner::kNoSourcePos, await_jump_var, null_literal));
+ current_block_->statements->Add(new(I) StoreLocalNode(
+ Scanner::kNoSourcePos, await_ctx_var, null_literal));
// Add to AST:
// :async_completer = new Completer();
- ArgumentListNode* empty_args = new (I) ArgumentListNode(
- Scanner::kNoSourcePos);
+ ArgumentListNode* empty_args = new(I) ArgumentListNode(Scanner::kNoSourcePos);
srdjan 2014/08/20 17:50:06 The prevalent type is new (I) (with space), please
Michael Lippautz (Google) 2014/08/20 20:56:06 Done. I have seen "new(I)" and "new (I)" all aroun
ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode(
Scanner::kNoSourcePos,
TypeArguments::ZoneHandle(I),
@@ -5592,6 +5617,9 @@ void Parser::CloseAsyncClosure(SequenceNode* body) {
TRACE_PARSER("CloseAsyncClosure");
// We need a temporary expression to store intermediate return values.
parsed_function()->EnsureExpressionTemp();
+ body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
hausner 2014/08/20 19:47:48 A comment would be nice explaining why you are loo
Michael Lippautz (Google) 2014/08/20 20:56:06 Added a comment in the source. Currently, all var
+ body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+ body->scope()->RecursivelyCaptureAllVariables();
}

Powered by Google App Engine
This is Rietveld 408576698