| 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 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 has_final = false; | 473 has_final = false; |
| 474 has_const = false; | 474 has_const = false; |
| 475 has_static = false; | 475 has_static = false; |
| 476 has_var = false; | 476 has_var = false; |
| 477 has_factory = false; | 477 has_factory = false; |
| 478 type = NULL; | 478 type = NULL; |
| 479 name_pos = 0; | 479 name_pos = 0; |
| 480 name = NULL; | 480 name = NULL; |
| 481 redirect_name = NULL; | 481 redirect_name = NULL; |
| 482 params.Clear(); | 482 params.Clear(); |
| 483 kind = RawFunction::kFunction; | 483 kind = RawFunction::kRegularFunction; |
| 484 } | 484 } |
| 485 bool IsConstructor() const { | 485 bool IsConstructor() const { |
| 486 return (kind == RawFunction::kConstructor) && !has_static; | 486 return (kind == RawFunction::kConstructor) && !has_static; |
| 487 } | 487 } |
| 488 bool IsFactory() const { | 488 bool IsFactory() const { |
| 489 return (kind == RawFunction::kConstructor) && has_static; | 489 return (kind == RawFunction::kConstructor) && has_static; |
| 490 } | 490 } |
| 491 bool IsFactoryOrConstructor() const { | 491 bool IsFactoryOrConstructor() const { |
| 492 return (kind == RawFunction::kConstructor); | 492 return (kind == RawFunction::kConstructor); |
| 493 } | 493 } |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 const intptr_t prev_ast_node_id = isolate->ast_node_id(); | 683 const intptr_t prev_ast_node_id = isolate->ast_node_id(); |
| 684 isolate->set_ast_node_id(0); | 684 isolate->set_ast_node_id(0); |
| 685 ASSERT(parsed_function != NULL); | 685 ASSERT(parsed_function != NULL); |
| 686 const Function& func = parsed_function->function(); | 686 const Function& func = parsed_function->function(); |
| 687 const Class& cls = Class::Handle(isolate, func.owner()); | 687 const Class& cls = Class::Handle(isolate, func.owner()); |
| 688 const Script& script = Script::Handle(isolate, cls.script()); | 688 const Script& script = Script::Handle(isolate, cls.script()); |
| 689 Parser parser(script, func, func.token_pos()); | 689 Parser parser(script, func, func.token_pos()); |
| 690 SequenceNode* node_sequence = NULL; | 690 SequenceNode* node_sequence = NULL; |
| 691 Array& default_parameter_values = Array::Handle(isolate, Array::null()); | 691 Array& default_parameter_values = Array::Handle(isolate, Array::null()); |
| 692 switch (func.kind()) { | 692 switch (func.kind()) { |
| 693 case RawFunction::kFunction: | 693 case RawFunction::kRegularFunction: |
| 694 case RawFunction::kClosureFunction: | 694 case RawFunction::kClosureFunction: |
| 695 case RawFunction::kGetterFunction: | 695 case RawFunction::kGetterFunction: |
| 696 case RawFunction::kSetterFunction: | 696 case RawFunction::kSetterFunction: |
| 697 case RawFunction::kConstructor: | 697 case RawFunction::kConstructor: |
| 698 node_sequence = parser.ParseFunc(func, default_parameter_values); | 698 node_sequence = parser.ParseFunc(func, default_parameter_values); |
| 699 break; | 699 break; |
| 700 case RawFunction::kImplicitGetter: | 700 case RawFunction::kImplicitGetter: |
| 701 ASSERT(!func.is_static()); | 701 ASSERT(!func.is_static()); |
| 702 node_sequence = parser.ParseInstanceGetter(func); | 702 node_sequence = parser.ParseInstanceGetter(func); |
| 703 break; | 703 break; |
| (...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2462 RawFunction::Kind function_kind; | 2462 RawFunction::Kind function_kind; |
| 2463 if (method->IsFactoryOrConstructor()) { | 2463 if (method->IsFactoryOrConstructor()) { |
| 2464 function_kind = RawFunction::kConstructor; | 2464 function_kind = RawFunction::kConstructor; |
| 2465 } else if (method->has_abstract) { | 2465 } else if (method->has_abstract) { |
| 2466 function_kind = RawFunction::kAbstract; | 2466 function_kind = RawFunction::kAbstract; |
| 2467 } else if (method->IsGetter()) { | 2467 } else if (method->IsGetter()) { |
| 2468 function_kind = RawFunction::kGetterFunction; | 2468 function_kind = RawFunction::kGetterFunction; |
| 2469 } else if (method->IsSetter()) { | 2469 } else if (method->IsSetter()) { |
| 2470 function_kind = RawFunction::kSetterFunction; | 2470 function_kind = RawFunction::kSetterFunction; |
| 2471 } else { | 2471 } else { |
| 2472 function_kind = RawFunction::kFunction; | 2472 function_kind = RawFunction::kRegularFunction; |
| 2473 } | 2473 } |
| 2474 Function& func = Function::Handle( | 2474 Function& func = Function::Handle( |
| 2475 Function::New(*method->name, | 2475 Function::New(*method->name, |
| 2476 function_kind, | 2476 function_kind, |
| 2477 method->has_static, | 2477 method->has_static, |
| 2478 method->has_const, | 2478 method->has_const, |
| 2479 method_pos)); | 2479 method_pos)); |
| 2480 func.set_result_type(*method->type); | 2480 func.set_result_type(*method->type); |
| 2481 func.set_end_token_pos(method_end_pos); | 2481 func.set_end_token_pos(method_end_pos); |
| 2482 | 2482 |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2772 (LookaheadToken(1) != Token::kCOMMA) && | 2772 (LookaheadToken(1) != Token::kCOMMA) && |
| 2773 (LookaheadToken(1) != Token::kSEMICOLON)) { | 2773 (LookaheadToken(1) != Token::kSEMICOLON)) { |
| 2774 ConsumeToken(); | 2774 ConsumeToken(); |
| 2775 if (!Token::CanBeOverloaded(CurrentToken())) { | 2775 if (!Token::CanBeOverloaded(CurrentToken())) { |
| 2776 ErrorMsg("invalid operator overloading"); | 2776 ErrorMsg("invalid operator overloading"); |
| 2777 } | 2777 } |
| 2778 if (member.has_static) { | 2778 if (member.has_static) { |
| 2779 ErrorMsg("operator overloading functions cannot be static"); | 2779 ErrorMsg("operator overloading functions cannot be static"); |
| 2780 } | 2780 } |
| 2781 operator_token = CurrentToken(); | 2781 operator_token = CurrentToken(); |
| 2782 member.kind = RawFunction::kFunction; | 2782 member.kind = RawFunction::kRegularFunction; |
| 2783 member.name_pos = this->TokenPos(); | 2783 member.name_pos = this->TokenPos(); |
| 2784 member.name = | 2784 member.name = |
| 2785 &String::ZoneHandle(String::NewSymbol(Token::Str(operator_token))); | 2785 &String::ZoneHandle(String::NewSymbol(Token::Str(operator_token))); |
| 2786 ConsumeToken(); | 2786 ConsumeToken(); |
| 2787 } else if (IsIdentifier()) { | 2787 } else if (IsIdentifier()) { |
| 2788 member.name = CurrentLiteral(); | 2788 member.name = CurrentLiteral(); |
| 2789 member.name_pos = TokenPos(); | 2789 member.name_pos = TokenPos(); |
| 2790 ConsumeToken(); | 2790 ConsumeToken(); |
| 2791 } else { | 2791 } else { |
| 2792 ErrorMsg("identifier expected"); | 2792 ErrorMsg("identifier expected"); |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3549 ConsumeToken(); | 3549 ConsumeToken(); |
| 3550 SkipExpr(); | 3550 SkipExpr(); |
| 3551 ExpectSemicolon(); | 3551 ExpectSemicolon(); |
| 3552 function_end_pos = TokenPos(); | 3552 function_end_pos = TokenPos(); |
| 3553 } else if (IsLiteral("native")) { | 3553 } else if (IsLiteral("native")) { |
| 3554 ParseNativeDeclaration(); | 3554 ParseNativeDeclaration(); |
| 3555 } else { | 3555 } else { |
| 3556 ErrorMsg("function block expected"); | 3556 ErrorMsg("function block expected"); |
| 3557 } | 3557 } |
| 3558 Function& func = Function::Handle( | 3558 Function& func = Function::Handle( |
| 3559 Function::New(func_name, RawFunction::kFunction, | 3559 Function::New(func_name, RawFunction::kRegularFunction, |
| 3560 is_static, false, function_pos)); | 3560 is_static, false, function_pos)); |
| 3561 func.set_result_type(result_type); | 3561 func.set_result_type(result_type); |
| 3562 func.set_end_token_pos(function_end_pos); | 3562 func.set_end_token_pos(function_end_pos); |
| 3563 AddFormalParamsToFunction(¶ms, func); | 3563 AddFormalParamsToFunction(¶ms, func); |
| 3564 top_level->functions.Add(func); | 3564 top_level->functions.Add(func); |
| 3565 library_.AddObject(func, func_name); | 3565 library_.AddObject(func, func_name); |
| 3566 } | 3566 } |
| 3567 | 3567 |
| 3568 | 3568 |
| 3569 void Parser::ParseTopLevelAccessor(TopLevel* top_level) { | 3569 void Parser::ParseTopLevelAccessor(TopLevel* top_level) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3642 is_static, false, accessor_pos)); | 3642 is_static, false, accessor_pos)); |
| 3643 func.set_result_type(result_type); | 3643 func.set_result_type(result_type); |
| 3644 AddFormalParamsToFunction(¶ms, func); | 3644 AddFormalParamsToFunction(¶ms, func); |
| 3645 top_level->functions.Add(func); | 3645 top_level->functions.Add(func); |
| 3646 library_.AddObject(func, accessor_name); | 3646 library_.AddObject(func, accessor_name); |
| 3647 } | 3647 } |
| 3648 | 3648 |
| 3649 | 3649 |
| 3650 void Parser::ParseLibraryName() { | 3650 void Parser::ParseLibraryName() { |
| 3651 TRACE_PARSER("ParseLibraryName"); | 3651 TRACE_PARSER("ParseLibraryName"); |
| 3652 if ((script_.kind() == RawScript::kLibrary) && | 3652 if ((script_.kind() == RawScript::kLibraryTag) && |
| 3653 (CurrentToken() != Token::kLIBRARY)) { | 3653 (CurrentToken() != Token::kLIBRARY)) { |
| 3654 // Handle error case early to get consistent error message. | 3654 // Handle error case early to get consistent error message. |
| 3655 ExpectToken(Token::kLIBRARY); | 3655 ExpectToken(Token::kLIBRARY); |
| 3656 } | 3656 } |
| 3657 if (CurrentToken() == Token::kLIBRARY) { | 3657 if (CurrentToken() == Token::kLIBRARY) { |
| 3658 ConsumeToken(); | 3658 ConsumeToken(); |
| 3659 ExpectToken(Token::kLPAREN); | 3659 ExpectToken(Token::kLPAREN); |
| 3660 if (CurrentToken() != Token::kSTRING) { | 3660 if (CurrentToken() != Token::kSTRING) { |
| 3661 ErrorMsg("library name expected"); | 3661 ErrorMsg("library name expected"); |
| 3662 } | 3662 } |
| (...skipping 5003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8666 void Parser::SkipQualIdent() { | 8666 void Parser::SkipQualIdent() { |
| 8667 ASSERT(IsIdentifier()); | 8667 ASSERT(IsIdentifier()); |
| 8668 ConsumeToken(); | 8668 ConsumeToken(); |
| 8669 if (CurrentToken() == Token::kPERIOD) { | 8669 if (CurrentToken() == Token::kPERIOD) { |
| 8670 ConsumeToken(); // Consume the kPERIOD token. | 8670 ConsumeToken(); // Consume the kPERIOD token. |
| 8671 ExpectIdentifier("identifier expected after '.'"); | 8671 ExpectIdentifier("identifier expected after '.'"); |
| 8672 } | 8672 } |
| 8673 } | 8673 } |
| 8674 | 8674 |
| 8675 } // namespace dart | 8675 } // namespace dart |
| OLD | NEW |