Chromium Code Reviews| 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 |