| 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 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 } | 437 } |
| 438 | 438 |
| 439 | 439 |
| 440 void Parser::set_current_class(const Class& value) { | 440 void Parser::set_current_class(const Class& value) { |
| 441 current_class_ = value.raw(); | 441 current_class_ = value.raw(); |
| 442 } | 442 } |
| 443 | 443 |
| 444 | 444 |
| 445 void Parser::SetPosition(intptr_t position) { | 445 void Parser::SetPosition(intptr_t position) { |
| 446 if (position < TokenPos() && position != 0) { | 446 if (position < TokenPos() && position != 0) { |
| 447 CompilerStats::num_tokens_rewind += (TokenPos() - position); | 447 INC_STAT(I, num_tokens_rewind, (TokenPos() - position)); |
| 448 } | 448 } |
| 449 tokens_iterator_.SetCurrentPosition(position); | 449 tokens_iterator_.SetCurrentPosition(position); |
| 450 token_kind_ = Token::kILLEGAL; | 450 token_kind_ = Token::kILLEGAL; |
| 451 } | 451 } |
| 452 | 452 |
| 453 | 453 |
| 454 void Parser::ParseCompilationUnit(const Library& library, | 454 void Parser::ParseCompilationUnit(const Library& library, |
| 455 const Script& script) { | 455 const Script& script) { |
| 456 Isolate* isolate = Isolate::Current(); | 456 Isolate* isolate = Isolate::Current(); |
| 457 ASSERT(isolate->long_jump_base()->IsSafeToJump()); | 457 ASSERT(isolate->long_jump_base()->IsSafeToJump()); |
| 458 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); | 458 CSTAT_TIMER_SCOPE(isolate, parser_timer); |
| 459 VMTagScope tagScope(isolate, VMTag::kCompileTopLevelTagId); | 459 VMTagScope tagScope(isolate, VMTag::kCompileTopLevelTagId); |
| 460 Parser parser(script, library, 0); | 460 Parser parser(script, library, 0); |
| 461 parser.ParseTopLevel(); | 461 parser.ParseTopLevel(); |
| 462 } | 462 } |
| 463 | 463 |
| 464 | 464 |
| 465 void Parser::ComputeCurrentToken() { | 465 void Parser::ComputeCurrentToken() { |
| 466 ASSERT(token_kind_ == Token::kILLEGAL); | 466 ASSERT(token_kind_ == Token::kILLEGAL); |
| 467 token_kind_ = tokens_iterator_.CurrentTokenKind(); | 467 token_kind_ = tokens_iterator_.CurrentTokenKind(); |
| 468 if (token_kind_ == Token::kERROR) { | 468 if (token_kind_ == Token::kERROR) { |
| 469 ReportError(TokenPos(), "%s", CurrentLiteral()->ToCString()); | 469 ReportError(TokenPos(), "%s", CurrentLiteral()->ToCString()); |
| 470 } | 470 } |
| 471 } | 471 } |
| 472 | 472 |
| 473 | 473 |
| 474 Token::Kind Parser::LookaheadToken(int num_tokens) { | 474 Token::Kind Parser::LookaheadToken(int num_tokens) { |
| 475 CompilerStats::num_tokens_lookahead++; | 475 INC_STAT(I, num_tokens_lookahead, 1); |
| 476 CompilerStats::num_token_checks++; | 476 INC_STAT(I, num_token_checks, 1); |
| 477 return tokens_iterator_.LookaheadTokenKind(num_tokens); | 477 return tokens_iterator_.LookaheadTokenKind(num_tokens); |
| 478 } | 478 } |
| 479 | 479 |
| 480 | 480 |
| 481 String* Parser::CurrentLiteral() const { | 481 String* Parser::CurrentLiteral() const { |
| 482 String& result = | 482 String& result = |
| 483 String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral()); | 483 String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral()); |
| 484 return &result; | 484 return &result; |
| 485 } | 485 } |
| 486 | 486 |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 functions(GrowableObjectArray::Handle(GrowableObjectArray::New())) { } | 767 functions(GrowableObjectArray::Handle(GrowableObjectArray::New())) { } |
| 768 | 768 |
| 769 GrowableObjectArray& fields; | 769 GrowableObjectArray& fields; |
| 770 GrowableObjectArray& functions; | 770 GrowableObjectArray& functions; |
| 771 }; | 771 }; |
| 772 | 772 |
| 773 | 773 |
| 774 void Parser::ParseClass(const Class& cls) { | 774 void Parser::ParseClass(const Class& cls) { |
| 775 if (!cls.is_synthesized_class()) { | 775 if (!cls.is_synthesized_class()) { |
| 776 Isolate* isolate = Isolate::Current(); | 776 Isolate* isolate = Isolate::Current(); |
| 777 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); | 777 CSTAT_TIMER_SCOPE(isolate, parser_timer); |
| 778 ASSERT(isolate->long_jump_base()->IsSafeToJump()); | 778 ASSERT(isolate->long_jump_base()->IsSafeToJump()); |
| 779 const Script& script = Script::Handle(isolate, cls.script()); | 779 const Script& script = Script::Handle(isolate, cls.script()); |
| 780 const Library& lib = Library::Handle(isolate, cls.library()); | 780 const Library& lib = Library::Handle(isolate, cls.library()); |
| 781 Parser parser(script, lib, cls.token_pos()); | 781 Parser parser(script, lib, cls.token_pos()); |
| 782 parser.ParseClassDefinition(cls); | 782 parser.ParseClassDefinition(cls); |
| 783 } else if (cls.is_enum_class()) { | 783 } else if (cls.is_enum_class()) { |
| 784 Isolate* isolate = Isolate::Current(); | 784 Isolate* isolate = Isolate::Current(); |
| 785 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); | 785 CSTAT_TIMER_SCOPE(isolate, parser_timer); |
| 786 ASSERT(isolate->long_jump_base()->IsSafeToJump()); | 786 ASSERT(isolate->long_jump_base()->IsSafeToJump()); |
| 787 const Script& script = Script::Handle(isolate, cls.script()); | 787 const Script& script = Script::Handle(isolate, cls.script()); |
| 788 const Library& lib = Library::Handle(isolate, cls.library()); | 788 const Library& lib = Library::Handle(isolate, cls.library()); |
| 789 Parser parser(script, lib, cls.token_pos()); | 789 Parser parser(script, lib, cls.token_pos()); |
| 790 parser.ParseEnumDefinition(cls); | 790 parser.ParseEnumDefinition(cls); |
| 791 } | 791 } |
| 792 } | 792 } |
| 793 | 793 |
| 794 | 794 |
| 795 RawObject* Parser::ParseFunctionParameters(const Function& func) { | 795 RawObject* Parser::ParseFunctionParameters(const Function& func) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 return error.raw(); | 836 return error.raw(); |
| 837 } | 837 } |
| 838 UNREACHABLE(); | 838 UNREACHABLE(); |
| 839 return Object::null(); | 839 return Object::null(); |
| 840 } | 840 } |
| 841 | 841 |
| 842 | 842 |
| 843 void Parser::ParseFunction(ParsedFunction* parsed_function) { | 843 void Parser::ParseFunction(ParsedFunction* parsed_function) { |
| 844 Isolate* isolate = parsed_function->isolate(); | 844 Isolate* isolate = parsed_function->isolate(); |
| 845 Zone* zone = parsed_function->zone(); | 845 Zone* zone = parsed_function->zone(); |
| 846 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); | 846 CSTAT_TIMER_SCOPE(isolate, parser_timer); |
| 847 CompilerStats::num_functions_compiled++; | 847 INC_STAT(isolate, num_functions_compiled, 1); |
| 848 ASSERT(isolate->long_jump_base()->IsSafeToJump()); | 848 ASSERT(isolate->long_jump_base()->IsSafeToJump()); |
| 849 ASSERT(parsed_function != NULL); | 849 ASSERT(parsed_function != NULL); |
| 850 const Function& func = parsed_function->function(); | 850 const Function& func = parsed_function->function(); |
| 851 const Script& script = Script::Handle(zone, func.script()); | 851 const Script& script = Script::Handle(zone, func.script()); |
| 852 Parser parser(script, parsed_function, func.token_pos()); | 852 Parser parser(script, parsed_function, func.token_pos()); |
| 853 SequenceNode* node_sequence = NULL; | 853 SequenceNode* node_sequence = NULL; |
| 854 Array& default_parameter_values = Array::ZoneHandle(zone, Array::null()); | 854 Array& default_parameter_values = Array::ZoneHandle(zone, Array::null()); |
| 855 switch (func.kind()) { | 855 switch (func.kind()) { |
| 856 case RawFunction::kClosureFunction: | 856 case RawFunction::kClosureFunction: |
| 857 if (func.IsImplicitClosureFunction()) { | 857 if (func.IsImplicitClosureFunction()) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 875 case RawFunction::kImplicitGetter: | 875 case RawFunction::kImplicitGetter: |
| 876 ASSERT(!func.is_static()); | 876 ASSERT(!func.is_static()); |
| 877 node_sequence = parser.ParseInstanceGetter(func); | 877 node_sequence = parser.ParseInstanceGetter(func); |
| 878 break; | 878 break; |
| 879 case RawFunction::kImplicitSetter: | 879 case RawFunction::kImplicitSetter: |
| 880 ASSERT(!func.is_static()); | 880 ASSERT(!func.is_static()); |
| 881 node_sequence = parser.ParseInstanceSetter(func); | 881 node_sequence = parser.ParseInstanceSetter(func); |
| 882 break; | 882 break; |
| 883 case RawFunction::kImplicitStaticFinalGetter: | 883 case RawFunction::kImplicitStaticFinalGetter: |
| 884 node_sequence = parser.ParseStaticFinalGetter(func); | 884 node_sequence = parser.ParseStaticFinalGetter(func); |
| 885 CompilerStats::num_implicit_final_getters++; | 885 INC_STAT(isolate, num_implicit_final_getters, 1); |
| 886 break; | 886 break; |
| 887 case RawFunction::kMethodExtractor: | 887 case RawFunction::kMethodExtractor: |
| 888 node_sequence = parser.ParseMethodExtractor(func); | 888 node_sequence = parser.ParseMethodExtractor(func); |
| 889 break; | 889 break; |
| 890 case RawFunction::kNoSuchMethodDispatcher: | 890 case RawFunction::kNoSuchMethodDispatcher: |
| 891 node_sequence = | 891 node_sequence = |
| 892 parser.ParseNoSuchMethodDispatcher(func, &default_parameter_values); | 892 parser.ParseNoSuchMethodDispatcher(func, &default_parameter_values); |
| 893 break; | 893 break; |
| 894 case RawFunction::kInvokeFieldDispatcher: | 894 case RawFunction::kInvokeFieldDispatcher: |
| 895 node_sequence = | 895 node_sequence = |
| (...skipping 3589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4485 } else { | 4485 } else { |
| 4486 CheckToken(Token::kLBRACE); | 4486 CheckToken(Token::kLBRACE); |
| 4487 SkipBlock(); | 4487 SkipBlock(); |
| 4488 ExpectToken(Token::kRBRACE); | 4488 ExpectToken(Token::kRBRACE); |
| 4489 } | 4489 } |
| 4490 } | 4490 } |
| 4491 | 4491 |
| 4492 | 4492 |
| 4493 void Parser::ParseClassDefinition(const Class& cls) { | 4493 void Parser::ParseClassDefinition(const Class& cls) { |
| 4494 TRACE_PARSER("ParseClassDefinition"); | 4494 TRACE_PARSER("ParseClassDefinition"); |
| 4495 CompilerStats::num_classes_compiled++; | 4495 INC_STAT(I, num_classes_compiled, 1); |
| 4496 set_current_class(cls); | 4496 set_current_class(cls); |
| 4497 is_top_level_ = true; | 4497 is_top_level_ = true; |
| 4498 String& class_name = String::Handle(Z, cls.Name()); | 4498 String& class_name = String::Handle(Z, cls.Name()); |
| 4499 SkipMetadata(); | 4499 SkipMetadata(); |
| 4500 if (is_patch_source() && | 4500 if (is_patch_source() && |
| 4501 (CurrentToken() == Token::kIDENT) && | 4501 (CurrentToken() == Token::kIDENT) && |
| 4502 CurrentLiteral()->Equals("patch")) { | 4502 CurrentLiteral()->Equals("patch")) { |
| 4503 ConsumeToken(); | 4503 ConsumeToken(); |
| 4504 } else if (CurrentToken() == Token::kABSTRACT) { | 4504 } else if (CurrentToken() == Token::kABSTRACT) { |
| 4505 ConsumeToken(); | 4505 ConsumeToken(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4545 Error& error = Error::Handle(Z); | 4545 Error& error = Error::Handle(Z); |
| 4546 if (!orig_class.ApplyPatch(cls, &error)) { | 4546 if (!orig_class.ApplyPatch(cls, &error)) { |
| 4547 Report::LongJumpF(error, script_, class_pos, "applying patch failed"); | 4547 Report::LongJumpF(error, script_, class_pos, "applying patch failed"); |
| 4548 } | 4548 } |
| 4549 } | 4549 } |
| 4550 } | 4550 } |
| 4551 | 4551 |
| 4552 | 4552 |
| 4553 void Parser::ParseEnumDefinition(const Class& cls) { | 4553 void Parser::ParseEnumDefinition(const Class& cls) { |
| 4554 TRACE_PARSER("ParseEnumDefinition"); | 4554 TRACE_PARSER("ParseEnumDefinition"); |
| 4555 CompilerStats::num_classes_compiled++; | 4555 INC_STAT(I, num_classes_compiled, 1); |
| 4556 | 4556 |
| 4557 SkipMetadata(); | 4557 SkipMetadata(); |
| 4558 ExpectToken(Token::kENUM); | 4558 ExpectToken(Token::kENUM); |
| 4559 | 4559 |
| 4560 const String& enum_name = String::Handle(Z, cls.Name()); | 4560 const String& enum_name = String::Handle(Z, cls.Name()); |
| 4561 ClassDesc enum_members(cls, enum_name, false, cls.token_pos()); | 4561 ClassDesc enum_members(cls, enum_name, false, cls.token_pos()); |
| 4562 | 4562 |
| 4563 // Add instance field 'final int index'. | 4563 // Add instance field 'final int index'. |
| 4564 Field& index_field = Field::ZoneHandle(Z); | 4564 Field& index_field = Field::ZoneHandle(Z); |
| 4565 const Type& int_type = Type::Handle(Z, Type::IntType()); | 4565 const Type& int_type = Type::Handle(Z, Type::IntType()); |
| (...skipping 8912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13478 void Parser::SkipQualIdent() { | 13478 void Parser::SkipQualIdent() { |
| 13479 ASSERT(IsIdentifier()); | 13479 ASSERT(IsIdentifier()); |
| 13480 ConsumeToken(); | 13480 ConsumeToken(); |
| 13481 if (CurrentToken() == Token::kPERIOD) { | 13481 if (CurrentToken() == Token::kPERIOD) { |
| 13482 ConsumeToken(); // Consume the kPERIOD token. | 13482 ConsumeToken(); // Consume the kPERIOD token. |
| 13483 ExpectIdentifier("identifier expected after '.'"); | 13483 ExpectIdentifier("identifier expected after '.'"); |
| 13484 } | 13484 } |
| 13485 } | 13485 } |
| 13486 | 13486 |
| 13487 } // namespace dart | 13487 } // namespace dart |
| OLD | NEW |