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(); |
} |