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/bootstrap.h" | 9 #include "vm/bootstrap.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 Parser parser(script, lib, cls.token_pos()); | 710 Parser parser(script, lib, cls.token_pos()); |
711 parser.ParseClassDefinition(cls); | 711 parser.ParseClassDefinition(cls); |
712 } | 712 } |
713 } | 713 } |
714 | 714 |
715 | 715 |
716 RawObject* Parser::ParseFunctionParameters(const Function& func) { | 716 RawObject* Parser::ParseFunctionParameters(const Function& func) { |
717 ASSERT(!func.IsNull()); | 717 ASSERT(!func.IsNull()); |
718 Isolate* isolate = Isolate::Current(); | 718 Isolate* isolate = Isolate::Current(); |
719 StackZone zone(isolate); | 719 StackZone zone(isolate); |
720 LongJump* base = isolate->long_jump_base(); | 720 LongJumpScope jump; |
721 LongJump jump; | |
722 isolate->set_long_jump_base(&jump); | |
723 if (setjmp(*jump.Set()) == 0) { | 721 if (setjmp(*jump.Set()) == 0) { |
724 const Script& script = Script::Handle(isolate, func.script()); | 722 const Script& script = Script::Handle(isolate, func.script()); |
725 const Class& owner = Class::Handle(isolate, func.Owner()); | 723 const Class& owner = Class::Handle(isolate, func.Owner()); |
726 ASSERT(!owner.IsNull()); | 724 ASSERT(!owner.IsNull()); |
727 ParsedFunction* parsed_function = new ParsedFunction( | 725 ParsedFunction* parsed_function = new ParsedFunction( |
728 Function::ZoneHandle(func.raw())); | 726 Function::ZoneHandle(func.raw())); |
729 Parser parser(script, parsed_function, func.token_pos()); | 727 Parser parser(script, parsed_function, func.token_pos()); |
730 parser.SkipFunctionPreamble(); | 728 parser.SkipFunctionPreamble(); |
731 ParamList params; | 729 ParamList params; |
732 parser.ParseFormalParameterList(true, true, ¶ms); | 730 parser.ParseFormalParameterList(true, true, ¶ms); |
733 ParamDesc* param = params.parameters->data(); | 731 ParamDesc* param = params.parameters->data(); |
734 const int param_cnt = params.num_fixed_parameters + | 732 const int param_cnt = params.num_fixed_parameters + |
735 params.num_optional_parameters; | 733 params.num_optional_parameters; |
736 const Array& param_descriptor = | 734 const Array& param_descriptor = |
737 Array::Handle(Array::New(param_cnt * kParameterEntrySize)); | 735 Array::Handle(Array::New(param_cnt * kParameterEntrySize)); |
738 for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) { | 736 for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) { |
739 param_descriptor.SetAt(j + kParameterIsFinalOffset, | 737 param_descriptor.SetAt(j + kParameterIsFinalOffset, |
740 param[i].is_final ? Bool::True() : Bool::False()); | 738 param[i].is_final ? Bool::True() : Bool::False()); |
741 param_descriptor.SetAt(j + kParameterDefaultValueOffset, | 739 param_descriptor.SetAt(j + kParameterDefaultValueOffset, |
742 (param[i].default_value == NULL) ? Object::null_instance() : | 740 (param[i].default_value == NULL) ? Object::null_instance() : |
743 *(param[i].default_value)); | 741 *(param[i].default_value)); |
744 const Object* metadata = param[i].metadata; | 742 const Object* metadata = param[i].metadata; |
745 if ((metadata != NULL) && (*metadata).IsError()) { | 743 if ((metadata != NULL) && (*metadata).IsError()) { |
746 isolate->set_long_jump_base(base); | |
747 return metadata->raw(); // Error evaluating the metadata. | 744 return metadata->raw(); // Error evaluating the metadata. |
748 } | 745 } |
749 param_descriptor.SetAt(j + kParameterMetadataOffset, | 746 param_descriptor.SetAt(j + kParameterMetadataOffset, |
750 (param[i].metadata == NULL) ? Object::null_instance() : | 747 (param[i].metadata == NULL) ? Object::null_instance() : |
751 *(param[i].metadata)); | 748 *(param[i].metadata)); |
752 } | 749 } |
753 isolate->set_long_jump_base(base); | |
754 return param_descriptor.raw(); | 750 return param_descriptor.raw(); |
755 } else { | 751 } else { |
756 Error& error = Error::Handle(); | 752 Error& error = Error::Handle(); |
757 error = isolate->object_store()->sticky_error(); | 753 error = isolate->object_store()->sticky_error(); |
758 isolate->object_store()->clear_sticky_error(); | 754 isolate->object_store()->clear_sticky_error(); |
759 isolate->set_long_jump_base(base); | |
760 return error.raw(); | 755 return error.raw(); |
761 } | 756 } |
762 UNREACHABLE(); | 757 UNREACHABLE(); |
763 return Object::null(); | 758 return Object::null(); |
764 } | 759 } |
765 | 760 |
766 | 761 |
767 void Parser::ParseFunction(ParsedFunction* parsed_function) { | 762 void Parser::ParseFunction(ParsedFunction* parsed_function) { |
768 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); | 763 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); |
769 Isolate* isolate = Isolate::Current(); | 764 Isolate* isolate = Isolate::Current(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 } | 844 } |
850 } | 845 } |
851 | 846 |
852 parsed_function->set_default_parameter_values(default_parameter_values); | 847 parsed_function->set_default_parameter_values(default_parameter_values); |
853 } | 848 } |
854 | 849 |
855 | 850 |
856 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { | 851 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { |
857 Isolate* isolate = Isolate::Current(); | 852 Isolate* isolate = Isolate::Current(); |
858 StackZone zone(isolate); | 853 StackZone zone(isolate); |
859 LongJump* base = isolate->long_jump_base(); | 854 LongJumpScope jump; |
860 LongJump jump; | |
861 isolate->set_long_jump_base(&jump); | |
862 if (setjmp(*jump.Set()) == 0) { | 855 if (setjmp(*jump.Set()) == 0) { |
863 const Script& script = Script::Handle(cls.script()); | 856 const Script& script = Script::Handle(cls.script()); |
864 const Library& lib = Library::Handle(cls.library()); | 857 const Library& lib = Library::Handle(cls.library()); |
865 Parser parser(script, lib, token_pos); | 858 Parser parser(script, lib, token_pos); |
866 parser.set_current_class(cls); | 859 parser.set_current_class(cls); |
867 parser.set_parsing_metadata(true); | 860 parser.set_parsing_metadata(true); |
868 | 861 |
869 RawObject* metadata = parser.EvaluateMetadata(); | 862 RawObject* metadata = parser.EvaluateMetadata(); |
870 isolate->set_long_jump_base(base); | |
871 return metadata; | 863 return metadata; |
872 } else { | 864 } else { |
873 Error& error = Error::Handle(); | 865 Error& error = Error::Handle(); |
874 error = isolate->object_store()->sticky_error(); | 866 error = isolate->object_store()->sticky_error(); |
875 isolate->object_store()->clear_sticky_error(); | 867 isolate->object_store()->clear_sticky_error(); |
876 isolate->set_long_jump_base(base); | |
877 return error.raw(); | 868 return error.raw(); |
878 } | 869 } |
879 UNREACHABLE(); | 870 UNREACHABLE(); |
880 return Object::null(); | 871 return Object::null(); |
881 } | 872 } |
882 | 873 |
883 | 874 |
884 RawArray* Parser::EvaluateMetadata() { | 875 RawArray* Parser::EvaluateMetadata() { |
885 CheckToken(Token::kAT, "Metadata character '@' expected"); | 876 CheckToken(Token::kAT, "Metadata character '@' expected"); |
886 GrowableObjectArray& meta_values = | 877 GrowableObjectArray& meta_values = |
(...skipping 9873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10760 void Parser::SkipQualIdent() { | 10751 void Parser::SkipQualIdent() { |
10761 ASSERT(IsIdentifier()); | 10752 ASSERT(IsIdentifier()); |
10762 ConsumeToken(); | 10753 ConsumeToken(); |
10763 if (CurrentToken() == Token::kPERIOD) { | 10754 if (CurrentToken() == Token::kPERIOD) { |
10764 ConsumeToken(); // Consume the kPERIOD token. | 10755 ConsumeToken(); // Consume the kPERIOD token. |
10765 ExpectIdentifier("identifier expected after '.'"); | 10756 ExpectIdentifier("identifier expected after '.'"); |
10766 } | 10757 } |
10767 } | 10758 } |
10768 | 10759 |
10769 } // namespace dart | 10760 } // namespace dart |
OLD | NEW |