| 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 |