Chromium Code Reviews| 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 "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
| (...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 ASSERT(!func.is_static()); | 749 ASSERT(!func.is_static()); |
| 750 node_sequence = parser.ParseInstanceGetter(func); | 750 node_sequence = parser.ParseInstanceGetter(func); |
| 751 break; | 751 break; |
| 752 case RawFunction::kImplicitSetter: | 752 case RawFunction::kImplicitSetter: |
| 753 ASSERT(!func.is_static()); | 753 ASSERT(!func.is_static()); |
| 754 node_sequence = parser.ParseInstanceSetter(func); | 754 node_sequence = parser.ParseInstanceSetter(func); |
| 755 break; | 755 break; |
| 756 case RawFunction::kConstImplicitGetter: | 756 case RawFunction::kConstImplicitGetter: |
| 757 node_sequence = parser.ParseStaticConstGetter(func); | 757 node_sequence = parser.ParseStaticConstGetter(func); |
| 758 break; | 758 break; |
| 759 case RawFunction::kMethodExtractor: | |
| 760 node_sequence = parser.ParseMethodExtractor(func); | |
| 761 break; | |
| 759 default: | 762 default: |
| 760 UNREACHABLE(); | 763 UNREACHABLE(); |
| 761 } | 764 } |
| 762 | 765 |
| 763 if (!HasReturnNode(node_sequence)) { | 766 if (!HasReturnNode(node_sequence)) { |
| 764 // Add implicit return node. | 767 // Add implicit return node. |
| 765 node_sequence->Add(new ReturnNode(func.end_token_pos())); | 768 node_sequence->Add(new ReturnNode(func.end_token_pos())); |
| 766 } | 769 } |
| 767 if (parser.expression_temp_ != NULL) { | 770 if (parser.expression_temp_ != NULL) { |
| 768 parsed_function->set_expression_temp_var(parser.expression_temp_); | 771 parsed_function->set_expression_temp_var(parser.expression_temp_); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 977 | 980 |
| 978 StoreInstanceFieldNode* store_field = | 981 StoreInstanceFieldNode* store_field = |
| 979 new StoreInstanceFieldNode(ident_pos, receiver, field, value); | 982 new StoreInstanceFieldNode(ident_pos, receiver, field, value); |
| 980 | 983 |
| 981 current_block_->statements->Add(store_field); | 984 current_block_->statements->Add(store_field); |
| 982 current_block_->statements->Add(new ReturnNode(ident_pos)); | 985 current_block_->statements->Add(new ReturnNode(ident_pos)); |
| 983 return CloseBlock(); | 986 return CloseBlock(); |
| 984 } | 987 } |
| 985 | 988 |
| 986 | 989 |
| 990 SequenceNode* Parser::ParseMethodExtractor(const Function& func) { | |
| 991 TRACE_PARSER("ParseMethodExtractor"); | |
| 992 ParamList params; | |
| 993 | |
| 994 // func.token_pos() points to the name of the field. | |
|
Ivan Posva
2013/01/17 08:03:20
I don't think this comment is correct. The token_p
Vyacheslav Egorov (Google)
2013/01/17 12:46:38
Indeed it is not. token_pos is 0 actually.
| |
| 995 intptr_t ident_pos = func.token_pos(); | |
| 996 ASSERT(current_class().raw() == func.Owner()); | |
| 997 params.AddReceiver(ReceiverType(ident_pos)); | |
| 998 ASSERT(func.num_fixed_parameters() == 1); // receiver. | |
| 999 ASSERT(!func.HasOptionalParameters()); | |
| 1000 | |
| 1001 // Build local scope for function and populate with the formal parameters. | |
| 1002 OpenFunctionBlock(func); | |
| 1003 AddFormalParamsToScope(¶ms, current_block_->scope); | |
| 1004 | |
| 1005 // Receiver is local 0. | |
| 1006 LocalVariable* receiver = current_block_->scope->VariableAt(0); | |
| 1007 LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver); | |
| 1008 | |
| 1009 ClosureNode* closure = new ClosureNode( | |
| 1010 ident_pos, | |
| 1011 Function::ZoneHandle(func.extracted_method_closure()), | |
| 1012 load_receiver, | |
| 1013 NULL); | |
| 1014 | |
| 1015 ReturnNode* return_node = new ReturnNode(ident_pos, closure); | |
| 1016 current_block_->statements->Add(return_node); | |
| 1017 return CloseBlock(); | |
| 1018 } | |
| 1019 | |
| 1020 | |
| 987 void Parser::SkipBlock() { | 1021 void Parser::SkipBlock() { |
| 988 ASSERT(CurrentToken() == Token::kLBRACE); | 1022 ASSERT(CurrentToken() == Token::kLBRACE); |
| 989 GrowableArray<Token::Kind> token_stack(8); | 1023 GrowableArray<Token::Kind> token_stack(8); |
| 990 const intptr_t block_start_pos = TokenPos(); | 1024 const intptr_t block_start_pos = TokenPos(); |
| 991 bool is_match = true; | 1025 bool is_match = true; |
| 992 bool unexpected_token_found = false; | 1026 bool unexpected_token_found = false; |
| 993 Token::Kind token; | 1027 Token::Kind token; |
| 994 intptr_t token_pos; | 1028 intptr_t token_pos; |
| 995 do { | 1029 do { |
| 996 token = CurrentToken(); | 1030 token = CurrentToken(); |
| (...skipping 8709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9706 void Parser::SkipQualIdent() { | 9740 void Parser::SkipQualIdent() { |
| 9707 ASSERT(IsIdentifier()); | 9741 ASSERT(IsIdentifier()); |
| 9708 ConsumeToken(); | 9742 ConsumeToken(); |
| 9709 if (CurrentToken() == Token::kPERIOD) { | 9743 if (CurrentToken() == Token::kPERIOD) { |
| 9710 ConsumeToken(); // Consume the kPERIOD token. | 9744 ConsumeToken(); // Consume the kPERIOD token. |
| 9711 ExpectIdentifier("identifier expected after '.'"); | 9745 ExpectIdentifier("identifier expected after '.'"); |
| 9712 } | 9746 } |
| 9713 } | 9747 } |
| 9714 | 9748 |
| 9715 } // namespace dart | 9749 } // namespace dart |
| OLD | NEW |