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

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

Issue 2665723002: Implement canonical name scheme in kernel. (Closed)
Patch Set: Address comments 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
« pkg/kernel/test/verify_test.dart ('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_;
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
468 CanonicalName* ReadDefiningCanonicalNameReference(LinkedNode* node_to_link) {
469 CanonicalName* name = ReadCanonicalNameReference();
470 ASSERT(name != NULL);
471 name->BindTo(node_to_link);
472 return name;
473 }
474
464 private: 475 private:
465 const uint8_t* buffer_; 476 const uint8_t* buffer_;
466 int64_t size_; 477 int64_t size_;
467 int64_t offset_; 478 int64_t offset_;
468 ReaderHelper builder_; 479 ReaderHelper builder_;
469 TokenPosition max_position_; 480 TokenPosition max_position_;
470 TokenPosition min_position_; 481 TokenPosition min_position_;
471 intptr_t current_script_id_; 482 intptr_t current_script_id_;
472 483
473 friend class PositionScope; 484 friend class PositionScope;
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 } 648 }
638 line_starts_[i] = line_starts; 649 line_starts_[i] = line_starts;
639 } 650 }
640 } 651 }
641 652
642 653
643 Library* Library::ReadFrom(Reader* reader) { 654 Library* Library::ReadFrom(Reader* reader) {
644 TRACE_READ_OFFSET(); 655 TRACE_READ_OFFSET();
645 int flags = reader->ReadFlags(); 656 int flags = reader->ReadFlags();
646 ASSERT(flags == 0); // external libraries not supported 657 ASSERT(flags == 0); // external libraries not supported
658
659 CanonicalName* canonical_name = reader->ReadCanonicalNameReference();
660 ASSERT(canonical_name != NULL);
661 canonical_name->BindTo(this);
662
647 name_ = Reference::ReadStringFrom(reader); 663 name_ = Reference::ReadStringFrom(reader);
648 import_uri_ = Reference::ReadStringFrom(reader); 664 import_uri_ = canonical_name->name();
649 source_uri_index_ = reader->ReadUInt(); 665 source_uri_index_ = reader->ReadUInt();
650 reader->set_current_script_id(source_uri_index_); 666 reader->set_current_script_id(source_uri_index_);
651 667
652 int num_classes = reader->ReadUInt(); 668 int num_classes = reader->ReadUInt();
653 classes().EnsureInitialized(num_classes); 669 classes().EnsureInitialized(num_classes);
654 for (int i = 0; i < num_classes; i++) { 670 for (int i = 0; i < num_classes; i++) {
655 Tag tag = reader->ReadTag(); 671 Tag tag = reader->ReadTag();
656 if (tag == kNormalClass) { 672 ASSERT(tag == kClass);
657 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); 673 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this);
658 klass->ReadFrom(reader); 674 klass->ReadFrom(reader);
659 } else {
660 ASSERT(tag == kMixinClass);
661 MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this);
662 klass->ReadFrom(reader);
663 }
664 } 675 }
665 676
666 fields().ReadFrom<Field>(reader, this); 677 fields().ReadFrom<Field>(reader, this);
667 procedures().ReadFrom<Procedure>(reader, this); 678 procedures().ReadFrom<Procedure>(reader, this);
668 return this; 679 return this;
669 } 680 }
670 681
671 682
672 Class* Class::ReadFrom(Reader* reader) { 683 Class* Class::ReadFrom(Reader* reader) {
673 TRACE_READ_OFFSET(); 684 TRACE_READ_OFFSET();
674 685
686 CanonicalName* canonical_name = reader->ReadCanonicalNameReference();
687 ASSERT(canonical_name != NULL);
688 canonical_name->BindTo(this);
675 position_ = reader->ReadPosition(); 689 position_ = reader->ReadPosition();
676 is_abstract_ = reader->ReadBool(); 690 is_abstract_ = reader->ReadBool();
677 name_ = Reference::ReadStringFrom(reader); 691 name_ = Reference::ReadStringFrom(reader);
678 source_uri_index_ = reader->ReadUInt(); 692 source_uri_index_ = reader->ReadUInt();
679 reader->set_current_script_id(source_uri_index_); 693 reader->set_current_script_id(source_uri_index_);
680 annotations_.ReadFromStatic<Expression>(reader); 694 annotations_.ReadFromStatic<Expression>(reader);
681 695
682 return this; 696 return this;
683 } 697 }
684 698
685 699
686 NormalClass* NormalClass::ReadFrom(Reader* reader) { 700 NormalClass* NormalClass::ReadFrom(Reader* reader) {
687 TRACE_READ_OFFSET(); 701 TRACE_READ_OFFSET();
688 Class::ReadFrom(reader); 702 Class::ReadFrom(reader);
689 TypeParameterScope<ReaderHelper> scope(reader->helper()); 703 TypeParameterScope<ReaderHelper> scope(reader->helper());
690 704
691 type_parameters_.ReadFrom(reader); 705 type_parameters_.ReadFrom(reader);
692 DartType* type = reader->ReadOptional<DartType>(); 706 DartType* type = reader->ReadOptional<DartType>();
693 707
694 super_class_ = InterfaceType::Cast(type); 708 super_class_ = InterfaceType::Cast(type);
709 reader->ReadOptional<DartType>(); // Mixed-in type is unused.
695 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( 710 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >(
696 reader); 711 reader);
697 fields_.ReadFrom<Field>(reader, this); 712 fields_.ReadFrom<Field>(reader, this);
698 constructors_.ReadFrom<Constructor>(reader, this); 713 constructors_.ReadFrom<Constructor>(reader, this);
699 procedures_.ReadFrom<Procedure>(reader, this); 714 procedures_.ReadFrom<Procedure>(reader, this);
700 715
701 return this; 716 return this;
702 } 717 }
703 718
704 719
705 MixinClass* MixinClass::ReadFrom(Reader* reader) { 720 MixinClass* MixinClass::ReadFrom(Reader* reader) {
706 TRACE_READ_OFFSET(); 721 TRACE_READ_OFFSET();
707 TypeParameterScope<ReaderHelper> scope(reader->helper()); 722 TypeParameterScope<ReaderHelper> scope(reader->helper());
708 723
709 Class::ReadFrom(reader); 724 Class::ReadFrom(reader);
710 type_parameters_.ReadFrom(reader); 725 type_parameters_.ReadFrom(reader);
711 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); 726 first_ = InterfaceType::Cast(DartType::ReadFrom(reader));
712 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); 727 second_ = InterfaceType::Cast(DartType::ReadFrom(reader));
713 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( 728 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >(
714 reader); 729 reader);
715 constructors_.ReadFrom<Constructor>(reader, this); 730 constructors_.ReadFrom<Constructor>(reader, this);
716 return this; 731 return this;
717 } 732 }
718 733
719 734
720 Member* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { 735 CanonicalName* Reference::ReadMemberFrom(Reader* reader, bool allow_null) {
721 TRACE_READ_OFFSET(); 736 TRACE_READ_OFFSET();
722 737
723 Program* program = reader->helper()->program(); 738 CanonicalName* canonical_name = reader->ReadCanonicalNameReference();
724 Tag tag = reader->ReadTag(); 739 if (canonical_name == NULL && !allow_null) {
725 switch (tag) { 740 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 } 741 }
766 742
767 UNREACHABLE(); 743 if (canonical_name != NULL) {
768 return NULL; 744 canonical_name->set_referenced(true);
745 }
746
747 return canonical_name;
769 } 748 }
770 749
771 750
772 Class* Reference::ReadClassFrom(Reader* reader, bool allow_null) { 751 CanonicalName* Reference::ReadClassFrom(Reader* reader, bool allow_null) {
773 TRACE_READ_OFFSET(); 752 TRACE_READ_OFFSET();
774 Program* program = reader->helper()->program();
775 753
776 Tag klass_member_tag = reader->ReadTag(); 754 CanonicalName* canonical_name = reader->ReadCanonicalNameReference();
777 if (klass_member_tag == kNullReference) { 755 if (canonical_name == NULL && !allow_null) {
778 if (allow_null) { 756 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 } 757 }
784 int library_idx = reader->ReadUInt();
785 int class_idx = reader->ReadUInt();
786 758
787 Library* library = program->libraries().GetOrCreate<Library>(library_idx); 759 if (canonical_name != NULL) {
788 Class* klass; 760 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 } 761 }
795 return klass; 762
763 return canonical_name;
796 } 764 }
797 765
798 766
799 String* Reference::ReadStringFrom(Reader* reader) { 767 String* Reference::ReadStringFrom(Reader* reader) {
800 int index = reader->ReadUInt(); 768 int index = reader->ReadUInt();
801 return reader->helper()->program()->string_table().strings()[index]; 769 return reader->helper()->program()->string_table().strings()[index];
802 } 770 }
803 771
804 772
805 Field* Field::ReadFrom(Reader* reader) { 773 Field* Field::ReadFrom(Reader* reader) {
806 TRACE_READ_OFFSET(); 774 TRACE_READ_OFFSET();
807 Tag tag = reader->ReadTag(); 775 Tag tag = reader->ReadTag();
808 ASSERT(tag == kField); 776 ASSERT(tag == kField);
809 777
778 reader->ReadDefiningCanonicalNameReference(this);
810 position_ = reader->ReadPosition(); 779 position_ = reader->ReadPosition();
811 end_position_ = reader->ReadPosition(); 780 end_position_ = reader->ReadPosition();
812 flags_ = reader->ReadFlags(); 781 flags_ = reader->ReadFlags();
813 name_ = Name::ReadFrom(reader); 782 name_ = Name::ReadFrom(reader);
814 source_uri_index_ = reader->ReadUInt(); 783 source_uri_index_ = reader->ReadUInt();
815 reader->set_current_script_id(source_uri_index_); 784 reader->set_current_script_id(source_uri_index_);
816 annotations_.ReadFromStatic<Expression>(reader); 785 annotations_.ReadFromStatic<Expression>(reader);
817 type_ = DartType::ReadFrom(reader); 786 type_ = DartType::ReadFrom(reader);
818 inferred_value_ = reader->ReadOptional<InferredValue>(); 787 inferred_value_ = reader->ReadOptional<InferredValue>();
819 initializer_ = reader->ReadOptional<Expression>(); 788 initializer_ = reader->ReadOptional<Expression>();
820 return this; 789 return this;
821 } 790 }
822 791
823 792
824 Constructor* Constructor::ReadFrom(Reader* reader) { 793 Constructor* Constructor::ReadFrom(Reader* reader) {
825 TRACE_READ_OFFSET(); 794 TRACE_READ_OFFSET();
826 Tag tag = reader->ReadTag(); 795 Tag tag = reader->ReadTag();
827 ASSERT(tag == kConstructor); 796 ASSERT(tag == kConstructor);
828 797
798 reader->ReadDefiningCanonicalNameReference(this);
829 VariableScope<ReaderHelper> parameters(reader->helper()); 799 VariableScope<ReaderHelper> parameters(reader->helper());
830 position_ = reader->ReadPosition(); 800 position_ = reader->ReadPosition();
831 end_position_ = reader->ReadPosition(); 801 end_position_ = reader->ReadPosition();
832 flags_ = reader->ReadFlags(); 802 flags_ = reader->ReadFlags();
833 name_ = Name::ReadFrom(reader); 803 name_ = Name::ReadFrom(reader);
834 annotations_.ReadFromStatic<Expression>(reader); 804 annotations_.ReadFromStatic<Expression>(reader);
835 function_ = FunctionNode::ReadFrom(reader); 805 function_ = FunctionNode::ReadFrom(reader);
836 initializers_.ReadFromStatic<Initializer>(reader); 806 initializers_.ReadFromStatic<Initializer>(reader);
837 return this; 807 return this;
838 } 808 }
839 809
840 810
841 Procedure* Procedure::ReadFrom(Reader* reader) { 811 Procedure* Procedure::ReadFrom(Reader* reader) {
842 TRACE_READ_OFFSET(); 812 TRACE_READ_OFFSET();
843 Tag tag = reader->ReadTag(); 813 Tag tag = reader->ReadTag();
844 ASSERT(tag == kProcedure); 814 ASSERT(tag == kProcedure);
845 815
816 reader->ReadDefiningCanonicalNameReference(this);
846 VariableScope<ReaderHelper> parameters(reader->helper()); 817 VariableScope<ReaderHelper> parameters(reader->helper());
847 position_ = reader->ReadPosition(); 818 position_ = reader->ReadPosition();
848 end_position_ = reader->ReadPosition(); 819 end_position_ = reader->ReadPosition();
849 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); 820 kind_ = static_cast<ProcedureKind>(reader->ReadByte());
850 flags_ = reader->ReadFlags(); 821 flags_ = reader->ReadFlags();
851 name_ = Name::ReadFrom(reader); 822 name_ = Name::ReadFrom(reader);
852 source_uri_index_ = reader->ReadUInt(); 823 source_uri_index_ = reader->ReadUInt();
853 reader->set_current_script_id(source_uri_index_); 824 reader->set_current_script_id(source_uri_index_);
854 annotations_.ReadFromStatic<Expression>(reader); 825 annotations_.ReadFromStatic<Expression>(reader);
855 function_ = reader->ReadOptional<FunctionNode>(); 826 function_ = reader->ReadOptional<FunctionNode>();
(...skipping 24 matching lines...) Expand all
880 851
881 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { 852 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) {
882 TRACE_READ_OFFSET(); 853 TRACE_READ_OFFSET();
883 return new InvalidInitializer(); 854 return new InvalidInitializer();
884 } 855 }
885 856
886 857
887 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { 858 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) {
888 TRACE_READ_OFFSET(); 859 TRACE_READ_OFFSET();
889 FieldInitializer* initializer = new FieldInitializer(); 860 FieldInitializer* initializer = new FieldInitializer();
890 initializer->field_ = Field::Cast(Reference::ReadMemberFrom(reader)); 861 initializer->field_reference_ = Reference::ReadMemberFrom(reader);
891 initializer->value_ = Expression::ReadFrom(reader); 862 initializer->value_ = Expression::ReadFrom(reader);
892 return initializer; 863 return initializer;
893 } 864 }
894 865
895 866
896 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { 867 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) {
897 TRACE_READ_OFFSET(); 868 TRACE_READ_OFFSET();
898 SuperInitializer* init = new SuperInitializer(); 869 SuperInitializer* init = new SuperInitializer();
899 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); 870 init->target_reference_ = Reference::ReadMemberFrom(reader);
900 init->arguments_ = Arguments::ReadFrom(reader); 871 init->arguments_ = Arguments::ReadFrom(reader);
901 return init; 872 return init;
902 } 873 }
903 874
904 875
905 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { 876 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) {
906 TRACE_READ_OFFSET(); 877 TRACE_READ_OFFSET();
907 RedirectingInitializer* init = new RedirectingInitializer(); 878 RedirectingInitializer* init = new RedirectingInitializer();
908 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); 879 init->target_reference_ = Reference::ReadMemberFrom(reader);
909 init->arguments_ = Arguments::ReadFrom(reader); 880 init->arguments_ = Arguments::ReadFrom(reader);
910 return init; 881 return init;
911 } 882 }
912 883
913 884
914 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { 885 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) {
915 TRACE_READ_OFFSET(); 886 TRACE_READ_OFFSET();
916 LocalInitializer* init = new LocalInitializer(); 887 LocalInitializer* init = new LocalInitializer();
917 init->variable_ = VariableDeclaration::ReadFromImpl(reader); 888 init->variable_ = VariableDeclaration::ReadFromImpl(reader);
918 return init; 889 return init;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 return set; 1034 return set;
1064 } 1035 }
1065 1036
1066 1037
1067 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { 1038 PropertyGet* PropertyGet::ReadFrom(Reader* reader) {
1068 TRACE_READ_OFFSET(); 1039 TRACE_READ_OFFSET();
1069 PropertyGet* get = new PropertyGet(); 1040 PropertyGet* get = new PropertyGet();
1070 get->position_ = reader->ReadPosition(); 1041 get->position_ = reader->ReadPosition();
1071 get->receiver_ = Expression::ReadFrom(reader); 1042 get->receiver_ = Expression::ReadFrom(reader);
1072 get->name_ = Name::ReadFrom(reader); 1043 get->name_ = Name::ReadFrom(reader);
1073 get->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); 1044 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true);
1074 return get; 1045 return get;
1075 } 1046 }
1076 1047
1077 1048
1078 PropertySet* PropertySet::ReadFrom(Reader* reader) { 1049 PropertySet* PropertySet::ReadFrom(Reader* reader) {
1079 TRACE_READ_OFFSET(); 1050 TRACE_READ_OFFSET();
1080 PropertySet* set = new PropertySet(); 1051 PropertySet* set = new PropertySet();
1081 set->position_ = reader->ReadPosition(); 1052 set->position_ = reader->ReadPosition();
1082 set->receiver_ = Expression::ReadFrom(reader); 1053 set->receiver_ = Expression::ReadFrom(reader);
1083 set->name_ = Name::ReadFrom(reader); 1054 set->name_ = Name::ReadFrom(reader);
1084 set->value_ = Expression::ReadFrom(reader); 1055 set->value_ = Expression::ReadFrom(reader);
1085 set->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); 1056 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true);
1086 return set; 1057 return set;
1087 } 1058 }
1088 1059
1089 1060
1090 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { 1061 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) {
1091 TRACE_READ_OFFSET(); 1062 TRACE_READ_OFFSET();
1092 DirectPropertyGet* get = new DirectPropertyGet(); 1063 DirectPropertyGet* get = new DirectPropertyGet();
1093 get->receiver_ = Expression::ReadFrom(reader); 1064 get->receiver_ = Expression::ReadFrom(reader);
1094 get->target_ = Reference::ReadMemberFrom(reader); 1065 get->target_reference_ = Reference::ReadMemberFrom(reader);
1095 return get; 1066 return get;
1096 } 1067 }
1097 1068
1098 1069
1099 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { 1070 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) {
1100 TRACE_READ_OFFSET(); 1071 TRACE_READ_OFFSET();
1101 DirectPropertySet* set = new DirectPropertySet(); 1072 DirectPropertySet* set = new DirectPropertySet();
1102 set->receiver_ = Expression::ReadFrom(reader); 1073 set->receiver_ = Expression::ReadFrom(reader);
1103 set->target_ = Reference::ReadMemberFrom(reader); 1074 set->target_reference_ = Reference::ReadMemberFrom(reader);
1104 set->value_ = Expression::ReadFrom(reader); 1075 set->value_ = Expression::ReadFrom(reader);
1105 return set; 1076 return set;
1106 } 1077 }
1107 1078
1108 1079
1109 StaticGet* StaticGet::ReadFrom(Reader* reader) { 1080 StaticGet* StaticGet::ReadFrom(Reader* reader) {
1110 TRACE_READ_OFFSET(); 1081 TRACE_READ_OFFSET();
1111 StaticGet* get = new StaticGet(); 1082 StaticGet* get = new StaticGet();
1112 get->position_ = reader->ReadPosition(); 1083 get->position_ = reader->ReadPosition();
1113 get->target_ = Reference::ReadMemberFrom(reader); 1084 get->target_reference_ = Reference::ReadMemberFrom(reader);
1114 return get; 1085 return get;
1115 } 1086 }
1116 1087
1117 1088
1118 StaticSet* StaticSet::ReadFrom(Reader* reader) { 1089 StaticSet* StaticSet::ReadFrom(Reader* reader) {
1119 TRACE_READ_OFFSET(); 1090 TRACE_READ_OFFSET();
1120 StaticSet* set = new StaticSet(); 1091 StaticSet* set = new StaticSet();
1121 set->target_ = Reference::ReadMemberFrom(reader); 1092 set->target_reference_ = Reference::ReadMemberFrom(reader);
1122 set->expression_ = Expression::ReadFrom(reader); 1093 set->expression_ = Expression::ReadFrom(reader);
1123 return set; 1094 return set;
1124 } 1095 }
1125 1096
1126 1097
1127 Arguments* Arguments::ReadFrom(Reader* reader) { 1098 Arguments* Arguments::ReadFrom(Reader* reader) {
1128 TRACE_READ_OFFSET(); 1099 TRACE_READ_OFFSET();
1129 Arguments* arguments = new Arguments(); 1100 Arguments* arguments = new Arguments();
1130 arguments->types().ReadFromStatic<DartType>(reader); 1101 arguments->types().ReadFromStatic<DartType>(reader);
1131 arguments->positional().ReadFromStatic<Expression>(reader); 1102 arguments->positional().ReadFromStatic<Expression>(reader);
(...skipping 10 matching lines...) Expand all
1142 } 1113 }
1143 1114
1144 1115
1145 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { 1116 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) {
1146 TRACE_READ_OFFSET(); 1117 TRACE_READ_OFFSET();
1147 MethodInvocation* invocation = new MethodInvocation(); 1118 MethodInvocation* invocation = new MethodInvocation();
1148 invocation->position_ = reader->ReadPosition(); 1119 invocation->position_ = reader->ReadPosition();
1149 invocation->receiver_ = Expression::ReadFrom(reader); 1120 invocation->receiver_ = Expression::ReadFrom(reader);
1150 invocation->name_ = Name::ReadFrom(reader); 1121 invocation->name_ = Name::ReadFrom(reader);
1151 invocation->arguments_ = Arguments::ReadFrom(reader); 1122 invocation->arguments_ = Arguments::ReadFrom(reader);
1152 invocation->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); 1123 invocation->interface_target_reference_ =
1124 Reference::ReadMemberFrom(reader, true);
1153 return invocation; 1125 return invocation;
1154 } 1126 }
1155 1127
1156 1128
1157 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { 1129 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) {
1158 TRACE_READ_OFFSET(); 1130 TRACE_READ_OFFSET();
1159 DirectMethodInvocation* invocation = new DirectMethodInvocation(); 1131 DirectMethodInvocation* invocation = new DirectMethodInvocation();
1160 invocation->receiver_ = Expression::ReadFrom(reader); 1132 invocation->receiver_ = Expression::ReadFrom(reader);
1161 invocation->target_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); 1133 invocation->target_reference_ = Reference::ReadMemberFrom(reader);
1162 invocation->arguments_ = Arguments::ReadFrom(reader); 1134 invocation->arguments_ = Arguments::ReadFrom(reader);
1163 return invocation; 1135 return invocation;
1164 } 1136 }
1165 1137
1166 1138
1167 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { 1139 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) {
1168 TRACE_READ_OFFSET(); 1140 TRACE_READ_OFFSET();
1169 StaticInvocation* invocation = new StaticInvocation(); 1141 StaticInvocation* invocation = new StaticInvocation();
1170 invocation->is_const_ = is_const; 1142 invocation->is_const_ = is_const;
1171 invocation->position_ = reader->ReadPosition(); 1143 invocation->position_ = reader->ReadPosition();
1172 invocation->procedure_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); 1144 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader);
1173 invocation->arguments_ = Arguments::ReadFrom(reader); 1145 invocation->arguments_ = Arguments::ReadFrom(reader);
1174 return invocation; 1146 return invocation;
1175 } 1147 }
1176 1148
1177 1149
1178 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, 1150 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader,
1179 bool is_const) { 1151 bool is_const) {
1180 TRACE_READ_OFFSET(); 1152 TRACE_READ_OFFSET();
1181 ConstructorInvocation* invocation = new ConstructorInvocation(); 1153 ConstructorInvocation* invocation = new ConstructorInvocation();
1182 invocation->is_const_ = is_const; 1154 invocation->is_const_ = is_const;
1183 invocation->position_ = reader->ReadPosition(); 1155 invocation->position_ = reader->ReadPosition();
1184 invocation->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); 1156 invocation->target_reference_ = Reference::ReadMemberFrom(reader);
1185 invocation->arguments_ = Arguments::ReadFrom(reader); 1157 invocation->arguments_ = Arguments::ReadFrom(reader);
1186 return invocation; 1158 return invocation;
1187 } 1159 }
1188 1160
1189 1161
1190 Not* Not::ReadFrom(Reader* reader) { 1162 Not* Not::ReadFrom(Reader* reader) {
1191 TRACE_READ_OFFSET(); 1163 TRACE_READ_OFFSET();
1192 Not* n = new Not(); 1164 Not* n = new Not();
1193 n->expression_ = Expression::ReadFrom(reader); 1165 n->expression_ = Expression::ReadFrom(reader);
1194 return n; 1166 return n;
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1704 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); 1676 decl->variable_ = VariableDeclaration::ReadFromImpl(reader);
1705 VariableScope<ReaderHelper> parameters(reader->helper()); 1677 VariableScope<ReaderHelper> parameters(reader->helper());
1706 decl->function_ = FunctionNode::ReadFrom(reader); 1678 decl->function_ = FunctionNode::ReadFrom(reader);
1707 return decl; 1679 return decl;
1708 } 1680 }
1709 1681
1710 1682
1711 Name* Name::ReadFrom(Reader* reader) { 1683 Name* Name::ReadFrom(Reader* reader) {
1712 String* string = Reference::ReadStringFrom(reader); 1684 String* string = Reference::ReadStringFrom(reader);
1713 if (string->size() >= 1 && string->buffer()[0] == '_') { 1685 if (string->size() >= 1 && string->buffer()[0] == '_') {
1714 int lib_index = reader->ReadUInt(); 1686 CanonicalName* library_reference = reader->ReadCanonicalNameReference();
1715 Library* library = 1687 return new Name(string, library_reference);
1716 reader->helper()->program()->libraries().GetOrCreate<Library>(
1717 lib_index);
1718 return new Name(string, library);
1719 } else { 1688 } else {
1720 return new Name(string, NULL); 1689 return new Name(string, NULL);
1721 } 1690 }
1722 } 1691 }
1723 1692
1724 1693
1725 InferredValue* InferredValue::ReadFrom(Reader* reader) { 1694 InferredValue* InferredValue::ReadFrom(Reader* reader) {
1726 InferredValue* type = new InferredValue(); 1695 InferredValue* type = new InferredValue();
1727 type->klass_ = Reference::ReadClassFrom(reader, true); 1696 type->klass_reference_ = Reference::ReadClassFrom(reader, true);
1728 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); 1697 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte());
1729 type->value_bits_ = reader->ReadByte(); 1698 type->value_bits_ = reader->ReadByte();
1730 return type; 1699 return type;
1731 } 1700 }
1732 1701
1733 1702
1734 DartType* DartType::ReadFrom(Reader* reader) { 1703 DartType* DartType::ReadFrom(Reader* reader) {
1735 TRACE_READ_OFFSET(); 1704 TRACE_READ_OFFSET();
1736 Tag tag = reader->ReadTag(); 1705 Tag tag = reader->ReadTag();
1737 switch (tag) { 1706 switch (tag) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 1741
1773 1742
1774 VoidType* VoidType::ReadFrom(Reader* reader) { 1743 VoidType* VoidType::ReadFrom(Reader* reader) {
1775 TRACE_READ_OFFSET(); 1744 TRACE_READ_OFFSET();
1776 return new VoidType(); 1745 return new VoidType();
1777 } 1746 }
1778 1747
1779 1748
1780 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { 1749 InterfaceType* InterfaceType::ReadFrom(Reader* reader) {
1781 TRACE_READ_OFFSET(); 1750 TRACE_READ_OFFSET();
1782 Class* klass = Reference::ReadClassFrom(reader); 1751 CanonicalName* klass_name = Reference::ReadClassFrom(reader);
1783 InterfaceType* type = new InterfaceType(klass); 1752 InterfaceType* type = new InterfaceType(klass_name);
1784 type->type_arguments().ReadFromStatic<DartType>(reader); 1753 type->type_arguments().ReadFromStatic<DartType>(reader);
1785 return type; 1754 return type;
1786 } 1755 }
1787 1756
1788 1757
1789 InterfaceType* InterfaceType::ReadFrom(Reader* reader, 1758 InterfaceType* InterfaceType::ReadFrom(Reader* reader,
1790 bool _without_type_arguments_) { 1759 bool _without_type_arguments_) {
1791 TRACE_READ_OFFSET(); 1760 TRACE_READ_OFFSET();
1792 Class* klass = Reference::ReadClassFrom(reader); 1761 CanonicalName* klass_name = Reference::ReadClassFrom(reader);
1793 InterfaceType* type = new InterfaceType(klass); 1762 InterfaceType* type = new InterfaceType(klass_name);
1794 ASSERT(_without_type_arguments_); 1763 ASSERT(_without_type_arguments_);
1795 return type; 1764 return type;
1796 } 1765 }
1797 1766
1798 1767
1799 FunctionType* FunctionType::ReadFrom(Reader* reader) { 1768 FunctionType* FunctionType::ReadFrom(Reader* reader) {
1800 TRACE_READ_OFFSET(); 1769 TRACE_READ_OFFSET();
1801 FunctionType* type = new FunctionType(); 1770 FunctionType* type = new FunctionType();
1802 TypeParameterScope<ReaderHelper> scope(reader->helper()); 1771 TypeParameterScope<ReaderHelper> scope(reader->helper());
1803 type->type_parameters().ReadFrom(reader); 1772 type->type_parameters().ReadFrom(reader);
(...skipping 24 matching lines...) Expand all
1828 return type; 1797 return type;
1829 } 1798 }
1830 1799
1831 1800
1832 Program* Program::ReadFrom(Reader* reader) { 1801 Program* Program::ReadFrom(Reader* reader) {
1833 TRACE_READ_OFFSET(); 1802 TRACE_READ_OFFSET();
1834 uint32_t magic = reader->ReadUInt32(); 1803 uint32_t magic = reader->ReadUInt32();
1835 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); 1804 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier");
1836 1805
1837 Program* program = new Program(); 1806 Program* program = new Program();
1807 program->canonical_name_root_ = CanonicalName::NewRoot();
1838 reader->helper()->set_program(program); 1808 reader->helper()->set_program(program);
1839 1809
1840 program->string_table_.ReadFrom(reader); 1810 program->string_table_.ReadFrom(reader);
1841 program->source_uri_table_.ReadFrom(reader); 1811 program->source_uri_table_.ReadFrom(reader);
1842 program->source_table_.ReadFrom(reader); 1812 program->source_table_.ReadFrom(reader);
1843 1813
1814 int canonical_names = reader->ReadUInt();
1815 reader->helper()->SetCanonicalNameCount(canonical_names);
1816 for (int i = 0; i < canonical_names; ++i) {
1817 int biased_parent_index = reader->ReadUInt();
1818 CanonicalName* parent;
1819 if (biased_parent_index != 0) {
1820 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1);
1821 } else {
1822 parent = program->canonical_name_root();
1823 }
1824 ASSERT(parent != NULL);
1825 int name_index = reader->ReadUInt();
1826 String* name = program->string_table().strings()[name_index];
1827 CanonicalName* canonical_name = parent->AddChild(name);
1828 reader->helper()->SetCanonicalName(i, canonical_name);
1829 }
1830
1844 int libraries = reader->ReadUInt(); 1831 int libraries = reader->ReadUInt();
1845 program->libraries().EnsureInitialized(libraries); 1832 program->libraries().EnsureInitialized(libraries);
1846 for (int i = 0; i < libraries; i++) { 1833 for (int i = 0; i < libraries; i++) {
1847 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); 1834 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader);
1848 } 1835 }
1849 1836
1850 program->main_method_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); 1837 program->main_method_reference_ = Reference::ReadMemberFrom(reader);
1838
1839 #ifdef DEBUG
1840 for (int i = 0; i < canonical_names; ++i) {
1841 CanonicalName* name = reader->helper()->GetCanonicalName(i);
1842 if (name->is_referenced() && name->definition() == NULL) {
1843 FATAL("Missing definition for canonical name");
1844 }
1845 }
1846 #endif
1851 1847
1852 return program; 1848 return program;
1853 } 1849 }
1854 1850
1855 1851
1856 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { 1852 FunctionNode* FunctionNode::ReadFrom(Reader* reader) {
1857 TRACE_READ_OFFSET(); 1853 TRACE_READ_OFFSET();
1858 TypeParameterScope<ReaderHelper> scope(reader->helper()); 1854 TypeParameterScope<ReaderHelper> scope(reader->helper());
1859 1855
1860 FunctionNode* function = new FunctionNode(); 1856 FunctionNode* function = new FunctionNode();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1892 1888
1893 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, 1889 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
1894 intptr_t buffer_length) { 1890 intptr_t buffer_length) {
1895 kernel::Reader reader(buffer, buffer_length); 1891 kernel::Reader reader(buffer, buffer_length);
1896 return kernel::Program::ReadFrom(&reader); 1892 return kernel::Program::ReadFrom(&reader);
1897 } 1893 }
1898 1894
1899 1895
1900 } // namespace dart 1896 } // namespace dart
1901 #endif // !defined(DART_PRECOMPILED_RUNTIME) 1897 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« pkg/kernel/test/verify_test.dart ('K') | « runtime/vm/kernel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698