OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
6 | 6 |
7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
9 #include "vm/ast_transformer.h" | 9 #include "vm/ast_transformer.h" |
10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
(...skipping 5408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5419 current_block_->scope->function_level() + 1, | 5419 current_block_->scope->function_level() + 1, |
5420 0); | 5420 0); |
5421 } | 5421 } |
5422 ChainNewBlock(outer_scope); | 5422 ChainNewBlock(outer_scope); |
5423 } | 5423 } |
5424 | 5424 |
5425 | 5425 |
5426 void Parser::OpenAsyncClosure() { | 5426 void Parser::OpenAsyncClosure() { |
5427 TRACE_PARSER("OpenAsyncClosure"); | 5427 TRACE_PARSER("OpenAsyncClosure"); |
5428 parsed_function()->set_await_temps_scope(current_block_->scope); | 5428 parsed_function()->set_await_temps_scope(current_block_->scope); |
5429 // TODO(mlippautz): Set up explicit jump table for await continuations. | |
5430 } | 5429 } |
5431 | 5430 |
5432 | 5431 |
5433 RawFunction* Parser::OpenAsyncFunction(intptr_t formal_param_pos) { | 5432 RawFunction* Parser::OpenAsyncFunction(intptr_t formal_param_pos) { |
5434 TRACE_PARSER("OpenAsyncFunction"); | 5433 TRACE_PARSER("OpenAsyncFunction"); |
5435 // Create the closure containing the old body of this function. | 5434 // Create the closure containing the old body of this function. |
5436 Class& sig_cls = Class::ZoneHandle(I); | 5435 Class& sig_cls = Class::ZoneHandle(I); |
5437 Type& sig_type = Type::ZoneHandle(I); | 5436 Type& sig_type = Type::ZoneHandle(I); |
5438 Function& closure = Function::ZoneHandle(I); | 5437 Function& closure = Function::ZoneHandle(I); |
5439 String& sig = String::ZoneHandle(I); | 5438 String& sig = String::ZoneHandle(I); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5516 const Class& completer = Class::ZoneHandle(I, | 5515 const Class& completer = Class::ZoneHandle(I, |
5517 GetClassForAsync(Symbols::Completer())); | 5516 GetClassForAsync(Symbols::Completer())); |
5518 ASSERT(!completer.IsNull()); | 5517 ASSERT(!completer.IsNull()); |
5519 const Function& completer_constructor = Function::ZoneHandle(I, | 5518 const Function& completer_constructor = Function::ZoneHandle(I, |
5520 completer.LookupFunction(Symbols::CompleterConstructor())); | 5519 completer.LookupFunction(Symbols::CompleterConstructor())); |
5521 ASSERT(!completer_constructor.IsNull()); | 5520 ASSERT(!completer_constructor.IsNull()); |
5522 | 5521 |
5523 // Add to AST: | 5522 // Add to AST: |
5524 // var :async_op; | 5523 // var :async_op; |
5525 // var :async_completer; | 5524 // var :async_completer; |
| 5525 // var :await_jump_var; |
| 5526 // var :await_ctx_var; |
5526 LocalVariable* async_op_var = new (I) LocalVariable( | 5527 LocalVariable* async_op_var = new (I) LocalVariable( |
5527 Scanner::kNoSourcePos, | 5528 Scanner::kNoSourcePos, |
5528 Symbols::AsyncOperation(), | 5529 Symbols::AsyncOperation(), |
5529 Type::ZoneHandle(I, Type::DynamicType())); | 5530 Type::ZoneHandle(I, Type::DynamicType())); |
5530 current_block_->scope->AddVariable(async_op_var); | 5531 current_block_->scope->AddVariable(async_op_var); |
5531 found = closure_body->scope()->CaptureVariable(Symbols::AsyncOperation()); | 5532 found = closure_body->scope()->CaptureVariable(Symbols::AsyncOperation()); |
5532 ASSERT(found); | 5533 ASSERT(found); |
5533 LocalVariable* async_completer = new (I) LocalVariable( | 5534 LocalVariable* async_completer = new (I) LocalVariable( |
5534 Scanner::kNoSourcePos, | 5535 Scanner::kNoSourcePos, |
5535 Symbols::AsyncCompleter(), | 5536 Symbols::AsyncCompleter(), |
5536 Type::ZoneHandle(I, Type::DynamicType())); | 5537 Type::ZoneHandle(I, Type::DynamicType())); |
5537 current_block_->scope->AddVariable(async_completer); | 5538 current_block_->scope->AddVariable(async_completer); |
5538 found = closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter()); | 5539 found = closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter()); |
5539 ASSERT(found); | 5540 ASSERT(found); |
| 5541 LocalVariable* await_jump_var = new (I) LocalVariable( |
| 5542 Scanner::kNoSourcePos, |
| 5543 Symbols::AwaitJumpVar(), |
| 5544 Type::ZoneHandle(I, Type::DynamicType())); |
| 5545 current_block_->scope->AddVariable(await_jump_var); |
| 5546 found = closure_body->scope()->CaptureVariable(Symbols::AwaitJumpVar()); |
| 5547 ASSERT(found); |
| 5548 LocalVariable* await_ctx_var = new (I) LocalVariable( |
| 5549 Scanner::kNoSourcePos, |
| 5550 Symbols::AwaitContextVar(), |
| 5551 Type::ZoneHandle(I, Type::DynamicType())); |
| 5552 current_block_->scope->AddVariable(await_ctx_var); |
| 5553 found = closure_body->scope()->CaptureVariable(Symbols::AwaitContextVar()); |
| 5554 ASSERT(found); |
5540 | 5555 |
5541 // Add to AST: | 5556 // Add to AST: |
5542 // :async_completer = new Completer(); | 5557 // :async_completer = new Completer(); |
5543 ArgumentListNode* empty_args = new (I) ArgumentListNode( | 5558 ArgumentListNode* empty_args = |
5544 Scanner::kNoSourcePos); | 5559 new (I) ArgumentListNode(Scanner::kNoSourcePos); |
5545 ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode( | 5560 ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode( |
5546 Scanner::kNoSourcePos, | 5561 Scanner::kNoSourcePos, |
5547 TypeArguments::ZoneHandle(I), | 5562 TypeArguments::ZoneHandle(I), |
5548 completer_constructor, | 5563 completer_constructor, |
5549 empty_args); | 5564 empty_args); |
5550 StoreLocalNode* store_completer = new (I) StoreLocalNode( | 5565 StoreLocalNode* store_completer = new (I) StoreLocalNode( |
5551 Scanner::kNoSourcePos, | 5566 Scanner::kNoSourcePos, |
5552 async_completer, | 5567 async_completer, |
5553 completer_constructor_node); | 5568 completer_constructor_node); |
5554 current_block_->statements->Add(store_completer); | 5569 current_block_->statements->Add(store_completer); |
(...skipping 30 matching lines...) Expand all Loading... |
5585 Symbols::CompleterFuture())); | 5600 Symbols::CompleterFuture())); |
5586 current_block_->statements->Add(return_node); | 5601 current_block_->statements->Add(return_node); |
5587 return CloseBlock(); | 5602 return CloseBlock(); |
5588 } | 5603 } |
5589 | 5604 |
5590 | 5605 |
5591 void Parser::CloseAsyncClosure(SequenceNode* body) { | 5606 void Parser::CloseAsyncClosure(SequenceNode* body) { |
5592 TRACE_PARSER("CloseAsyncClosure"); | 5607 TRACE_PARSER("CloseAsyncClosure"); |
5593 // We need a temporary expression to store intermediate return values. | 5608 // We need a temporary expression to store intermediate return values. |
5594 parsed_function()->EnsureExpressionTemp(); | 5609 parsed_function()->EnsureExpressionTemp(); |
| 5610 // Implicitly mark those variables below as captured. We currently mark all |
| 5611 // variables of all scopes as captured (below), but as soon as we do something |
| 5612 // smarter we rely on these internal variables to be available. |
| 5613 body->scope()->LookupVariable(Symbols::Completer(), false); |
| 5614 body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); |
| 5615 body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); |
| 5616 body->scope()->RecursivelyCaptureAllVariables(); |
5595 } | 5617 } |
5596 | 5618 |
5597 | 5619 |
5598 // Set up default values for all optional parameters to the function. | 5620 // Set up default values for all optional parameters to the function. |
5599 void Parser::SetupDefaultsForOptionalParams(const ParamList* params, | 5621 void Parser::SetupDefaultsForOptionalParams(const ParamList* params, |
5600 Array* default_values) { | 5622 Array* default_values) { |
5601 if (params->num_optional_parameters > 0) { | 5623 if (params->num_optional_parameters > 0) { |
5602 // Build array of default parameter values. | 5624 // Build array of default parameter values. |
5603 ParamDesc* param = | 5625 ParamDesc* param = |
5604 params->parameters->data() + params->num_fixed_parameters; | 5626 params->parameters->data() + params->num_fixed_parameters; |
(...skipping 5653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11258 void Parser::SkipQualIdent() { | 11280 void Parser::SkipQualIdent() { |
11259 ASSERT(IsIdentifier()); | 11281 ASSERT(IsIdentifier()); |
11260 ConsumeToken(); | 11282 ConsumeToken(); |
11261 if (CurrentToken() == Token::kPERIOD) { | 11283 if (CurrentToken() == Token::kPERIOD) { |
11262 ConsumeToken(); // Consume the kPERIOD token. | 11284 ConsumeToken(); // Consume the kPERIOD token. |
11263 ExpectIdentifier("identifier expected after '.'"); | 11285 ExpectIdentifier("identifier expected after '.'"); |
11264 } | 11286 } |
11265 } | 11287 } |
11266 | 11288 |
11267 } // namespace dart | 11289 } // namespace dart |
OLD | NEW |