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 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 ReaderHelper* helper() { return &builder_; } | 487 ReaderHelper* helper() { return &builder_; } |
488 | 488 |
489 CanonicalName* ReadCanonicalNameReference() { | 489 CanonicalName* ReadCanonicalNameReference() { |
490 int index = ReadUInt(); | 490 int index = ReadUInt(); |
491 if (index == 0) return NULL; | 491 if (index == 0) return NULL; |
492 CanonicalName* name = builder_.GetCanonicalName(index - 1); | 492 CanonicalName* name = builder_.GetCanonicalName(index - 1); |
493 ASSERT(name != NULL); | 493 ASSERT(name != NULL); |
494 return name; | 494 return name; |
495 } | 495 } |
496 | 496 |
497 CanonicalName* ReadDefiningCanonicalNameReference(LinkedNode* node_to_link) { | |
498 CanonicalName* name = ReadCanonicalNameReference(); | |
499 ASSERT(name != NULL); | |
500 name->BindTo(node_to_link); | |
501 return name; | |
502 } | |
503 | |
504 intptr_t offset() { return offset_; } | 497 intptr_t offset() { return offset_; } |
505 | 498 |
506 private: | 499 private: |
507 const uint8_t* buffer_; | 500 const uint8_t* buffer_; |
508 intptr_t size_; | 501 intptr_t size_; |
509 intptr_t offset_; | 502 intptr_t offset_; |
510 ReaderHelper builder_; | 503 ReaderHelper builder_; |
511 TokenPosition max_position_; | 504 TokenPosition max_position_; |
512 TokenPosition min_position_; | 505 TokenPosition min_position_; |
513 intptr_t current_script_id_; | 506 intptr_t current_script_id_; |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 line_starts_[i] = line_starts; | 673 line_starts_[i] = line_starts; |
681 } | 674 } |
682 } | 675 } |
683 | 676 |
684 | 677 |
685 Library* Library::ReadFrom(Reader* reader) { | 678 Library* Library::ReadFrom(Reader* reader) { |
686 TRACE_READ_OFFSET(); | 679 TRACE_READ_OFFSET(); |
687 int flags = reader->ReadFlags(); | 680 int flags = reader->ReadFlags(); |
688 ASSERT(flags == 0); // external libraries not supported | 681 ASSERT(flags == 0); // external libraries not supported |
689 | 682 |
690 CanonicalName* canonical_name = | 683 canonical_name_ = reader->ReadCanonicalNameReference(); |
691 reader->ReadDefiningCanonicalNameReference(this); | |
692 | |
693 name_ = Reference::ReadStringFrom(reader); | 684 name_ = Reference::ReadStringFrom(reader); |
694 import_uri_ = canonical_name->name(); | 685 import_uri_ = canonical_name_->name(); |
695 source_uri_index_ = reader->ReadUInt(); | 686 source_uri_index_ = reader->ReadUInt(); |
696 reader->set_current_script_id(source_uri_index_); | 687 reader->set_current_script_id(source_uri_index_); |
697 | 688 |
698 int num_imports = reader->ReadUInt(); | 689 int num_imports = reader->ReadUInt(); |
699 if (num_imports != 0) { | 690 if (num_imports != 0) { |
700 FATAL("Deferred imports not implemented in VM"); | 691 FATAL("Deferred imports not implemented in VM"); |
701 } | 692 } |
702 int num_classes = reader->ReadUInt(); | 693 int num_classes = reader->ReadUInt(); |
703 classes().EnsureInitialized(num_classes); | 694 classes().EnsureInitialized(num_classes); |
704 for (intptr_t i = 0; i < num_classes; i++) { | 695 for (intptr_t i = 0; i < num_classes; i++) { |
705 Tag tag = reader->ReadTag(); | 696 Tag tag = reader->ReadTag(); |
706 ASSERT(tag == kClass); | 697 ASSERT(tag == kClass); |
707 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); | 698 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); |
708 klass->ReadFrom(reader); | 699 klass->ReadFrom(reader); |
709 } | 700 } |
710 | 701 |
711 fields().ReadFrom<Field>(reader, this); | 702 fields().ReadFrom<Field>(reader, this); |
712 procedures().ReadFrom<Procedure>(reader, this); | 703 procedures().ReadFrom<Procedure>(reader, this); |
713 return this; | 704 return this; |
714 } | 705 } |
715 | 706 |
716 | 707 |
717 Class* Class::ReadFrom(Reader* reader) { | 708 Class* Class::ReadFrom(Reader* reader) { |
718 TRACE_READ_OFFSET(); | 709 TRACE_READ_OFFSET(); |
719 | 710 |
720 reader->ReadDefiningCanonicalNameReference(this); | 711 canonical_name_ = reader->ReadCanonicalNameReference(); |
721 position_ = reader->ReadPosition(false); | 712 position_ = reader->ReadPosition(false); |
722 is_abstract_ = reader->ReadBool(); | 713 is_abstract_ = reader->ReadBool(); |
723 name_ = Reference::ReadStringFrom(reader); | 714 name_ = Reference::ReadStringFrom(reader); |
724 source_uri_index_ = reader->ReadUInt(); | 715 source_uri_index_ = reader->ReadUInt(); |
725 reader->set_current_script_id(source_uri_index_); | 716 reader->set_current_script_id(source_uri_index_); |
726 reader->record_token_position(position_); | 717 reader->record_token_position(position_); |
727 annotations_.ReadFromStatic<Expression>(reader); | 718 annotations_.ReadFromStatic<Expression>(reader); |
728 | 719 |
729 return this; | 720 return this; |
730 } | 721 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 return reader->helper()->program()->string_table().strings()[index]; | 793 return reader->helper()->program()->string_table().strings()[index]; |
803 } | 794 } |
804 | 795 |
805 | 796 |
806 Field* Field::ReadFrom(Reader* reader) { | 797 Field* Field::ReadFrom(Reader* reader) { |
807 TRACE_READ_OFFSET(); | 798 TRACE_READ_OFFSET(); |
808 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. | 799 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
809 Tag tag = reader->ReadTag(); | 800 Tag tag = reader->ReadTag(); |
810 ASSERT(tag == kField); | 801 ASSERT(tag == kField); |
811 | 802 |
812 reader->ReadDefiningCanonicalNameReference(this); | 803 canonical_name_ = reader->ReadCanonicalNameReference(); |
813 position_ = reader->ReadPosition(false); | 804 position_ = reader->ReadPosition(false); |
814 end_position_ = reader->ReadPosition(false); | 805 end_position_ = reader->ReadPosition(false); |
815 flags_ = reader->ReadFlags(); | 806 flags_ = reader->ReadFlags(); |
816 name_ = Name::ReadFrom(reader); | 807 name_ = Name::ReadFrom(reader); |
817 source_uri_index_ = reader->ReadUInt(); | 808 source_uri_index_ = reader->ReadUInt(); |
818 reader->set_current_script_id(source_uri_index_); | 809 reader->set_current_script_id(source_uri_index_); |
819 reader->record_token_position(position_); | 810 reader->record_token_position(position_); |
820 reader->record_token_position(end_position_); | 811 reader->record_token_position(end_position_); |
821 annotations_.ReadFromStatic<Expression>(reader); | 812 annotations_.ReadFromStatic<Expression>(reader); |
822 type_ = DartType::ReadFrom(reader); | 813 type_ = DartType::ReadFrom(reader); |
823 initializer_ = reader->ReadOptional<Expression>(); | 814 initializer_ = reader->ReadOptional<Expression>(); |
824 return this; | 815 return this; |
825 } | 816 } |
826 | 817 |
827 | 818 |
828 Constructor* Constructor::ReadFrom(Reader* reader) { | 819 Constructor* Constructor::ReadFrom(Reader* reader) { |
829 TRACE_READ_OFFSET(); | 820 TRACE_READ_OFFSET(); |
830 Tag tag = reader->ReadTag(); | 821 Tag tag = reader->ReadTag(); |
831 ASSERT(tag == kConstructor); | 822 ASSERT(tag == kConstructor); |
832 | 823 |
833 reader->ReadDefiningCanonicalNameReference(this); | 824 canonical_name_ = reader->ReadCanonicalNameReference(); |
834 VariableScope<ReaderHelper> parameters(reader->helper()); | 825 VariableScope<ReaderHelper> parameters(reader->helper()); |
835 position_ = reader->ReadPosition(); | 826 position_ = reader->ReadPosition(); |
836 end_position_ = reader->ReadPosition(); | 827 end_position_ = reader->ReadPosition(); |
837 flags_ = reader->ReadFlags(); | 828 flags_ = reader->ReadFlags(); |
838 name_ = Name::ReadFrom(reader); | 829 name_ = Name::ReadFrom(reader); |
839 annotations_.ReadFromStatic<Expression>(reader); | 830 annotations_.ReadFromStatic<Expression>(reader); |
840 function_ = FunctionNode::ReadFrom(reader); | 831 function_ = FunctionNode::ReadFrom(reader); |
841 initializers_.ReadFromStatic<Initializer>(reader); | 832 initializers_.ReadFromStatic<Initializer>(reader); |
842 return this; | 833 return this; |
843 } | 834 } |
844 | 835 |
845 | 836 |
846 Procedure* Procedure::ReadFrom(Reader* reader) { | 837 Procedure* Procedure::ReadFrom(Reader* reader) { |
847 TRACE_READ_OFFSET(); | 838 TRACE_READ_OFFSET(); |
848 Tag tag = reader->ReadTag(); | 839 Tag tag = reader->ReadTag(); |
849 ASSERT(tag == kProcedure); | 840 ASSERT(tag == kProcedure); |
850 | 841 |
851 reader->ReadDefiningCanonicalNameReference(this); | 842 canonical_name_ = reader->ReadCanonicalNameReference(); |
852 VariableScope<ReaderHelper> parameters(reader->helper()); | 843 VariableScope<ReaderHelper> parameters(reader->helper()); |
853 position_ = reader->ReadPosition(false); | 844 position_ = reader->ReadPosition(false); |
854 end_position_ = reader->ReadPosition(false); | 845 end_position_ = reader->ReadPosition(false); |
855 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 846 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
856 flags_ = reader->ReadFlags(); | 847 flags_ = reader->ReadFlags(); |
857 name_ = Name::ReadFrom(reader); | 848 name_ = Name::ReadFrom(reader); |
858 source_uri_index_ = reader->ReadUInt(); | 849 source_uri_index_ = reader->ReadUInt(); |
859 reader->set_current_script_id(source_uri_index_); | 850 reader->set_current_script_id(source_uri_index_); |
860 reader->record_token_position(position_); | 851 reader->record_token_position(position_); |
861 reader->record_token_position(end_position_); | 852 reader->record_token_position(end_position_); |
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 } | 1874 } |
1884 | 1875 |
1885 int libraries = reader->ReadUInt(); | 1876 int libraries = reader->ReadUInt(); |
1886 program->libraries().EnsureInitialized(libraries); | 1877 program->libraries().EnsureInitialized(libraries); |
1887 for (intptr_t i = 0; i < libraries; i++) { | 1878 for (intptr_t i = 0; i < libraries; i++) { |
1888 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | 1879 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
1889 } | 1880 } |
1890 | 1881 |
1891 program->main_method_reference_ = Reference::ReadMemberFrom(reader); | 1882 program->main_method_reference_ = Reference::ReadMemberFrom(reader); |
1892 | 1883 |
1893 #ifdef DEBUG | |
1894 for (intptr_t i = 0; i < canonical_names; ++i) { | |
1895 CanonicalName* name = reader->helper()->GetCanonicalName(i); | |
1896 if (name->is_referenced() && name->definition() == NULL) { | |
1897 FATAL("Missing definition for canonical name"); | |
1898 } | |
1899 } | |
1900 #endif | |
1901 | |
1902 return program; | 1884 return program; |
1903 } | 1885 } |
1904 | 1886 |
1905 | 1887 |
1906 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { | 1888 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
1907 TRACE_READ_OFFSET(); | 1889 TRACE_READ_OFFSET(); |
1908 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1890 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
1909 | 1891 |
1910 FunctionNode* function = new FunctionNode(); | 1892 FunctionNode* function = new FunctionNode(); |
1911 function->kernel_offset_ = reader->offset(); // FunctionNode has no tag. | 1893 function->kernel_offset_ = reader->offset(); // FunctionNode has no tag. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1943 | 1925 |
1944 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1926 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
1945 intptr_t buffer_length) { | 1927 intptr_t buffer_length) { |
1946 kernel::Reader reader(buffer, buffer_length); | 1928 kernel::Reader reader(buffer, buffer_length); |
1947 return kernel::Program::ReadFrom(&reader); | 1929 return kernel::Program::ReadFrom(&reader); |
1948 } | 1930 } |
1949 | 1931 |
1950 | 1932 |
1951 } // namespace dart | 1933 } // namespace dart |
1952 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1934 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |