| 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 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 // 11... | 362 // 11... |
| 363 ASSERT(offset_ + 4 <= size_); | 363 ASSERT(offset_ + 4 <= size_); |
| 364 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | | 364 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | |
| 365 (buffer_[offset_ + 2] << 8) | | 365 (buffer_[offset_ + 2] << 8) | |
| 366 (buffer_[offset_ + 3] << 0); | 366 (buffer_[offset_ + 3] << 0); |
| 367 offset_ += 4; | 367 offset_ += 4; |
| 368 return value; | 368 return value; |
| 369 } | 369 } |
| 370 } | 370 } |
| 371 | 371 |
| 372 void add_token_position( | |
| 373 MallocGrowableArray<MallocGrowableArray<intptr_t>*>* list, | |
| 374 TokenPosition position) { | |
| 375 intptr_t size = list->length(); | |
| 376 while (size <= current_script_id_) { | |
| 377 MallocGrowableArray<intptr_t>* tmp = new MallocGrowableArray<intptr_t>(); | |
| 378 list->Add(tmp); | |
| 379 size = list->length(); | |
| 380 } | |
| 381 list->At(current_script_id_)->Add(position.value()); | |
| 382 } | |
| 383 | |
| 384 void record_token_position(TokenPosition position) { | |
| 385 if (position.IsReal()) { | |
| 386 add_token_position(&helper()->program()->valid_token_positions, position); | |
| 387 } | |
| 388 } | |
| 389 | |
| 390 void record_yield_token_position(TokenPosition position) { | |
| 391 add_token_position(&helper()->program()->yield_token_positions, position); | |
| 392 } | |
| 393 | |
| 394 /** | 372 /** |
| 395 * Read and return a TokenPosition from this reader. | 373 * Read and return a TokenPosition from this reader. |
| 396 * @param record specifies whether or not the read position is saved as a | |
| 397 * valid token position in the current script. | |
| 398 * If not be sure to record it later by calling record_token_position (after | |
| 399 * setting the correct current_script_id). | |
| 400 */ | 374 */ |
| 401 TokenPosition ReadPosition(bool record = true) { | 375 TokenPosition ReadPosition() { |
| 402 // Position is saved as unsigned, | 376 // Position is saved as unsigned, |
| 403 // but actually ranges from -1 and up (thus the -1) | 377 // but actually ranges from -1 and up (thus the -1) |
| 404 intptr_t value = ReadUInt() - 1; | 378 intptr_t value = ReadUInt() - 1; |
| 405 TokenPosition result = TokenPosition(value); | 379 TokenPosition result = TokenPosition(value); |
| 406 max_position_ = Utils::Maximum(max_position_, result); | 380 max_position_ = Utils::Maximum(max_position_, result); |
| 407 if (min_position_.IsNoSource()) { | 381 if (min_position_.IsNoSource()) { |
| 408 min_position_ = result; | 382 min_position_ = result; |
| 409 } else if (result.IsReal()) { | 383 } else if (result.IsReal()) { |
| 410 min_position_ = Utils::Minimum(min_position_, result); | 384 min_position_ = Utils::Minimum(min_position_, result); |
| 411 } | 385 } |
| 412 | 386 |
| 413 if (record) { | |
| 414 record_token_position(result); | |
| 415 } | |
| 416 return result; | 387 return result; |
| 417 } | 388 } |
| 418 | 389 |
| 419 intptr_t ReadListLength() { return ReadUInt(); } | 390 intptr_t ReadListLength() { return ReadUInt(); } |
| 420 | 391 |
| 421 uint8_t ReadByte() { return buffer_[offset_++]; } | 392 uint8_t ReadByte() { return buffer_[offset_++]; } |
| 422 | 393 |
| 423 bool ReadBool() { return (ReadByte() & 1) == 1; } | 394 bool ReadBool() { return (ReadByte() & 1) == 1; } |
| 424 | 395 |
| 425 word ReadFlags() { return ReadByte(); } | 396 word ReadFlags() { return ReadByte(); } |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 | 665 |
| 695 fields().ReadFrom<Field>(reader, this); | 666 fields().ReadFrom<Field>(reader, this); |
| 696 procedures().ReadFrom<Procedure>(reader, this); | 667 procedures().ReadFrom<Procedure>(reader, this); |
| 697 return this; | 668 return this; |
| 698 } | 669 } |
| 699 | 670 |
| 700 | 671 |
| 701 Class* Class::ReadFrom(Reader* reader) { | 672 Class* Class::ReadFrom(Reader* reader) { |
| 702 TRACE_READ_OFFSET(); | 673 TRACE_READ_OFFSET(); |
| 703 | 674 |
| 704 position_ = reader->ReadPosition(false); | 675 position_ = reader->ReadPosition(); |
| 705 is_abstract_ = reader->ReadBool(); | 676 is_abstract_ = reader->ReadBool(); |
| 706 name_ = Reference::ReadStringFrom(reader); | 677 name_ = Reference::ReadStringFrom(reader); |
| 707 source_uri_index_ = reader->ReadUInt(); | 678 source_uri_index_ = reader->ReadUInt(); |
| 708 reader->set_current_script_id(source_uri_index_); | 679 reader->set_current_script_id(source_uri_index_); |
| 709 reader->record_token_position(position_); | |
| 710 annotations_.ReadFromStatic<Expression>(reader); | 680 annotations_.ReadFromStatic<Expression>(reader); |
| 711 | 681 |
| 712 return this; | 682 return this; |
| 713 } | 683 } |
| 714 | 684 |
| 715 | 685 |
| 716 NormalClass* NormalClass::ReadFrom(Reader* reader) { | 686 NormalClass* NormalClass::ReadFrom(Reader* reader) { |
| 717 TRACE_READ_OFFSET(); | 687 TRACE_READ_OFFSET(); |
| 718 Class::ReadFrom(reader); | 688 Class::ReadFrom(reader); |
| 719 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 689 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 int index = reader->ReadUInt(); | 800 int index = reader->ReadUInt(); |
| 831 return reader->helper()->program()->string_table().strings()[index]; | 801 return reader->helper()->program()->string_table().strings()[index]; |
| 832 } | 802 } |
| 833 | 803 |
| 834 | 804 |
| 835 Field* Field::ReadFrom(Reader* reader) { | 805 Field* Field::ReadFrom(Reader* reader) { |
| 836 TRACE_READ_OFFSET(); | 806 TRACE_READ_OFFSET(); |
| 837 Tag tag = reader->ReadTag(); | 807 Tag tag = reader->ReadTag(); |
| 838 ASSERT(tag == kField); | 808 ASSERT(tag == kField); |
| 839 | 809 |
| 840 position_ = reader->ReadPosition(false); | 810 position_ = reader->ReadPosition(); |
| 841 end_position_ = reader->ReadPosition(false); | 811 end_position_ = reader->ReadPosition(); |
| 842 flags_ = reader->ReadFlags(); | 812 flags_ = reader->ReadFlags(); |
| 843 name_ = Name::ReadFrom(reader); | 813 name_ = Name::ReadFrom(reader); |
| 844 source_uri_index_ = reader->ReadUInt(); | 814 source_uri_index_ = reader->ReadUInt(); |
| 845 reader->set_current_script_id(source_uri_index_); | 815 reader->set_current_script_id(source_uri_index_); |
| 846 reader->record_token_position(position_); | |
| 847 reader->record_token_position(end_position_); | |
| 848 annotations_.ReadFromStatic<Expression>(reader); | 816 annotations_.ReadFromStatic<Expression>(reader); |
| 849 type_ = DartType::ReadFrom(reader); | 817 type_ = DartType::ReadFrom(reader); |
| 850 inferred_value_ = reader->ReadOptional<InferredValue>(); | 818 inferred_value_ = reader->ReadOptional<InferredValue>(); |
| 851 initializer_ = reader->ReadOptional<Expression>(); | 819 initializer_ = reader->ReadOptional<Expression>(); |
| 852 return this; | 820 return this; |
| 853 } | 821 } |
| 854 | 822 |
| 855 | 823 |
| 856 Constructor* Constructor::ReadFrom(Reader* reader) { | 824 Constructor* Constructor::ReadFrom(Reader* reader) { |
| 857 TRACE_READ_OFFSET(); | 825 TRACE_READ_OFFSET(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 869 return this; | 837 return this; |
| 870 } | 838 } |
| 871 | 839 |
| 872 | 840 |
| 873 Procedure* Procedure::ReadFrom(Reader* reader) { | 841 Procedure* Procedure::ReadFrom(Reader* reader) { |
| 874 TRACE_READ_OFFSET(); | 842 TRACE_READ_OFFSET(); |
| 875 Tag tag = reader->ReadTag(); | 843 Tag tag = reader->ReadTag(); |
| 876 ASSERT(tag == kProcedure); | 844 ASSERT(tag == kProcedure); |
| 877 | 845 |
| 878 VariableScope<ReaderHelper> parameters(reader->helper()); | 846 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 879 position_ = reader->ReadPosition(false); | 847 position_ = reader->ReadPosition(); |
| 880 end_position_ = reader->ReadPosition(false); | 848 end_position_ = reader->ReadPosition(); |
| 881 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 849 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
| 882 flags_ = reader->ReadFlags(); | 850 flags_ = reader->ReadFlags(); |
| 883 name_ = Name::ReadFrom(reader); | 851 name_ = Name::ReadFrom(reader); |
| 884 source_uri_index_ = reader->ReadUInt(); | 852 source_uri_index_ = reader->ReadUInt(); |
| 885 reader->set_current_script_id(source_uri_index_); | 853 reader->set_current_script_id(source_uri_index_); |
| 886 reader->record_token_position(position_); | |
| 887 reader->record_token_position(end_position_); | |
| 888 annotations_.ReadFromStatic<Expression>(reader); | 854 annotations_.ReadFromStatic<Expression>(reader); |
| 889 function_ = reader->ReadOptional<FunctionNode>(); | 855 function_ = reader->ReadOptional<FunctionNode>(); |
| 890 return this; | 856 return this; |
| 891 } | 857 } |
| 892 | 858 |
| 893 | 859 |
| 894 Initializer* Initializer::ReadFrom(Reader* reader) { | 860 Initializer* Initializer::ReadFrom(Reader* reader) { |
| 895 TRACE_READ_OFFSET(); | 861 TRACE_READ_OFFSET(); |
| 896 Tag tag = reader->ReadTag(); | 862 Tag tag = reader->ReadTag(); |
| 897 switch (tag) { | 863 switch (tag) { |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 tf->body_ = Statement::ReadFrom(reader); | 1653 tf->body_ = Statement::ReadFrom(reader); |
| 1688 tf->finalizer_ = Statement::ReadFrom(reader); | 1654 tf->finalizer_ = Statement::ReadFrom(reader); |
| 1689 return tf; | 1655 return tf; |
| 1690 } | 1656 } |
| 1691 | 1657 |
| 1692 | 1658 |
| 1693 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { | 1659 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { |
| 1694 TRACE_READ_OFFSET(); | 1660 TRACE_READ_OFFSET(); |
| 1695 YieldStatement* stmt = new YieldStatement(); | 1661 YieldStatement* stmt = new YieldStatement(); |
| 1696 stmt->position_ = reader->ReadPosition(); | 1662 stmt->position_ = reader->ReadPosition(); |
| 1697 reader->record_yield_token_position(stmt->position_); | |
| 1698 stmt->flags_ = reader->ReadByte(); | 1663 stmt->flags_ = reader->ReadByte(); |
| 1699 stmt->expression_ = Expression::ReadFrom(reader); | 1664 stmt->expression_ = Expression::ReadFrom(reader); |
| 1700 return stmt; | 1665 return stmt; |
| 1701 } | 1666 } |
| 1702 | 1667 |
| 1703 | 1668 |
| 1704 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { | 1669 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { |
| 1705 TRACE_READ_OFFSET(); | 1670 TRACE_READ_OFFSET(); |
| 1706 Tag tag = reader->ReadTag(); | 1671 Tag tag = reader->ReadTag(); |
| 1707 ASSERT(tag == kVariableDeclaration); | 1672 ASSERT(tag == kVariableDeclaration); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1927 | 1892 |
| 1928 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1893 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
| 1929 intptr_t buffer_length) { | 1894 intptr_t buffer_length) { |
| 1930 kernel::Reader reader(buffer, buffer_length); | 1895 kernel::Reader reader(buffer, buffer_length); |
| 1931 return kernel::Program::ReadFrom(&reader); | 1896 return kernel::Program::ReadFrom(&reader); |
| 1932 } | 1897 } |
| 1933 | 1898 |
| 1934 | 1899 |
| 1935 } // namespace dart | 1900 } // namespace dart |
| 1936 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1901 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |