Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: runtime/vm/kernel_binary.cc

Issue 2665723002: Implement canonical name scheme in kernel. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« runtime/vm/kernel.h ('K') | « runtime/vm/kernel.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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)
OLDNEW
« runtime/vm/kernel.h ('K') | « runtime/vm/kernel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698