OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 #if !defined(DART_PRECOMPILED_RUNTIME) | 4 #if !defined(DART_PRECOMPILED_RUNTIME) |
5 | 5 |
6 #include "platform/globals.h" | 6 #include "platform/globals.h" |
7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
8 #include "vm/growable_array.h" | 8 #include "vm/growable_array.h" |
9 #include "vm/kernel.h" | 9 #include "vm/kernel.h" |
10 #include "vm/kernel_to_il.h" | 10 #include "vm/kernel_to_il.h" |
(...skipping 15 matching lines...) Expand all Loading... | |
26 | 26 |
27 | 27 |
28 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; | 28 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; |
29 | 29 |
30 | 30 |
31 // Keep in sync with package:dynamo/lib/binary/tag.dart | 31 // Keep in sync with package:dynamo/lib/binary/tag.dart |
32 enum Tag { | 32 enum Tag { |
33 kNothing = 0, | 33 kNothing = 0, |
34 kSomething = 1, | 34 kSomething = 1, |
35 | 35 |
36 kNormalClass = 2, | 36 kClass = 2, |
37 kMixinClass = 3, | |
38 | 37 |
39 kField = 4, | 38 kField = 4, |
40 kConstructor = 5, | 39 kConstructor = 5, |
41 kProcedure = 6, | 40 kProcedure = 6, |
42 | 41 |
43 kInvalidInitializer = 7, | 42 kInvalidInitializer = 7, |
44 kFieldInitializer = 8, | 43 kFieldInitializer = 8, |
45 kSuperInitializer = 9, | 44 kSuperInitializer = 9, |
46 kRedirectingInitializer = 10, | 45 kRedirectingInitializer = 10, |
47 kLocalInitializer = 11, | 46 kLocalInitializer = 11, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
116 | 115 |
117 kInvalidType = 90, | 116 kInvalidType = 90, |
118 kDynamicType = 91, | 117 kDynamicType = 91, |
119 kVoidType = 92, | 118 kVoidType = 92, |
120 kInterfaceType = 93, | 119 kInterfaceType = 93, |
121 kFunctionType = 94, | 120 kFunctionType = 94, |
122 kTypeParameterType = 95, | 121 kTypeParameterType = 95, |
123 kSimpleInterfaceType = 96, | 122 kSimpleInterfaceType = 96, |
124 kSimpleFunctionType = 97, | 123 kSimpleFunctionType = 97, |
125 | 124 |
126 kNullReference = 99, | |
127 kNormalClassReference = 100, | |
128 kMixinClassReference = 101, | |
129 | |
130 kLibraryFieldReference = 102, | |
131 kClassFieldReference = 103, | |
132 kClassConstructorReference = 104, | |
133 kLibraryProcedureReference = 105, | |
134 kClassProcedureReference = 106, | |
135 | |
136 kSpecializedTagHighBit = 0x80, // 10000000 | 125 kSpecializedTagHighBit = 0x80, // 10000000 |
137 kSpecializedTagMask = 0xF8, // 11111000 | 126 kSpecializedTagMask = 0xF8, // 11111000 |
138 kSpecializedPayloadMask = 0x7, // 00000111 | 127 kSpecializedPayloadMask = 0x7, // 00000111 |
139 | 128 |
140 kSpecializedVariableGet = 128, | 129 kSpecializedVariableGet = 128, |
141 kSpecializedVariableSet = 136, | 130 kSpecializedVariableSet = 136, |
142 kSpecialIntLiteral = 144, | 131 kSpecialIntLiteral = 144, |
143 }; | 132 }; |
144 | 133 |
145 | 134 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
314 Program* program() { return program_; } | 303 Program* program() { return program_; } |
315 void set_program(Program* program) { program_ = program; } | 304 void set_program(Program* program) { program_ = program; } |
316 | 305 |
317 BlockStack<VariableDeclaration>& variables() { return scope_; } | 306 BlockStack<VariableDeclaration>& variables() { return scope_; } |
318 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } | 307 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } |
319 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } | 308 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } |
320 | 309 |
321 BlockStack<LabeledStatement>* labels() { return labels_; } | 310 BlockStack<LabeledStatement>* labels() { return labels_; } |
322 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } | 311 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } |
323 | 312 |
313 CanonicalName* GetCanonicalName(int index) { return canonical_names_[index]; } | |
314 void SetCanonicalName(int index, CanonicalName* name) { | |
315 canonical_names_[index] = name; | |
316 } | |
317 void SetCanonicalNameCount(int count) { canonical_names_.SetLength(count); } | |
318 | |
324 private: | 319 private: |
325 Program* program_; | 320 Program* program_; |
321 MallocGrowableArray<Ref<CanonicalName> > canonical_names_; | |
kustermann
2017/02/01 13:00:55
This will leak the memory forever! Similar to the
asgerf
2017/02/02 12:30:28
It is here to support linking in the VM by reading
kustermann
2017/02/03 11:48:20
Normally I'd argue that we should do one thing at
asgerf
2017/02/03 12:47:38
Acknowledged.
| |
326 BlockStack<VariableDeclaration> scope_; | 322 BlockStack<VariableDeclaration> scope_; |
327 BlockStack<TypeParameter> type_parameters_; | 323 BlockStack<TypeParameter> type_parameters_; |
328 BlockStack<SwitchCase> switch_cases_; | 324 BlockStack<SwitchCase> switch_cases_; |
329 BlockStack<LabeledStatement>* labels_; | 325 BlockStack<LabeledStatement>* labels_; |
330 }; | 326 }; |
331 | 327 |
332 | 328 |
333 class Reader { | 329 class Reader { |
334 public: | 330 public: |
335 Reader(const uint8_t* buffer, int64_t size) | 331 Reader(const uint8_t* buffer, int64_t size) |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
454 return RT::ReadFrom(this); | 450 return RT::ReadFrom(this); |
455 } | 451 } |
456 | 452 |
457 template <typename T> | 453 template <typename T> |
458 T* ReadOptional() { | 454 T* ReadOptional() { |
459 return ReadOptional<T, T>(); | 455 return ReadOptional<T, T>(); |
460 } | 456 } |
461 | 457 |
462 ReaderHelper* helper() { return &builder_; } | 458 ReaderHelper* helper() { return &builder_; } |
463 | 459 |
460 CanonicalName* ReadCanonicalNameReference() { | |
461 int index = ReadUInt(); | |
462 if (index == 0) return NULL; | |
463 CanonicalName* name = builder_.GetCanonicalName(index - 1); | |
464 ASSERT(name != NULL); | |
465 return name; | |
466 } | |
467 | |
464 private: | 468 private: |
465 const uint8_t* buffer_; | 469 const uint8_t* buffer_; |
466 int64_t size_; | 470 int64_t size_; |
467 int64_t offset_; | 471 int64_t offset_; |
468 ReaderHelper builder_; | 472 ReaderHelper builder_; |
469 TokenPosition max_position_; | 473 TokenPosition max_position_; |
470 TokenPosition min_position_; | 474 TokenPosition min_position_; |
471 intptr_t current_script_id_; | 475 intptr_t current_script_id_; |
472 | 476 |
473 friend class PositionScope; | 477 friend class PositionScope; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 } | 641 } |
638 line_starts_[i] = line_starts; | 642 line_starts_[i] = line_starts; |
639 } | 643 } |
640 } | 644 } |
641 | 645 |
642 | 646 |
643 Library* Library::ReadFrom(Reader* reader) { | 647 Library* Library::ReadFrom(Reader* reader) { |
644 TRACE_READ_OFFSET(); | 648 TRACE_READ_OFFSET(); |
645 int flags = reader->ReadFlags(); | 649 int flags = reader->ReadFlags(); |
646 ASSERT(flags == 0); // external libraries not supported | 650 ASSERT(flags == 0); // external libraries not supported |
651 | |
652 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | |
653 ASSERT(canonical_name != NULL); | |
654 canonical_name->LinkTo(this); | |
655 | |
647 name_ = Reference::ReadStringFrom(reader); | 656 name_ = Reference::ReadStringFrom(reader); |
648 import_uri_ = Reference::ReadStringFrom(reader); | 657 import_uri_ = canonical_name->name(); |
649 source_uri_index_ = reader->ReadUInt(); | 658 source_uri_index_ = reader->ReadUInt(); |
650 reader->set_current_script_id(source_uri_index_); | 659 reader->set_current_script_id(source_uri_index_); |
651 | 660 |
652 int num_classes = reader->ReadUInt(); | 661 int num_classes = reader->ReadUInt(); |
653 classes().EnsureInitialized(num_classes); | 662 classes().EnsureInitialized(num_classes); |
654 for (int i = 0; i < num_classes; i++) { | 663 for (int i = 0; i < num_classes; i++) { |
655 Tag tag = reader->ReadTag(); | 664 Tag tag = reader->ReadTag(); |
656 if (tag == kNormalClass) { | 665 if (tag == kClass) { |
kustermann
2017/02/01 13:00:55
Theoretically we can get rid of this byte in the
asgerf
2017/02/02 12:30:28
But the redundancy does make debugging a bit nicer
| |
657 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); | 666 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); |
658 klass->ReadFrom(reader); | 667 klass->ReadFrom(reader); |
659 } else { | 668 } else { |
660 ASSERT(tag == kMixinClass); | 669 FATAL("Mixin application."); |
661 MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this); | 670 // ASSERT(tag == kMixinClass); |
662 klass->ReadFrom(reader); | 671 // MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this); |
672 // klass->ReadFrom(reader); | |
663 } | 673 } |
kustermann
2017/02/01 13:00:55
Remove the else branch and ASSERT(tag == kClass);
asgerf
2017/02/02 12:30:28
Done.
| |
664 } | 674 } |
665 | 675 |
666 fields().ReadFrom<Field>(reader, this); | 676 fields().ReadFrom<Field>(reader, this); |
667 procedures().ReadFrom<Procedure>(reader, this); | 677 procedures().ReadFrom<Procedure>(reader, this); |
668 return this; | 678 return this; |
669 } | 679 } |
670 | 680 |
671 | 681 |
672 Class* Class::ReadFrom(Reader* reader) { | 682 Class* Class::ReadFrom(Reader* reader) { |
673 TRACE_READ_OFFSET(); | 683 TRACE_READ_OFFSET(); |
674 | 684 |
685 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | |
686 ASSERT(canonical_name != NULL); | |
687 canonical_name->LinkTo(this); | |
675 position_ = reader->ReadPosition(); | 688 position_ = reader->ReadPosition(); |
676 is_abstract_ = reader->ReadBool(); | 689 is_abstract_ = reader->ReadBool(); |
677 name_ = Reference::ReadStringFrom(reader); | 690 name_ = Reference::ReadStringFrom(reader); |
678 source_uri_index_ = reader->ReadUInt(); | 691 source_uri_index_ = reader->ReadUInt(); |
679 reader->set_current_script_id(source_uri_index_); | 692 reader->set_current_script_id(source_uri_index_); |
680 annotations_.ReadFromStatic<Expression>(reader); | 693 annotations_.ReadFromStatic<Expression>(reader); |
681 | 694 |
682 return this; | 695 return this; |
683 } | 696 } |
684 | 697 |
685 | 698 |
686 NormalClass* NormalClass::ReadFrom(Reader* reader) { | 699 NormalClass* NormalClass::ReadFrom(Reader* reader) { |
687 TRACE_READ_OFFSET(); | 700 TRACE_READ_OFFSET(); |
688 Class::ReadFrom(reader); | 701 Class::ReadFrom(reader); |
689 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 702 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
690 | 703 |
691 type_parameters_.ReadFrom(reader); | 704 type_parameters_.ReadFrom(reader); |
692 DartType* type = reader->ReadOptional<DartType>(); | 705 DartType* type = reader->ReadOptional<DartType>(); |
693 | 706 |
694 super_class_ = InterfaceType::Cast(type); | 707 super_class_ = InterfaceType::Cast(type); |
708 reader->ReadOptional<DartType>(); // Mixed-in type is unused. | |
695 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 709 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
696 reader); | 710 reader); |
697 fields_.ReadFrom<Field>(reader, this); | 711 fields_.ReadFrom<Field>(reader, this); |
698 constructors_.ReadFrom<Constructor>(reader, this); | 712 constructors_.ReadFrom<Constructor>(reader, this); |
699 procedures_.ReadFrom<Procedure>(reader, this); | 713 procedures_.ReadFrom<Procedure>(reader, this); |
700 | 714 |
701 return this; | 715 return this; |
702 } | 716 } |
703 | 717 |
704 | 718 |
705 MixinClass* MixinClass::ReadFrom(Reader* reader) { | 719 MixinClass* MixinClass::ReadFrom(Reader* reader) { |
706 TRACE_READ_OFFSET(); | 720 TRACE_READ_OFFSET(); |
707 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 721 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
708 | 722 |
709 Class::ReadFrom(reader); | 723 Class::ReadFrom(reader); |
710 type_parameters_.ReadFrom(reader); | 724 type_parameters_.ReadFrom(reader); |
711 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 725 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
712 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 726 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
713 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 727 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
714 reader); | 728 reader); |
715 constructors_.ReadFrom<Constructor>(reader, this); | 729 constructors_.ReadFrom<Constructor>(reader, this); |
716 return this; | 730 return this; |
717 } | 731 } |
718 | 732 |
719 | 733 |
720 Member* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { | 734 CanonicalName* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
721 TRACE_READ_OFFSET(); | 735 TRACE_READ_OFFSET(); |
722 | 736 |
723 Program* program = reader->helper()->program(); | 737 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
724 Tag tag = reader->ReadTag(); | 738 if (canonical_name == NULL && !allow_null) { |
725 switch (tag) { | 739 FATAL("Expected a valid member reference, but got `null`"); |
726 case kLibraryFieldReference: { | |
727 int library_idx = reader->ReadUInt(); | |
728 int field_idx = reader->ReadUInt(); | |
729 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | |
730 return library->fields().GetOrCreate<Field>(field_idx, library); | |
731 } | |
732 case kLibraryProcedureReference: { | |
733 int library_idx = reader->ReadUInt(); | |
734 int procedure_idx = reader->ReadUInt(); | |
735 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | |
736 return library->procedures().GetOrCreate<Procedure>(procedure_idx, | |
737 library); | |
738 } | |
739 case kClassFieldReference: | |
740 case kClassConstructorReference: | |
741 case kClassProcedureReference: { | |
742 Class* klass = Reference::ReadClassFrom(reader); | |
743 if (tag == kClassFieldReference) { | |
744 int field_idx = reader->ReadUInt(); | |
745 return klass->fields().GetOrCreate<Field>(field_idx, klass); | |
746 } else if (tag == kClassConstructorReference) { | |
747 int constructor_idx = reader->ReadUInt(); | |
748 return klass->constructors().GetOrCreate<Constructor>(constructor_idx, | |
749 klass); | |
750 } else { | |
751 ASSERT(tag == kClassProcedureReference); | |
752 int procedure_idx = reader->ReadUInt(); | |
753 return klass->procedures().GetOrCreate<Procedure>(procedure_idx, klass); | |
754 } | |
755 } | |
756 case kNullReference: | |
757 if (allow_null) { | |
758 return NULL; | |
759 } else { | |
760 FATAL("Expected a valid member reference, but got `null`"); | |
761 } | |
762 default: | |
763 UNREACHABLE(); | |
764 break; | |
765 } | 740 } |
766 | 741 |
767 UNREACHABLE(); | 742 if (canonical_name != NULL) { |
768 return NULL; | 743 canonical_name->set_referenced(true); |
744 } | |
745 | |
746 return canonical_name; | |
769 } | 747 } |
770 | 748 |
771 | 749 |
772 Class* Reference::ReadClassFrom(Reader* reader, bool allow_null) { | 750 CanonicalName* Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
773 TRACE_READ_OFFSET(); | 751 TRACE_READ_OFFSET(); |
774 Program* program = reader->helper()->program(); | |
775 | 752 |
776 Tag klass_member_tag = reader->ReadTag(); | 753 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
777 if (klass_member_tag == kNullReference) { | 754 if (canonical_name == NULL && !allow_null) { |
778 if (allow_null) { | 755 FATAL("Expected a valid class reference, but got `null`"); |
779 return NULL; | |
780 } else { | |
781 FATAL("Expected a valid class reference but got `null`."); | |
782 } | |
783 } | 756 } |
784 int library_idx = reader->ReadUInt(); | |
785 int class_idx = reader->ReadUInt(); | |
786 | 757 |
787 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | 758 if (canonical_name != NULL) { |
788 Class* klass; | 759 canonical_name->set_referenced(true); |
789 if (klass_member_tag == kNormalClassReference) { | |
790 klass = library->classes().GetOrCreate<NormalClass>(class_idx, library); | |
791 } else { | |
792 ASSERT(klass_member_tag == kMixinClassReference); | |
793 klass = library->classes().GetOrCreate<MixinClass>(class_idx, library); | |
794 } | 760 } |
795 return klass; | 761 |
762 return canonical_name; | |
796 } | 763 } |
797 | 764 |
798 | 765 |
799 String* Reference::ReadStringFrom(Reader* reader) { | 766 String* Reference::ReadStringFrom(Reader* reader) { |
800 int index = reader->ReadUInt(); | 767 int index = reader->ReadUInt(); |
801 return reader->helper()->program()->string_table().strings()[index]; | 768 return reader->helper()->program()->string_table().strings()[index]; |
802 } | 769 } |
803 | 770 |
804 | 771 |
805 Field* Field::ReadFrom(Reader* reader) { | 772 Field* Field::ReadFrom(Reader* reader) { |
806 TRACE_READ_OFFSET(); | 773 TRACE_READ_OFFSET(); |
807 Tag tag = reader->ReadTag(); | 774 Tag tag = reader->ReadTag(); |
808 ASSERT(tag == kField); | 775 ASSERT(tag == kField); |
809 | 776 |
777 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | |
778 ASSERT(canonical_name != NULL); | |
779 canonical_name->LinkTo(this); | |
kustermann
2017/02/01 13:00:55
You could add another method to Reader:
Canonical
asgerf
2017/02/02 12:30:28
Done.
| |
780 | |
810 position_ = reader->ReadPosition(); | 781 position_ = reader->ReadPosition(); |
811 end_position_ = reader->ReadPosition(); | 782 end_position_ = reader->ReadPosition(); |
812 flags_ = reader->ReadFlags(); | 783 flags_ = reader->ReadFlags(); |
813 name_ = Name::ReadFrom(reader); | 784 name_ = Name::ReadFrom(reader); |
814 source_uri_index_ = reader->ReadUInt(); | 785 source_uri_index_ = reader->ReadUInt(); |
815 reader->set_current_script_id(source_uri_index_); | 786 reader->set_current_script_id(source_uri_index_); |
816 annotations_.ReadFromStatic<Expression>(reader); | 787 annotations_.ReadFromStatic<Expression>(reader); |
817 type_ = DartType::ReadFrom(reader); | 788 type_ = DartType::ReadFrom(reader); |
818 inferred_value_ = reader->ReadOptional<InferredValue>(); | 789 inferred_value_ = reader->ReadOptional<InferredValue>(); |
819 initializer_ = reader->ReadOptional<Expression>(); | 790 initializer_ = reader->ReadOptional<Expression>(); |
820 return this; | 791 return this; |
821 } | 792 } |
822 | 793 |
823 | 794 |
824 Constructor* Constructor::ReadFrom(Reader* reader) { | 795 Constructor* Constructor::ReadFrom(Reader* reader) { |
825 TRACE_READ_OFFSET(); | 796 TRACE_READ_OFFSET(); |
826 Tag tag = reader->ReadTag(); | 797 Tag tag = reader->ReadTag(); |
827 ASSERT(tag == kConstructor); | 798 ASSERT(tag == kConstructor); |
828 | 799 |
800 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | |
801 ASSERT(canonical_name != NULL); | |
802 canonical_name->LinkTo(this); | |
803 | |
829 VariableScope<ReaderHelper> parameters(reader->helper()); | 804 VariableScope<ReaderHelper> parameters(reader->helper()); |
830 position_ = reader->ReadPosition(); | 805 position_ = reader->ReadPosition(); |
831 end_position_ = reader->ReadPosition(); | 806 end_position_ = reader->ReadPosition(); |
832 flags_ = reader->ReadFlags(); | 807 flags_ = reader->ReadFlags(); |
833 name_ = Name::ReadFrom(reader); | 808 name_ = Name::ReadFrom(reader); |
834 annotations_.ReadFromStatic<Expression>(reader); | 809 annotations_.ReadFromStatic<Expression>(reader); |
835 function_ = FunctionNode::ReadFrom(reader); | 810 function_ = FunctionNode::ReadFrom(reader); |
836 initializers_.ReadFromStatic<Initializer>(reader); | 811 initializers_.ReadFromStatic<Initializer>(reader); |
837 return this; | 812 return this; |
838 } | 813 } |
839 | 814 |
840 | 815 |
841 Procedure* Procedure::ReadFrom(Reader* reader) { | 816 Procedure* Procedure::ReadFrom(Reader* reader) { |
842 TRACE_READ_OFFSET(); | 817 TRACE_READ_OFFSET(); |
843 Tag tag = reader->ReadTag(); | 818 Tag tag = reader->ReadTag(); |
844 ASSERT(tag == kProcedure); | 819 ASSERT(tag == kProcedure); |
845 | 820 |
821 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | |
822 ASSERT(canonical_name != NULL); | |
823 canonical_name->LinkTo(this); | |
824 | |
846 VariableScope<ReaderHelper> parameters(reader->helper()); | 825 VariableScope<ReaderHelper> parameters(reader->helper()); |
847 position_ = reader->ReadPosition(); | 826 position_ = reader->ReadPosition(); |
848 end_position_ = reader->ReadPosition(); | 827 end_position_ = reader->ReadPosition(); |
849 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 828 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
850 flags_ = reader->ReadFlags(); | 829 flags_ = reader->ReadFlags(); |
851 name_ = Name::ReadFrom(reader); | 830 name_ = Name::ReadFrom(reader); |
852 source_uri_index_ = reader->ReadUInt(); | 831 source_uri_index_ = reader->ReadUInt(); |
853 reader->set_current_script_id(source_uri_index_); | 832 reader->set_current_script_id(source_uri_index_); |
854 annotations_.ReadFromStatic<Expression>(reader); | 833 annotations_.ReadFromStatic<Expression>(reader); |
855 function_ = reader->ReadOptional<FunctionNode>(); | 834 function_ = reader->ReadOptional<FunctionNode>(); |
(...skipping 24 matching lines...) Expand all Loading... | |
880 | 859 |
881 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { | 860 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { |
882 TRACE_READ_OFFSET(); | 861 TRACE_READ_OFFSET(); |
883 return new InvalidInitializer(); | 862 return new InvalidInitializer(); |
884 } | 863 } |
885 | 864 |
886 | 865 |
887 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { | 866 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { |
888 TRACE_READ_OFFSET(); | 867 TRACE_READ_OFFSET(); |
889 FieldInitializer* initializer = new FieldInitializer(); | 868 FieldInitializer* initializer = new FieldInitializer(); |
890 initializer->field_ = Field::Cast(Reference::ReadMemberFrom(reader)); | 869 initializer->field_reference_ = Reference::ReadMemberFrom(reader, false); |
891 initializer->value_ = Expression::ReadFrom(reader); | 870 initializer->value_ = Expression::ReadFrom(reader); |
892 return initializer; | 871 return initializer; |
893 } | 872 } |
894 | 873 |
895 | 874 |
896 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { | 875 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { |
897 TRACE_READ_OFFSET(); | 876 TRACE_READ_OFFSET(); |
898 SuperInitializer* init = new SuperInitializer(); | 877 SuperInitializer* init = new SuperInitializer(); |
899 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 878 init->target_reference_ = Reference::ReadMemberFrom(reader, false); |
900 init->arguments_ = Arguments::ReadFrom(reader); | 879 init->arguments_ = Arguments::ReadFrom(reader); |
901 return init; | 880 return init; |
902 } | 881 } |
903 | 882 |
904 | 883 |
905 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { | 884 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { |
906 TRACE_READ_OFFSET(); | 885 TRACE_READ_OFFSET(); |
907 RedirectingInitializer* init = new RedirectingInitializer(); | 886 RedirectingInitializer* init = new RedirectingInitializer(); |
908 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 887 init->target_reference_ = Reference::ReadMemberFrom(reader, false); |
kustermann
2017/02/01 13:00:55
If you explicitly pass 'false' everywhere, then ge
asgerf
2017/02/02 12:30:28
No, it was just here. I've removed the redundant a
| |
909 init->arguments_ = Arguments::ReadFrom(reader); | 888 init->arguments_ = Arguments::ReadFrom(reader); |
910 return init; | 889 return init; |
911 } | 890 } |
912 | 891 |
913 | 892 |
914 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { | 893 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { |
915 TRACE_READ_OFFSET(); | 894 TRACE_READ_OFFSET(); |
916 LocalInitializer* init = new LocalInitializer(); | 895 LocalInitializer* init = new LocalInitializer(); |
917 init->variable_ = VariableDeclaration::ReadFromImpl(reader); | 896 init->variable_ = VariableDeclaration::ReadFromImpl(reader); |
918 return init; | 897 return init; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1063 return set; | 1042 return set; |
1064 } | 1043 } |
1065 | 1044 |
1066 | 1045 |
1067 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { | 1046 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { |
1068 TRACE_READ_OFFSET(); | 1047 TRACE_READ_OFFSET(); |
1069 PropertyGet* get = new PropertyGet(); | 1048 PropertyGet* get = new PropertyGet(); |
1070 get->position_ = reader->ReadPosition(); | 1049 get->position_ = reader->ReadPosition(); |
1071 get->receiver_ = Expression::ReadFrom(reader); | 1050 get->receiver_ = Expression::ReadFrom(reader); |
1072 get->name_ = Name::ReadFrom(reader); | 1051 get->name_ = Name::ReadFrom(reader); |
1073 get->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1052 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
1074 return get; | 1053 return get; |
1075 } | 1054 } |
1076 | 1055 |
1077 | 1056 |
1078 PropertySet* PropertySet::ReadFrom(Reader* reader) { | 1057 PropertySet* PropertySet::ReadFrom(Reader* reader) { |
1079 TRACE_READ_OFFSET(); | 1058 TRACE_READ_OFFSET(); |
1080 PropertySet* set = new PropertySet(); | 1059 PropertySet* set = new PropertySet(); |
1081 set->position_ = reader->ReadPosition(); | 1060 set->position_ = reader->ReadPosition(); |
1082 set->receiver_ = Expression::ReadFrom(reader); | 1061 set->receiver_ = Expression::ReadFrom(reader); |
1083 set->name_ = Name::ReadFrom(reader); | 1062 set->name_ = Name::ReadFrom(reader); |
1084 set->value_ = Expression::ReadFrom(reader); | 1063 set->value_ = Expression::ReadFrom(reader); |
1085 set->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1064 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
1086 return set; | 1065 return set; |
1087 } | 1066 } |
1088 | 1067 |
1089 | 1068 |
1090 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { | 1069 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { |
1091 TRACE_READ_OFFSET(); | 1070 TRACE_READ_OFFSET(); |
1092 DirectPropertyGet* get = new DirectPropertyGet(); | 1071 DirectPropertyGet* get = new DirectPropertyGet(); |
1093 get->receiver_ = Expression::ReadFrom(reader); | 1072 get->receiver_ = Expression::ReadFrom(reader); |
1094 get->target_ = Reference::ReadMemberFrom(reader); | 1073 get->target_reference_ = Reference::ReadMemberFrom(reader); |
1095 return get; | 1074 return get; |
1096 } | 1075 } |
1097 | 1076 |
1098 | 1077 |
1099 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { | 1078 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { |
1100 TRACE_READ_OFFSET(); | 1079 TRACE_READ_OFFSET(); |
1101 DirectPropertySet* set = new DirectPropertySet(); | 1080 DirectPropertySet* set = new DirectPropertySet(); |
1102 set->receiver_ = Expression::ReadFrom(reader); | 1081 set->receiver_ = Expression::ReadFrom(reader); |
1103 set->target_ = Reference::ReadMemberFrom(reader); | 1082 set->target_reference_ = Reference::ReadMemberFrom(reader); |
1104 set->value_ = Expression::ReadFrom(reader); | 1083 set->value_ = Expression::ReadFrom(reader); |
1105 return set; | 1084 return set; |
1106 } | 1085 } |
1107 | 1086 |
1108 | 1087 |
1109 StaticGet* StaticGet::ReadFrom(Reader* reader) { | 1088 StaticGet* StaticGet::ReadFrom(Reader* reader) { |
1110 TRACE_READ_OFFSET(); | 1089 TRACE_READ_OFFSET(); |
1111 StaticGet* get = new StaticGet(); | 1090 StaticGet* get = new StaticGet(); |
1112 get->position_ = reader->ReadPosition(); | 1091 get->position_ = reader->ReadPosition(); |
1113 get->target_ = Reference::ReadMemberFrom(reader); | 1092 get->target_reference_ = Reference::ReadMemberFrom(reader); |
1114 return get; | 1093 return get; |
1115 } | 1094 } |
1116 | 1095 |
1117 | 1096 |
1118 StaticSet* StaticSet::ReadFrom(Reader* reader) { | 1097 StaticSet* StaticSet::ReadFrom(Reader* reader) { |
1119 TRACE_READ_OFFSET(); | 1098 TRACE_READ_OFFSET(); |
1120 StaticSet* set = new StaticSet(); | 1099 StaticSet* set = new StaticSet(); |
1121 set->target_ = Reference::ReadMemberFrom(reader); | 1100 set->target_reference_ = Reference::ReadMemberFrom(reader); |
1122 set->expression_ = Expression::ReadFrom(reader); | 1101 set->expression_ = Expression::ReadFrom(reader); |
1123 return set; | 1102 return set; |
1124 } | 1103 } |
1125 | 1104 |
1126 | 1105 |
1127 Arguments* Arguments::ReadFrom(Reader* reader) { | 1106 Arguments* Arguments::ReadFrom(Reader* reader) { |
1128 TRACE_READ_OFFSET(); | 1107 TRACE_READ_OFFSET(); |
1129 Arguments* arguments = new Arguments(); | 1108 Arguments* arguments = new Arguments(); |
1130 arguments->types().ReadFromStatic<DartType>(reader); | 1109 arguments->types().ReadFromStatic<DartType>(reader); |
1131 arguments->positional().ReadFromStatic<Expression>(reader); | 1110 arguments->positional().ReadFromStatic<Expression>(reader); |
(...skipping 10 matching lines...) Expand all Loading... | |
1142 } | 1121 } |
1143 | 1122 |
1144 | 1123 |
1145 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { | 1124 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { |
1146 TRACE_READ_OFFSET(); | 1125 TRACE_READ_OFFSET(); |
1147 MethodInvocation* invocation = new MethodInvocation(); | 1126 MethodInvocation* invocation = new MethodInvocation(); |
1148 invocation->position_ = reader->ReadPosition(); | 1127 invocation->position_ = reader->ReadPosition(); |
1149 invocation->receiver_ = Expression::ReadFrom(reader); | 1128 invocation->receiver_ = Expression::ReadFrom(reader); |
1150 invocation->name_ = Name::ReadFrom(reader); | 1129 invocation->name_ = Name::ReadFrom(reader); |
1151 invocation->arguments_ = Arguments::ReadFrom(reader); | 1130 invocation->arguments_ = Arguments::ReadFrom(reader); |
1152 invocation->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1131 invocation->interface_target_reference_ = |
1132 Reference::ReadMemberFrom(reader, true); | |
1153 return invocation; | 1133 return invocation; |
1154 } | 1134 } |
1155 | 1135 |
1156 | 1136 |
1157 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { | 1137 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { |
1158 TRACE_READ_OFFSET(); | 1138 TRACE_READ_OFFSET(); |
1159 DirectMethodInvocation* invocation = new DirectMethodInvocation(); | 1139 DirectMethodInvocation* invocation = new DirectMethodInvocation(); |
1160 invocation->receiver_ = Expression::ReadFrom(reader); | 1140 invocation->receiver_ = Expression::ReadFrom(reader); |
1161 invocation->target_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1141 invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
1162 invocation->arguments_ = Arguments::ReadFrom(reader); | 1142 invocation->arguments_ = Arguments::ReadFrom(reader); |
1163 return invocation; | 1143 return invocation; |
1164 } | 1144 } |
1165 | 1145 |
1166 | 1146 |
1167 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { | 1147 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { |
1168 TRACE_READ_OFFSET(); | 1148 TRACE_READ_OFFSET(); |
1169 StaticInvocation* invocation = new StaticInvocation(); | 1149 StaticInvocation* invocation = new StaticInvocation(); |
1170 invocation->is_const_ = is_const; | 1150 invocation->is_const_ = is_const; |
1171 invocation->position_ = reader->ReadPosition(); | 1151 invocation->position_ = reader->ReadPosition(); |
1172 invocation->procedure_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1152 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); |
1173 invocation->arguments_ = Arguments::ReadFrom(reader); | 1153 invocation->arguments_ = Arguments::ReadFrom(reader); |
1174 return invocation; | 1154 return invocation; |
1175 } | 1155 } |
1176 | 1156 |
1177 | 1157 |
1178 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, | 1158 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, |
1179 bool is_const) { | 1159 bool is_const) { |
1180 TRACE_READ_OFFSET(); | 1160 TRACE_READ_OFFSET(); |
1181 ConstructorInvocation* invocation = new ConstructorInvocation(); | 1161 ConstructorInvocation* invocation = new ConstructorInvocation(); |
1182 invocation->is_const_ = is_const; | 1162 invocation->is_const_ = is_const; |
1183 invocation->position_ = reader->ReadPosition(); | 1163 invocation->position_ = reader->ReadPosition(); |
1184 invocation->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 1164 invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
1185 invocation->arguments_ = Arguments::ReadFrom(reader); | 1165 invocation->arguments_ = Arguments::ReadFrom(reader); |
1186 return invocation; | 1166 return invocation; |
1187 } | 1167 } |
1188 | 1168 |
1189 | 1169 |
1190 Not* Not::ReadFrom(Reader* reader) { | 1170 Not* Not::ReadFrom(Reader* reader) { |
1191 TRACE_READ_OFFSET(); | 1171 TRACE_READ_OFFSET(); |
1192 Not* n = new Not(); | 1172 Not* n = new Not(); |
1193 n->expression_ = Expression::ReadFrom(reader); | 1173 n->expression_ = Expression::ReadFrom(reader); |
1194 return n; | 1174 return n; |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1704 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); | 1684 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); |
1705 VariableScope<ReaderHelper> parameters(reader->helper()); | 1685 VariableScope<ReaderHelper> parameters(reader->helper()); |
1706 decl->function_ = FunctionNode::ReadFrom(reader); | 1686 decl->function_ = FunctionNode::ReadFrom(reader); |
1707 return decl; | 1687 return decl; |
1708 } | 1688 } |
1709 | 1689 |
1710 | 1690 |
1711 Name* Name::ReadFrom(Reader* reader) { | 1691 Name* Name::ReadFrom(Reader* reader) { |
1712 String* string = Reference::ReadStringFrom(reader); | 1692 String* string = Reference::ReadStringFrom(reader); |
1713 if (string->size() >= 1 && string->buffer()[0] == '_') { | 1693 if (string->size() >= 1 && string->buffer()[0] == '_') { |
1714 int lib_index = reader->ReadUInt(); | 1694 CanonicalName* library_reference = reader->ReadCanonicalNameReference(); |
1715 Library* library = | 1695 return new Name(string, library_reference); |
1716 reader->helper()->program()->libraries().GetOrCreate<Library>( | |
1717 lib_index); | |
1718 return new Name(string, library); | |
1719 } else { | 1696 } else { |
1720 return new Name(string, NULL); | 1697 return new Name(string, NULL); |
1721 } | 1698 } |
1722 } | 1699 } |
1723 | 1700 |
1724 | 1701 |
1725 InferredValue* InferredValue::ReadFrom(Reader* reader) { | 1702 InferredValue* InferredValue::ReadFrom(Reader* reader) { |
1726 InferredValue* type = new InferredValue(); | 1703 InferredValue* type = new InferredValue(); |
1727 type->klass_ = Reference::ReadClassFrom(reader, true); | 1704 type->klass_reference_ = Reference::ReadClassFrom(reader, true); |
1728 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); | 1705 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); |
1729 type->value_bits_ = reader->ReadByte(); | 1706 type->value_bits_ = reader->ReadByte(); |
1730 return type; | 1707 return type; |
1731 } | 1708 } |
1732 | 1709 |
1733 | 1710 |
1734 DartType* DartType::ReadFrom(Reader* reader) { | 1711 DartType* DartType::ReadFrom(Reader* reader) { |
1735 TRACE_READ_OFFSET(); | 1712 TRACE_READ_OFFSET(); |
1736 Tag tag = reader->ReadTag(); | 1713 Tag tag = reader->ReadTag(); |
1737 switch (tag) { | 1714 switch (tag) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1772 | 1749 |
1773 | 1750 |
1774 VoidType* VoidType::ReadFrom(Reader* reader) { | 1751 VoidType* VoidType::ReadFrom(Reader* reader) { |
1775 TRACE_READ_OFFSET(); | 1752 TRACE_READ_OFFSET(); |
1776 return new VoidType(); | 1753 return new VoidType(); |
1777 } | 1754 } |
1778 | 1755 |
1779 | 1756 |
1780 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { | 1757 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
1781 TRACE_READ_OFFSET(); | 1758 TRACE_READ_OFFSET(); |
1782 Class* klass = Reference::ReadClassFrom(reader); | 1759 CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
1783 InterfaceType* type = new InterfaceType(klass); | 1760 InterfaceType* type = new InterfaceType(klass_name); |
1784 type->type_arguments().ReadFromStatic<DartType>(reader); | 1761 type->type_arguments().ReadFromStatic<DartType>(reader); |
1785 return type; | 1762 return type; |
1786 } | 1763 } |
1787 | 1764 |
1788 | 1765 |
1789 InterfaceType* InterfaceType::ReadFrom(Reader* reader, | 1766 InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
1790 bool _without_type_arguments_) { | 1767 bool _without_type_arguments_) { |
1791 TRACE_READ_OFFSET(); | 1768 TRACE_READ_OFFSET(); |
1792 Class* klass = Reference::ReadClassFrom(reader); | 1769 CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
1793 InterfaceType* type = new InterfaceType(klass); | 1770 InterfaceType* type = new InterfaceType(klass_name); |
1794 ASSERT(_without_type_arguments_); | 1771 ASSERT(_without_type_arguments_); |
1795 return type; | 1772 return type; |
1796 } | 1773 } |
1797 | 1774 |
1798 | 1775 |
1799 FunctionType* FunctionType::ReadFrom(Reader* reader) { | 1776 FunctionType* FunctionType::ReadFrom(Reader* reader) { |
1800 TRACE_READ_OFFSET(); | 1777 TRACE_READ_OFFSET(); |
1801 FunctionType* type = new FunctionType(); | 1778 FunctionType* type = new FunctionType(); |
1802 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1779 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
1803 type->type_parameters().ReadFrom(reader); | 1780 type->type_parameters().ReadFrom(reader); |
(...skipping 24 matching lines...) Expand all Loading... | |
1828 return type; | 1805 return type; |
1829 } | 1806 } |
1830 | 1807 |
1831 | 1808 |
1832 Program* Program::ReadFrom(Reader* reader) { | 1809 Program* Program::ReadFrom(Reader* reader) { |
1833 TRACE_READ_OFFSET(); | 1810 TRACE_READ_OFFSET(); |
1834 uint32_t magic = reader->ReadUInt32(); | 1811 uint32_t magic = reader->ReadUInt32(); |
1835 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); | 1812 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
1836 | 1813 |
1837 Program* program = new Program(); | 1814 Program* program = new Program(); |
1815 program->canonical_name_root_ = CanonicalName::NewRoot(); | |
1838 reader->helper()->set_program(program); | 1816 reader->helper()->set_program(program); |
1839 | 1817 |
1840 program->string_table_.ReadFrom(reader); | 1818 program->string_table_.ReadFrom(reader); |
1841 program->source_uri_table_.ReadFrom(reader); | 1819 program->source_uri_table_.ReadFrom(reader); |
1842 program->source_table_.ReadFrom(reader); | 1820 program->source_table_.ReadFrom(reader); |
1843 | 1821 |
1822 int canonical_names = reader->ReadUInt(); | |
1823 reader->helper()->SetCanonicalNameCount(canonical_names); | |
1824 for (int i = 0; i < canonical_names; ++i) { | |
1825 int biased_parent_index = reader->ReadUInt(); | |
1826 CanonicalName* parent; | |
1827 if (biased_parent_index != 0) { | |
1828 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); | |
1829 } else { | |
1830 parent = program->canonical_name_root(); | |
1831 } | |
1832 ASSERT(parent != NULL); | |
1833 int name_index = reader->ReadUInt(); | |
1834 String* name = program->string_table().strings()[name_index]; | |
1835 CanonicalName* canonical_name = parent->AddChild(name); | |
1836 reader->helper()->SetCanonicalName(i, canonical_name); | |
1837 } | |
1838 | |
kustermann
2017/02/01 13:00:55
As mentioned above, this should should be implemen
asgerf
2017/02/02 12:30:28
From previous answer: it won't work for linking in
| |
1844 int libraries = reader->ReadUInt(); | 1839 int libraries = reader->ReadUInt(); |
1845 program->libraries().EnsureInitialized(libraries); | 1840 program->libraries().EnsureInitialized(libraries); |
1846 for (int i = 0; i < libraries; i++) { | 1841 for (int i = 0; i < libraries; i++) { |
1847 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | 1842 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
1848 } | 1843 } |
1849 | 1844 |
1850 program->main_method_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1845 program->main_method_reference_ = Reference::ReadMemberFrom(reader); |
1846 | |
1847 for (int i = 0; i < canonical_names; ++i) { | |
kustermann
2017/02/01 13:00:55
Can we guarantee this invariant in the kernel veri
asgerf
2017/02/02 12:30:28
Done.
| |
1848 CanonicalName* name = reader->helper()->GetCanonicalName(i); | |
1849 if (name->is_referenced() && name->definition() == NULL) { | |
1850 FATAL("Missing definition for canonical name"); | |
1851 } | |
1852 } | |
1851 | 1853 |
1852 return program; | 1854 return program; |
1853 } | 1855 } |
1854 | 1856 |
1855 | 1857 |
1856 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { | 1858 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
1857 TRACE_READ_OFFSET(); | 1859 TRACE_READ_OFFSET(); |
1858 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1860 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
1859 | 1861 |
1860 FunctionNode* function = new FunctionNode(); | 1862 FunctionNode* function = new FunctionNode(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1892 | 1894 |
1893 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1895 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
1894 intptr_t buffer_length) { | 1896 intptr_t buffer_length) { |
1895 kernel::Reader reader(buffer, buffer_length); | 1897 kernel::Reader reader(buffer, buffer_length); |
1896 return kernel::Program::ReadFrom(&reader); | 1898 return kernel::Program::ReadFrom(&reader); |
1897 } | 1899 } |
1898 | 1900 |
1899 | 1901 |
1900 } // namespace dart | 1902 } // namespace dart |
1901 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1903 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |