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