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