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 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 String* dict_name; | 678 String* dict_name; |
679 ParamList params; | 679 ParamList params; |
680 RawFunction::Kind kind; | 680 RawFunction::Kind kind; |
681 // NULL for functions, field object for static or instance fields. | 681 // NULL for functions, field object for static or instance fields. |
682 Field* field_; | 682 Field* field_; |
683 }; | 683 }; |
684 | 684 |
685 | 685 |
686 class ClassDesc : public ValueObject { | 686 class ClassDesc : public ValueObject { |
687 public: | 687 public: |
688 ClassDesc(const Class& cls, | 688 ClassDesc(Zone* zone, |
| 689 const Class& cls, |
689 const String& cls_name, | 690 const String& cls_name, |
690 bool is_interface, | 691 bool is_interface, |
691 intptr_t token_pos) | 692 intptr_t token_pos) |
692 : clazz_(cls), | 693 : zone_(zone), |
| 694 clazz_(cls), |
693 class_name_(cls_name), | 695 class_name_(cls_name), |
694 token_pos_(token_pos), | 696 token_pos_(token_pos), |
695 functions_(GrowableObjectArray::Handle(GrowableObjectArray::New())), | 697 functions_(zone, 4), |
696 fields_(GrowableObjectArray::Handle(GrowableObjectArray::New())) { | 698 fields_(zone, 4) { |
697 } | 699 } |
698 | 700 |
699 void AddFunction(const Function& function) { | 701 void AddFunction(const Function& function) { |
700 functions_.Add(function); | 702 functions_.Add(&Function::ZoneHandle(zone_, function.raw())); |
701 } | 703 } |
702 | 704 |
703 const GrowableObjectArray& functions() const { | 705 const GrowableArray<const Function*>& functions() const { |
704 return functions_; | 706 return functions_; |
705 } | 707 } |
706 | 708 |
707 void AddField(const Field& field) { | 709 void AddField(const Field& field) { |
708 fields_.Add(field); | 710 fields_.Add(&Field::ZoneHandle(zone_, field.raw())); |
709 } | 711 } |
710 | 712 |
711 const GrowableObjectArray& fields() const { | 713 const GrowableArray<const Field*>& fields() const { |
712 return fields_; | 714 return fields_; |
713 } | 715 } |
714 | 716 |
715 const Class& clazz() const { | 717 const Class& clazz() const { |
716 return clazz_; | 718 return clazz_; |
717 } | 719 } |
718 | 720 |
719 const String& class_name() const { | 721 const String& class_name() const { |
720 return class_name_; | 722 return class_name_; |
721 } | 723 } |
722 | 724 |
723 bool has_constructor() const { | 725 bool has_constructor() const { |
724 Function& func = Function::Handle(); | 726 for (int i = 0; i < functions_.length(); i++) { |
725 for (int i = 0; i < functions_.Length(); i++) { | 727 const Function* func = functions_.At(i); |
726 func ^= functions_.At(i); | 728 if (func->kind() == RawFunction::kConstructor) { |
727 if (func.kind() == RawFunction::kConstructor) { | |
728 return true; | 729 return true; |
729 } | 730 } |
730 } | 731 } |
731 return false; | 732 return false; |
732 } | 733 } |
733 | 734 |
734 intptr_t token_pos() const { | 735 intptr_t token_pos() const { |
735 return token_pos_; | 736 return token_pos_; |
736 } | 737 } |
737 | 738 |
738 void AddMember(const MemberDesc& member) { | 739 void AddMember(const MemberDesc& member) { |
739 members_.Add(member); | 740 members_.Add(member); |
740 } | 741 } |
741 | 742 |
742 const GrowableArray<MemberDesc>& members() const { | 743 const GrowableArray<MemberDesc>& members() const { |
743 return members_; | 744 return members_; |
744 } | 745 } |
745 | 746 |
746 MemberDesc* LookupMember(const String& name) const { | 747 MemberDesc* LookupMember(const String& name) const { |
747 for (int i = 0; i < members_.length(); i++) { | 748 for (int i = 0; i < members_.length(); i++) { |
748 if (name.Equals(*members_[i].name)) { | 749 if (name.Equals(*members_[i].name)) { |
749 return &members_[i]; | 750 return &members_[i]; |
750 } | 751 } |
751 } | 752 } |
752 return NULL; | 753 return NULL; |
753 } | 754 } |
754 | 755 |
| 756 RawArray* MakeFunctionsArray() { |
| 757 const intptr_t len = functions_.length(); |
| 758 const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld)); |
| 759 for (intptr_t i = 0; i < len; i++) { |
| 760 res.SetAt(i, *functions_[i]); |
| 761 } |
| 762 return res.raw(); |
| 763 } |
| 764 |
755 private: | 765 private: |
| 766 Zone* zone_; |
756 const Class& clazz_; | 767 const Class& clazz_; |
757 const String& class_name_; | 768 const String& class_name_; |
758 intptr_t token_pos_; // Token index of "class" keyword. | 769 intptr_t token_pos_; // Token index of "class" keyword. |
759 GrowableObjectArray& functions_; | 770 GrowableArray<const Function*> functions_; |
760 GrowableObjectArray& fields_; | 771 GrowableArray<const Field*> fields_; |
761 GrowableArray<MemberDesc> members_; | 772 GrowableArray<MemberDesc> members_; |
762 }; | 773 }; |
763 | 774 |
764 | 775 |
765 struct TopLevel { | 776 class TopLevel : public ValueObject { |
766 TopLevel() : | 777 public: |
767 fields(GrowableObjectArray::Handle(GrowableObjectArray::New())), | 778 explicit TopLevel(Zone* zone) : |
768 functions(GrowableObjectArray::Handle(GrowableObjectArray::New())) { } | 779 zone_(zone), |
| 780 fields_(zone, 4), |
| 781 functions_(zone, 4) { } |
769 | 782 |
770 GrowableObjectArray& fields; | 783 void AddField(const Field& field) { |
771 GrowableObjectArray& functions; | 784 fields_.Add(&Field::ZoneHandle(zone_, field.raw())); |
| 785 } |
| 786 |
| 787 void AddFunction(const Function& function) { |
| 788 functions_.Add(&Function::ZoneHandle(zone_, function.raw())); |
| 789 } |
| 790 |
| 791 const GrowableArray<const Field*>& fields() const { |
| 792 return fields_; |
| 793 } |
| 794 |
| 795 const GrowableArray<const Function*>& functions() const { |
| 796 return functions_; |
| 797 } |
| 798 |
| 799 private: |
| 800 Zone* zone_; |
| 801 GrowableArray<const Field*> fields_; |
| 802 GrowableArray<const Function*> functions_; |
772 }; | 803 }; |
773 | 804 |
774 | 805 |
775 void Parser::ParseClass(const Class& cls) { | 806 void Parser::ParseClass(const Class& cls) { |
776 if (!cls.is_synthesized_class()) { | 807 if (!cls.is_synthesized_class()) { |
777 Thread* thread = Thread::Current(); | 808 Thread* thread = Thread::Current(); |
778 Zone* zone = thread->zone(); | 809 Zone* zone = thread->zone(); |
779 CSTAT_TIMER_SCOPE(thread, parser_timer); | 810 CSTAT_TIMER_SCOPE(thread, parser_timer); |
780 ASSERT(thread->long_jump_base()->IsSafeToJump()); | 811 ASSERT(thread->long_jump_base()->IsSafeToJump()); |
781 const Script& script = Script::Handle(zone, cls.script()); | 812 const Script& script = Script::Handle(zone, cls.script()); |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 const Script& script = Script::Handle( | 1203 const Script& script = Script::Handle( |
1173 Script::New(uri, source, RawScript::kSourceTag)); | 1204 Script::New(uri, source, RawScript::kSourceTag)); |
1174 const Library& owning_library = Library::Handle(owning_class.library()); | 1205 const Library& owning_library = Library::Handle(owning_class.library()); |
1175 const String& private_key = String::Handle(owning_library.private_key()); | 1206 const String& private_key = String::Handle(owning_library.private_key()); |
1176 script.Tokenize(private_key); | 1207 script.Tokenize(private_key); |
1177 const intptr_t token_pos = 0; | 1208 const intptr_t token_pos = 0; |
1178 Parser parser(script, owning_library, token_pos); | 1209 Parser parser(script, owning_library, token_pos); |
1179 parser.is_top_level_ = true; | 1210 parser.is_top_level_ = true; |
1180 parser.set_current_class(owning_class); | 1211 parser.set_current_class(owning_class); |
1181 const String& class_name = String::Handle(owning_class.Name()); | 1212 const String& class_name = String::Handle(owning_class.Name()); |
1182 ClassDesc members(owning_class, class_name, false, token_pos); | 1213 ClassDesc members(stack_zone.GetZone(), |
| 1214 owning_class, |
| 1215 class_name, |
| 1216 false, /* is_interface */ |
| 1217 token_pos); |
1183 const intptr_t metadata_pos = parser.SkipMetadata(); | 1218 const intptr_t metadata_pos = parser.SkipMetadata(); |
1184 parser.ParseClassMemberDefinition(&members, metadata_pos); | 1219 parser.ParseClassMemberDefinition(&members, metadata_pos); |
1185 ASSERT(members.functions().Length() == 1); | 1220 ASSERT(members.functions().length() == 1); |
1186 const Function& func = | 1221 const Function& func = *members.functions().At(0); |
1187 Function::ZoneHandle(Function::RawCast(members.functions().At(0))); | |
1188 func.set_eval_script(script); | 1222 func.set_eval_script(script); |
1189 ParsedFunction* parsed_function = new ParsedFunction(thread, func); | 1223 ParsedFunction* parsed_function = new ParsedFunction(thread, func); |
1190 Parser::ParseFunction(parsed_function); | 1224 Parser::ParseFunction(parsed_function); |
1191 return func.raw(); | 1225 return func.raw(); |
1192 } else { | 1226 } else { |
1193 const Error& error = Error::Handle(isolate->object_store()->sticky_error()); | 1227 const Error& error = Error::Handle(isolate->object_store()->sticky_error()); |
1194 isolate->object_store()->clear_sticky_error(); | 1228 isolate->object_store()->clear_sticky_error(); |
1195 return error.raw(); | 1229 return error.raw(); |
1196 } | 1230 } |
1197 UNREACHABLE(); | 1231 UNREACHABLE(); |
(...skipping 3405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4603 SkipMetadata(); | 4637 SkipMetadata(); |
4604 if (is_patch_source() && | 4638 if (is_patch_source() && |
4605 (CurrentToken() == Token::kIDENT) && | 4639 (CurrentToken() == Token::kIDENT) && |
4606 CurrentLiteral()->Equals("patch")) { | 4640 CurrentLiteral()->Equals("patch")) { |
4607 ConsumeToken(); | 4641 ConsumeToken(); |
4608 } else if (CurrentToken() == Token::kABSTRACT) { | 4642 } else if (CurrentToken() == Token::kABSTRACT) { |
4609 ConsumeToken(); | 4643 ConsumeToken(); |
4610 } | 4644 } |
4611 ExpectToken(Token::kCLASS); | 4645 ExpectToken(Token::kCLASS); |
4612 const intptr_t class_pos = TokenPos(); | 4646 const intptr_t class_pos = TokenPos(); |
4613 ClassDesc members(cls, class_name, false, class_pos); | 4647 ClassDesc members(Z, cls, class_name, false, class_pos); |
4614 while (CurrentToken() != Token::kLBRACE) { | 4648 while (CurrentToken() != Token::kLBRACE) { |
4615 ConsumeToken(); | 4649 ConsumeToken(); |
4616 } | 4650 } |
4617 ExpectToken(Token::kLBRACE); | 4651 ExpectToken(Token::kLBRACE); |
4618 while (CurrentToken() != Token::kRBRACE) { | 4652 while (CurrentToken() != Token::kRBRACE) { |
4619 intptr_t metadata_pos = SkipMetadata(); | 4653 intptr_t metadata_pos = SkipMetadata(); |
4620 ParseClassMemberDefinition(&members, metadata_pos); | 4654 ParseClassMemberDefinition(&members, metadata_pos); |
4621 } | 4655 } |
4622 ExpectToken(Token::kRBRACE); | 4656 ExpectToken(Token::kRBRACE); |
4623 | 4657 |
4624 CheckConstructors(&members); | 4658 CheckConstructors(&members); |
4625 | 4659 |
4626 // Need to compute this here since MakeArray() will clear the | 4660 // Need to compute this here since MakeArray() will clear the |
4627 // functions array in members. | 4661 // functions array in members. |
4628 const bool need_implicit_constructor = | 4662 const bool need_implicit_constructor = |
4629 !members.has_constructor() && !cls.is_patch(); | 4663 !members.has_constructor() && !cls.is_patch(); |
4630 | 4664 |
4631 cls.AddFields(members.fields()); | 4665 cls.AddFields(members.fields()); |
4632 | 4666 |
4633 // Creating a new array for functions marks the class as parsed. | 4667 // Creating a new array for functions marks the class as parsed. |
4634 const Array& array = Array::Handle(Z, Array::MakeArray(members.functions())); | 4668 Array& array = Array::Handle(Z, members.MakeFunctionsArray()); |
4635 cls.SetFunctions(array); | 4669 cls.SetFunctions(array); |
4636 | 4670 |
4637 // Add an implicit constructor if no explicit constructor is present. | 4671 // Add an implicit constructor if no explicit constructor is present. |
4638 // No implicit constructors are needed for patch classes. | 4672 // No implicit constructors are needed for patch classes. |
4639 if (need_implicit_constructor) { | 4673 if (need_implicit_constructor) { |
4640 AddImplicitConstructor(cls); | 4674 AddImplicitConstructor(cls); |
4641 } | 4675 } |
4642 | 4676 |
4643 if (cls.is_patch()) { | 4677 if (cls.is_patch()) { |
4644 // Apply the changes to the patched class looked up above. | 4678 // Apply the changes to the patched class looked up above. |
(...skipping 10 matching lines...) Expand all Loading... |
4655 | 4689 |
4656 | 4690 |
4657 void Parser::ParseEnumDefinition(const Class& cls) { | 4691 void Parser::ParseEnumDefinition(const Class& cls) { |
4658 TRACE_PARSER("ParseEnumDefinition"); | 4692 TRACE_PARSER("ParseEnumDefinition"); |
4659 INC_STAT(I, num_classes_compiled, 1); | 4693 INC_STAT(I, num_classes_compiled, 1); |
4660 | 4694 |
4661 SkipMetadata(); | 4695 SkipMetadata(); |
4662 ExpectToken(Token::kENUM); | 4696 ExpectToken(Token::kENUM); |
4663 | 4697 |
4664 const String& enum_name = String::Handle(Z, cls.Name()); | 4698 const String& enum_name = String::Handle(Z, cls.Name()); |
4665 ClassDesc enum_members(cls, enum_name, false, cls.token_pos()); | 4699 ClassDesc enum_members(Z, cls, enum_name, false, cls.token_pos()); |
4666 | 4700 |
4667 // Add instance field 'final int index'. | 4701 // Add instance field 'final int index'. |
4668 Field& index_field = Field::ZoneHandle(Z); | 4702 Field& index_field = Field::ZoneHandle(Z); |
4669 const Type& int_type = Type::Handle(Z, Type::IntType()); | 4703 const Type& int_type = Type::Handle(Z, Type::IntType()); |
4670 const Type& dynamic_type = Type::Handle(Type::DynamicType()); | 4704 const Type& dynamic_type = Type::Handle(Type::DynamicType()); |
4671 index_field = Field::New(Symbols::Index(), | 4705 index_field = Field::New(Symbols::Index(), |
4672 false, // Not static. | 4706 false, // Not static. |
4673 true, // Field is final. | 4707 true, // Field is final. |
4674 false, // Not const. | 4708 false, // Not const. |
4675 true, // Is reflectable. | 4709 true, // Is reflectable. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4813 enum_members.AddFunction(to_string_func); | 4847 enum_members.AddFunction(to_string_func); |
4814 | 4848 |
4815 // Clone the hashCode getter function from the helper class. | 4849 // Clone the hashCode getter function from the helper class. |
4816 Function& hash_code_func = Function::Handle(I, | 4850 Function& hash_code_func = Function::Handle(I, |
4817 helper_class.LookupDynamicFunctionAllowPrivate(Symbols::hashCode())); | 4851 helper_class.LookupDynamicFunctionAllowPrivate(Symbols::hashCode())); |
4818 ASSERT(!hash_code_func.IsNull()); | 4852 ASSERT(!hash_code_func.IsNull()); |
4819 hash_code_func = hash_code_func.Clone(cls); | 4853 hash_code_func = hash_code_func.Clone(cls); |
4820 enum_members.AddFunction(hash_code_func); | 4854 enum_members.AddFunction(hash_code_func); |
4821 | 4855 |
4822 cls.AddFields(enum_members.fields()); | 4856 cls.AddFields(enum_members.fields()); |
4823 const Array& functions = | 4857 const Array& functions = Array::Handle(Z, enum_members.MakeFunctionsArray()); |
4824 Array::Handle(Z, Array::MakeArray(enum_members.functions())); | |
4825 cls.SetFunctions(functions); | 4858 cls.SetFunctions(functions); |
4826 } | 4859 } |
4827 | 4860 |
4828 | 4861 |
4829 // Add an implicit constructor to the given class. | 4862 // Add an implicit constructor to the given class. |
4830 void Parser::AddImplicitConstructor(const Class& cls) { | 4863 void Parser::AddImplicitConstructor(const Class& cls) { |
4831 // The implicit constructor is unnamed, has no explicit parameter. | 4864 // The implicit constructor is unnamed, has no explicit parameter. |
4832 String& ctor_name = String::ZoneHandle(Z, cls.Name()); | 4865 String& ctor_name = String::ZoneHandle(Z, cls.Name()); |
4833 ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot()); | 4866 ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot()); |
4834 // To indicate that this is an implicit constructor, we set the | 4867 // To indicate that this is an implicit constructor, we set the |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5390 ReportError(name_pos, "setter for '%s' is already defined", | 5423 ReportError(name_pos, "setter for '%s' is already defined", |
5391 var_name.ToCString()); | 5424 var_name.ToCString()); |
5392 } | 5425 } |
5393 | 5426 |
5394 const bool is_reflectable = | 5427 const bool is_reflectable = |
5395 !(library_.is_dart_scheme() && library_.IsPrivate(var_name)); | 5428 !(library_.is_dart_scheme() && library_.IsPrivate(var_name)); |
5396 field = Field::New(var_name, is_static, is_final, is_const, is_reflectable, | 5429 field = Field::New(var_name, is_static, is_final, is_const, is_reflectable, |
5397 current_class(), name_pos); | 5430 current_class(), name_pos); |
5398 field.set_type(type); | 5431 field.set_type(type); |
5399 field.set_value(Object::null_instance()); | 5432 field.set_value(Object::null_instance()); |
5400 top_level->fields.Add(field); | 5433 top_level->AddField(field); |
5401 library_.AddObject(field, var_name); | 5434 library_.AddObject(field, var_name); |
5402 if (metadata_pos >= 0) { | 5435 if (metadata_pos >= 0) { |
5403 library_.AddFieldMetadata(field, metadata_pos); | 5436 library_.AddFieldMetadata(field, metadata_pos); |
5404 } | 5437 } |
5405 if (CurrentToken() == Token::kASSIGN) { | 5438 if (CurrentToken() == Token::kASSIGN) { |
5406 ConsumeToken(); | 5439 ConsumeToken(); |
5407 Instance& field_value = Instance::Handle(Z, Object::sentinel().raw()); | 5440 Instance& field_value = Instance::Handle(Z, Object::sentinel().raw()); |
5408 bool has_simple_literal = false; | 5441 bool has_simple_literal = false; |
5409 if (LookaheadToken(1) == Token::kSEMICOLON) { | 5442 if (LookaheadToken(1) == Token::kSEMICOLON) { |
5410 has_simple_literal = IsSimpleLiteral(type, &field_value); | 5443 has_simple_literal = IsSimpleLiteral(type, &field_value); |
(...skipping 12 matching lines...) Expand all Loading... |
5423 /* is_abstract = */ false, | 5456 /* is_abstract = */ false, |
5424 /* is_external = */ false, | 5457 /* is_external = */ false, |
5425 /* is_native = */ false, | 5458 /* is_native = */ false, |
5426 current_class(), | 5459 current_class(), |
5427 name_pos); | 5460 name_pos); |
5428 getter.set_result_type(type); | 5461 getter.set_result_type(type); |
5429 getter.set_is_debuggable(false); | 5462 getter.set_is_debuggable(false); |
5430 if (library_.is_dart_scheme() && library_.IsPrivate(var_name)) { | 5463 if (library_.is_dart_scheme() && library_.IsPrivate(var_name)) { |
5431 getter.set_is_reflectable(false); | 5464 getter.set_is_reflectable(false); |
5432 } | 5465 } |
5433 top_level->functions.Add(getter); | 5466 top_level->AddFunction(getter); |
5434 } | 5467 } |
5435 } else if (is_final) { | 5468 } else if (is_final) { |
5436 ReportError(name_pos, "missing initializer for final or const variable"); | 5469 ReportError(name_pos, "missing initializer for final or const variable"); |
5437 } | 5470 } |
5438 | 5471 |
5439 if (CurrentToken() == Token::kCOMMA) { | 5472 if (CurrentToken() == Token::kCOMMA) { |
5440 ConsumeToken(); | 5473 ConsumeToken(); |
5441 } else if (CurrentToken() == Token::kSEMICOLON) { | 5474 } else if (CurrentToken() == Token::kSEMICOLON) { |
5442 ConsumeToken(); | 5475 ConsumeToken(); |
5443 break; | 5476 break; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5568 is_native, | 5601 is_native, |
5569 current_class(), | 5602 current_class(), |
5570 decl_begin_pos)); | 5603 decl_begin_pos)); |
5571 func.set_result_type(result_type); | 5604 func.set_result_type(result_type); |
5572 func.set_end_token_pos(function_end_pos); | 5605 func.set_end_token_pos(function_end_pos); |
5573 func.set_modifier(func_modifier); | 5606 func.set_modifier(func_modifier); |
5574 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { | 5607 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { |
5575 func.set_is_reflectable(false); | 5608 func.set_is_reflectable(false); |
5576 } | 5609 } |
5577 AddFormalParamsToFunction(¶ms, func); | 5610 AddFormalParamsToFunction(¶ms, func); |
5578 top_level->functions.Add(func); | 5611 top_level->AddFunction(func); |
5579 if (!is_patch) { | 5612 if (!is_patch) { |
5580 library_.AddObject(func, func_name); | 5613 library_.AddObject(func, func_name); |
5581 } else { | 5614 } else { |
5582 library_.ReplaceObject(func, func_name); | 5615 library_.ReplaceObject(func, func_name); |
5583 } | 5616 } |
5584 if (metadata_pos >= 0) { | 5617 if (metadata_pos >= 0) { |
5585 library_.AddFunctionMetadata(func, metadata_pos); | 5618 library_.AddFunctionMetadata(func, metadata_pos); |
5586 } | 5619 } |
5587 } | 5620 } |
5588 | 5621 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5722 func.set_result_type(result_type); | 5755 func.set_result_type(result_type); |
5723 func.set_end_token_pos(accessor_end_pos); | 5756 func.set_end_token_pos(accessor_end_pos); |
5724 func.set_modifier(func_modifier); | 5757 func.set_modifier(func_modifier); |
5725 if (is_native) { | 5758 if (is_native) { |
5726 func.set_is_debuggable(false); | 5759 func.set_is_debuggable(false); |
5727 } | 5760 } |
5728 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { | 5761 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { |
5729 func.set_is_reflectable(false); | 5762 func.set_is_reflectable(false); |
5730 } | 5763 } |
5731 AddFormalParamsToFunction(¶ms, func); | 5764 AddFormalParamsToFunction(¶ms, func); |
5732 top_level->functions.Add(func); | 5765 top_level->AddFunction(func); |
5733 if (!is_patch) { | 5766 if (!is_patch) { |
5734 library_.AddObject(func, accessor_name); | 5767 library_.AddObject(func, accessor_name); |
5735 } else { | 5768 } else { |
5736 library_.ReplaceObject(func, accessor_name); | 5769 library_.ReplaceObject(func, accessor_name); |
5737 } | 5770 } |
5738 if (metadata_pos >= 0) { | 5771 if (metadata_pos >= 0) { |
5739 library_.AddFunctionMetadata(func, metadata_pos); | 5772 library_.AddFunctionMetadata(func, metadata_pos); |
5740 } | 5773 } |
5741 } | 5774 } |
5742 | 5775 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6033 void Parser::ParseTopLevel() { | 6066 void Parser::ParseTopLevel() { |
6034 TRACE_PARSER("ParseTopLevel"); | 6067 TRACE_PARSER("ParseTopLevel"); |
6035 // Collect the classes found at the top level in this growable array. | 6068 // Collect the classes found at the top level in this growable array. |
6036 // They need to be registered with class finalization after parsing | 6069 // They need to be registered with class finalization after parsing |
6037 // has been completed. | 6070 // has been completed. |
6038 ObjectStore* object_store = I->object_store(); | 6071 ObjectStore* object_store = I->object_store(); |
6039 const GrowableObjectArray& pending_classes = | 6072 const GrowableObjectArray& pending_classes = |
6040 GrowableObjectArray::Handle(Z, object_store->pending_classes()); | 6073 GrowableObjectArray::Handle(Z, object_store->pending_classes()); |
6041 SetPosition(0); | 6074 SetPosition(0); |
6042 is_top_level_ = true; | 6075 is_top_level_ = true; |
6043 TopLevel top_level; | 6076 TopLevel top_level(Z); |
6044 Class& toplevel_class = Class::Handle(Z, | 6077 Class& toplevel_class = Class::Handle(Z, |
6045 Class::New(Symbols::TopLevel(), script_, TokenPos())); | 6078 Class::New(Symbols::TopLevel(), script_, TokenPos())); |
6046 toplevel_class.set_library(library_); | 6079 toplevel_class.set_library(library_); |
6047 | 6080 |
6048 if (is_library_source() || is_patch_source()) { | 6081 if (is_library_source() || is_patch_source()) { |
6049 set_current_class(toplevel_class); | 6082 set_current_class(toplevel_class); |
6050 ParseLibraryDefinition(); | 6083 ParseLibraryDefinition(); |
6051 } else if (is_part_source()) { | 6084 } else if (is_part_source()) { |
6052 ParsePartHeader(); | 6085 ParsePartHeader(); |
6053 } | 6086 } |
(...skipping 26 matching lines...) Expand all Loading... |
6080 ParseTopLevelAccessor(&top_level, metadata_pos); | 6113 ParseTopLevelAccessor(&top_level, metadata_pos); |
6081 } else if (CurrentToken() == Token::kEOS) { | 6114 } else if (CurrentToken() == Token::kEOS) { |
6082 break; | 6115 break; |
6083 } else { | 6116 } else { |
6084 UnexpectedToken(); | 6117 UnexpectedToken(); |
6085 } | 6118 } |
6086 } | 6119 } |
6087 } | 6120 } |
6088 | 6121 |
6089 if ((library_.num_anonymous_classes() == 0) || | 6122 if ((library_.num_anonymous_classes() == 0) || |
6090 (top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) { | 6123 (top_level.fields().length() > 0) || |
6091 toplevel_class.AddFields(top_level.fields); | 6124 (top_level.functions().length() > 0)) { |
6092 | 6125 toplevel_class.AddFields(top_level.fields()); |
6093 const Array& array = Array::Handle(Z, | 6126 const intptr_t len = top_level.functions().length(); |
6094 Array::MakeArray(top_level.functions)); | 6127 const Array& array = Array::Handle(Z, Array::New(len, Heap::kOld)); |
| 6128 for (intptr_t i = 0; i < len; i++) { |
| 6129 array.SetAt(i, *top_level.functions()[i]); |
| 6130 } |
6095 toplevel_class.SetFunctions(array); | 6131 toplevel_class.SetFunctions(array); |
6096 | |
6097 library_.AddAnonymousClass(toplevel_class); | 6132 library_.AddAnonymousClass(toplevel_class); |
6098 pending_classes.Add(toplevel_class, Heap::kOld); | 6133 pending_classes.Add(toplevel_class, Heap::kOld); |
6099 } | 6134 } |
6100 } | 6135 } |
6101 | 6136 |
6102 | 6137 |
6103 void Parser::ChainNewBlock(LocalScope* outer_scope) { | 6138 void Parser::ChainNewBlock(LocalScope* outer_scope) { |
6104 Block* block = new(Z) Block( | 6139 Block* block = new(Z) Block( |
6105 current_block_, | 6140 current_block_, |
6106 outer_scope, | 6141 outer_scope, |
(...skipping 8176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14283 void Parser::SkipQualIdent() { | 14318 void Parser::SkipQualIdent() { |
14284 ASSERT(IsIdentifier()); | 14319 ASSERT(IsIdentifier()); |
14285 ConsumeToken(); | 14320 ConsumeToken(); |
14286 if (CurrentToken() == Token::kPERIOD) { | 14321 if (CurrentToken() == Token::kPERIOD) { |
14287 ConsumeToken(); // Consume the kPERIOD token. | 14322 ConsumeToken(); // Consume the kPERIOD token. |
14288 ExpectIdentifier("identifier expected after '.'"); | 14323 ExpectIdentifier("identifier expected after '.'"); |
14289 } | 14324 } |
14290 } | 14325 } |
14291 | 14326 |
14292 } // namespace dart | 14327 } // namespace dart |
OLD | NEW |