| 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 <map> | 6 #include <map> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
| 10 #include "vm/flags.h" | 10 #include "vm/flags.h" |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 // 11... | 357 // 11... |
| 358 ASSERT(offset_ + 4 <= size_); | 358 ASSERT(offset_ + 4 <= size_); |
| 359 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | | 359 uint32_t value = ((byte0 & ~0xc0) << 24) | (buffer_[offset_ + 1] << 16) | |
| 360 (buffer_[offset_ + 2] << 8) | | 360 (buffer_[offset_ + 2] << 8) | |
| 361 (buffer_[offset_ + 3] << 0); | 361 (buffer_[offset_ + 3] << 0); |
| 362 offset_ += 4; | 362 offset_ += 4; |
| 363 return value; | 363 return value; |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 | 366 |
| 367 void add_token_position( |
| 368 MallocGrowableArray<MallocGrowableArray<intptr_t>*>* list, |
| 369 TokenPosition position) { |
| 370 intptr_t size = list->length(); |
| 371 while (size <= current_script_id_) { |
| 372 MallocGrowableArray<intptr_t>* tmp = new MallocGrowableArray<intptr_t>(); |
| 373 list->Add(tmp); |
| 374 size = list->length(); |
| 375 } |
| 376 list->At(current_script_id_)->Add(position.value()); |
| 377 } |
| 378 |
| 379 void record_token_position(TokenPosition position) { |
| 380 add_token_position(&helper()->program()->valid_token_positions, position); |
| 381 } |
| 382 |
| 383 void record_yield_token_position(TokenPosition position) { |
| 384 add_token_position(&helper()->program()->yield_token_positions, position); |
| 385 } |
| 386 |
| 367 /** | 387 /** |
| 368 * Read and return a TokenPosition from this reader. | 388 * Read and return a TokenPosition from this reader. |
| 389 * @param record specifies whether or not the read position is saved as a |
| 390 * valid token position in the current script. |
| 391 * If not be sure to record it later by calling record_token_position (after |
| 392 * setting the correct current_script_id). |
| 369 */ | 393 */ |
| 370 TokenPosition ReadPosition() { | 394 TokenPosition ReadPosition(bool record = true) { |
| 371 // Position is saved as unsigned, | 395 // Position is saved as unsigned, |
| 372 // but actually ranges from -1 and up (thus the -1) | 396 // but actually ranges from -1 and up (thus the -1) |
| 373 intptr_t value = ReadUInt() - 1; | 397 intptr_t value = ReadUInt() - 1; |
| 374 TokenPosition result = TokenPosition(value); | 398 TokenPosition result = TokenPosition(value); |
| 375 max_position_ = Utils::Maximum(max_position_, result); | 399 max_position_ = Utils::Maximum(max_position_, result); |
| 376 if (min_position_.IsNoSource()) { | 400 if (min_position_.IsNoSource()) { |
| 377 min_position_ = result; | 401 min_position_ = result; |
| 378 } else if (result.IsReal()) { | 402 } else if (result.IsReal()) { |
| 379 min_position_ = Utils::Minimum(min_position_, result); | 403 min_position_ = Utils::Minimum(min_position_, result); |
| 380 } | 404 } |
| 381 | 405 |
| 406 if (record) { |
| 407 record_token_position(result); |
| 408 } |
| 382 return result; | 409 return result; |
| 383 } | 410 } |
| 384 | 411 |
| 385 intptr_t ReadListLength() { return ReadUInt(); } | 412 intptr_t ReadListLength() { return ReadUInt(); } |
| 386 | 413 |
| 387 uint8_t ReadByte() { return buffer_[offset_++]; } | 414 uint8_t ReadByte() { return buffer_[offset_++]; } |
| 388 | 415 |
| 389 bool ReadBool() { return (ReadByte() & 1) == 1; } | 416 bool ReadBool() { return (ReadByte() & 1) == 1; } |
| 390 | 417 |
| 391 word ReadFlags() { return ReadByte(); } | 418 word ReadFlags() { return ReadByte(); } |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 | 687 |
| 661 fields().ReadFrom<Field>(reader, this); | 688 fields().ReadFrom<Field>(reader, this); |
| 662 procedures().ReadFrom<Procedure>(reader, this); | 689 procedures().ReadFrom<Procedure>(reader, this); |
| 663 return this; | 690 return this; |
| 664 } | 691 } |
| 665 | 692 |
| 666 | 693 |
| 667 Class* Class::ReadFrom(Reader* reader) { | 694 Class* Class::ReadFrom(Reader* reader) { |
| 668 TRACE_READ_OFFSET(); | 695 TRACE_READ_OFFSET(); |
| 669 | 696 |
| 670 position_ = reader->ReadPosition(); | 697 position_ = reader->ReadPosition(false); |
| 671 is_abstract_ = reader->ReadBool(); | 698 is_abstract_ = reader->ReadBool(); |
| 672 name_ = Reference::ReadStringFrom(reader); | 699 name_ = Reference::ReadStringFrom(reader); |
| 673 source_uri_index_ = reader->ReadUInt(); | 700 source_uri_index_ = reader->ReadUInt(); |
| 674 reader->set_current_script_id(source_uri_index_); | 701 reader->set_current_script_id(source_uri_index_); |
| 702 reader->record_token_position(position_); |
| 675 annotations_.ReadFromStatic<Expression>(reader); | 703 annotations_.ReadFromStatic<Expression>(reader); |
| 676 | 704 |
| 677 return this; | 705 return this; |
| 678 } | 706 } |
| 679 | 707 |
| 680 | 708 |
| 681 NormalClass* NormalClass::ReadFrom(Reader* reader) { | 709 NormalClass* NormalClass::ReadFrom(Reader* reader) { |
| 682 TRACE_READ_OFFSET(); | 710 TRACE_READ_OFFSET(); |
| 683 Class::ReadFrom(reader); | 711 Class::ReadFrom(reader); |
| 684 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 712 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 int index = reader->ReadUInt(); | 823 int index = reader->ReadUInt(); |
| 796 return reader->helper()->program()->string_table().strings()[index]; | 824 return reader->helper()->program()->string_table().strings()[index]; |
| 797 } | 825 } |
| 798 | 826 |
| 799 | 827 |
| 800 Field* Field::ReadFrom(Reader* reader) { | 828 Field* Field::ReadFrom(Reader* reader) { |
| 801 TRACE_READ_OFFSET(); | 829 TRACE_READ_OFFSET(); |
| 802 Tag tag = reader->ReadTag(); | 830 Tag tag = reader->ReadTag(); |
| 803 ASSERT(tag == kField); | 831 ASSERT(tag == kField); |
| 804 | 832 |
| 805 position_ = reader->ReadPosition(); | 833 position_ = reader->ReadPosition(false); |
| 806 end_position_ = reader->ReadPosition(); | 834 end_position_ = reader->ReadPosition(false); |
| 807 flags_ = reader->ReadFlags(); | 835 flags_ = reader->ReadFlags(); |
| 808 name_ = Name::ReadFrom(reader); | 836 name_ = Name::ReadFrom(reader); |
| 809 source_uri_index_ = reader->ReadUInt(); | 837 source_uri_index_ = reader->ReadUInt(); |
| 810 reader->set_current_script_id(source_uri_index_); | 838 reader->set_current_script_id(source_uri_index_); |
| 839 reader->record_token_position(position_); |
| 840 reader->record_token_position(end_position_); |
| 811 annotations_.ReadFromStatic<Expression>(reader); | 841 annotations_.ReadFromStatic<Expression>(reader); |
| 812 type_ = DartType::ReadFrom(reader); | 842 type_ = DartType::ReadFrom(reader); |
| 813 inferred_value_ = reader->ReadOptional<InferredValue>(); | 843 inferred_value_ = reader->ReadOptional<InferredValue>(); |
| 814 initializer_ = reader->ReadOptional<Expression>(); | 844 initializer_ = reader->ReadOptional<Expression>(); |
| 815 return this; | 845 return this; |
| 816 } | 846 } |
| 817 | 847 |
| 818 | 848 |
| 819 Constructor* Constructor::ReadFrom(Reader* reader) { | 849 Constructor* Constructor::ReadFrom(Reader* reader) { |
| 820 TRACE_READ_OFFSET(); | 850 TRACE_READ_OFFSET(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 832 return this; | 862 return this; |
| 833 } | 863 } |
| 834 | 864 |
| 835 | 865 |
| 836 Procedure* Procedure::ReadFrom(Reader* reader) { | 866 Procedure* Procedure::ReadFrom(Reader* reader) { |
| 837 TRACE_READ_OFFSET(); | 867 TRACE_READ_OFFSET(); |
| 838 Tag tag = reader->ReadTag(); | 868 Tag tag = reader->ReadTag(); |
| 839 ASSERT(tag == kProcedure); | 869 ASSERT(tag == kProcedure); |
| 840 | 870 |
| 841 VariableScope<ReaderHelper> parameters(reader->helper()); | 871 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 842 position_ = reader->ReadPosition(); | 872 position_ = reader->ReadPosition(false); |
| 843 end_position_ = reader->ReadPosition(); | 873 end_position_ = reader->ReadPosition(false); |
| 844 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 874 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
| 845 flags_ = reader->ReadFlags(); | 875 flags_ = reader->ReadFlags(); |
| 846 name_ = Name::ReadFrom(reader); | 876 name_ = Name::ReadFrom(reader); |
| 847 source_uri_index_ = reader->ReadUInt(); | 877 source_uri_index_ = reader->ReadUInt(); |
| 848 reader->set_current_script_id(source_uri_index_); | 878 reader->set_current_script_id(source_uri_index_); |
| 879 reader->record_token_position(position_); |
| 880 reader->record_token_position(end_position_); |
| 849 annotations_.ReadFromStatic<Expression>(reader); | 881 annotations_.ReadFromStatic<Expression>(reader); |
| 850 function_ = reader->ReadOptional<FunctionNode>(); | 882 function_ = reader->ReadOptional<FunctionNode>(); |
| 851 return this; | 883 return this; |
| 852 } | 884 } |
| 853 | 885 |
| 854 | 886 |
| 855 Initializer* Initializer::ReadFrom(Reader* reader) { | 887 Initializer* Initializer::ReadFrom(Reader* reader) { |
| 856 TRACE_READ_OFFSET(); | 888 TRACE_READ_OFFSET(); |
| 857 Tag tag = reader->ReadTag(); | 889 Tag tag = reader->ReadTag(); |
| 858 switch (tag) { | 890 switch (tag) { |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1648 tf->body_ = Statement::ReadFrom(reader); | 1680 tf->body_ = Statement::ReadFrom(reader); |
| 1649 tf->finalizer_ = Statement::ReadFrom(reader); | 1681 tf->finalizer_ = Statement::ReadFrom(reader); |
| 1650 return tf; | 1682 return tf; |
| 1651 } | 1683 } |
| 1652 | 1684 |
| 1653 | 1685 |
| 1654 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { | 1686 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { |
| 1655 TRACE_READ_OFFSET(); | 1687 TRACE_READ_OFFSET(); |
| 1656 YieldStatement* stmt = new YieldStatement(); | 1688 YieldStatement* stmt = new YieldStatement(); |
| 1657 stmt->position_ = reader->ReadPosition(); | 1689 stmt->position_ = reader->ReadPosition(); |
| 1690 reader->record_yield_token_position(stmt->position_); |
| 1658 stmt->flags_ = reader->ReadByte(); | 1691 stmt->flags_ = reader->ReadByte(); |
| 1659 stmt->expression_ = Expression::ReadFrom(reader); | 1692 stmt->expression_ = Expression::ReadFrom(reader); |
| 1660 return stmt; | 1693 return stmt; |
| 1661 } | 1694 } |
| 1662 | 1695 |
| 1663 | 1696 |
| 1664 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { | 1697 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { |
| 1665 TRACE_READ_OFFSET(); | 1698 TRACE_READ_OFFSET(); |
| 1666 Tag tag = reader->ReadTag(); | 1699 Tag tag = reader->ReadTag(); |
| 1667 ASSERT(tag == kVariableDeclaration); | 1700 ASSERT(tag == kVariableDeclaration); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 | 1920 |
| 1888 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1921 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
| 1889 intptr_t buffer_length) { | 1922 intptr_t buffer_length) { |
| 1890 kernel::Reader reader(buffer, buffer_length); | 1923 kernel::Reader reader(buffer, buffer_length); |
| 1891 return kernel::Program::ReadFrom(&reader); | 1924 return kernel::Program::ReadFrom(&reader); |
| 1892 } | 1925 } |
| 1893 | 1926 |
| 1894 | 1927 |
| 1895 } // namespace dart | 1928 } // namespace dart |
| 1896 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1929 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |