| 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 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 | 27 |
| 28 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; | 28 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; |
| 29 | 29 |
| 30 | 30 |
| 31 // Keep in sync with package:dynamo/lib/binary/tag.dart | 31 // Keep in sync with package:dynamo/lib/binary/tag.dart |
| 32 enum Tag { | 32 enum Tag { |
| 33 kNothing = 0, | 33 kNothing = 0, |
| 34 kSomething = 1, | 34 kSomething = 1, |
| 35 | 35 |
| 36 kNormalClass = 2, | 36 kClass = 2, |
| 37 kMixinClass = 3, | |
| 38 | 37 |
| 39 kField = 4, | 38 kField = 4, |
| 40 kConstructor = 5, | 39 kConstructor = 5, |
| 41 kProcedure = 6, | 40 kProcedure = 6, |
| 42 | 41 |
| 43 kInvalidInitializer = 7, | 42 kInvalidInitializer = 7, |
| 44 kFieldInitializer = 8, | 43 kFieldInitializer = 8, |
| 45 kSuperInitializer = 9, | 44 kSuperInitializer = 9, |
| 46 kRedirectingInitializer = 10, | 45 kRedirectingInitializer = 10, |
| 47 kLocalInitializer = 11, | 46 kLocalInitializer = 11, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 115 |
| 117 kInvalidType = 90, | 116 kInvalidType = 90, |
| 118 kDynamicType = 91, | 117 kDynamicType = 91, |
| 119 kVoidType = 92, | 118 kVoidType = 92, |
| 120 kInterfaceType = 93, | 119 kInterfaceType = 93, |
| 121 kFunctionType = 94, | 120 kFunctionType = 94, |
| 122 kTypeParameterType = 95, | 121 kTypeParameterType = 95, |
| 123 kSimpleInterfaceType = 96, | 122 kSimpleInterfaceType = 96, |
| 124 kSimpleFunctionType = 97, | 123 kSimpleFunctionType = 97, |
| 125 | 124 |
| 126 kNullReference = 99, | |
| 127 kNormalClassReference = 100, | |
| 128 kMixinClassReference = 101, | |
| 129 | |
| 130 kLibraryFieldReference = 102, | |
| 131 kClassFieldReference = 103, | |
| 132 kClassConstructorReference = 104, | |
| 133 kLibraryProcedureReference = 105, | |
| 134 kClassProcedureReference = 106, | |
| 135 | |
| 136 kSpecializedTagHighBit = 0x80, // 10000000 | 125 kSpecializedTagHighBit = 0x80, // 10000000 |
| 137 kSpecializedTagMask = 0xF8, // 11111000 | 126 kSpecializedTagMask = 0xF8, // 11111000 |
| 138 kSpecializedPayloadMask = 0x7, // 00000111 | 127 kSpecializedPayloadMask = 0x7, // 00000111 |
| 139 | 128 |
| 140 kSpecializedVariableGet = 128, | 129 kSpecializedVariableGet = 128, |
| 141 kSpecializedVariableSet = 136, | 130 kSpecializedVariableSet = 136, |
| 142 kSpecialIntLiteral = 144, | 131 kSpecialIntLiteral = 144, |
| 143 }; | 132 }; |
| 144 | 133 |
| 145 | 134 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 166 ASSERT(index < variables_.length()); | 155 ASSERT(index < variables_.length()); |
| 167 return variables_[index]; | 156 return variables_[index]; |
| 168 } | 157 } |
| 169 | 158 |
| 170 void Push(T* v) { | 159 void Push(T* v) { |
| 171 variables_.Add(v); | 160 variables_.Add(v); |
| 172 current_count_++; | 161 current_count_++; |
| 173 } | 162 } |
| 174 | 163 |
| 175 void Push(List<T>* decl) { | 164 void Push(List<T>* decl) { |
| 176 for (int i = 0; i < decl->length(); i++) { | 165 for (intptr_t i = 0; i < decl->length(); i++) { |
| 177 variables_.Add(decl[i]); | 166 variables_.Add(decl[i]); |
| 178 current_count_++; | 167 current_count_++; |
| 179 } | 168 } |
| 180 } | 169 } |
| 181 | 170 |
| 182 void Pop(T* decl) { | 171 void Pop(T* decl) { |
| 183 variables_.RemoveLast(); | 172 variables_.RemoveLast(); |
| 184 current_count_--; | 173 current_count_--; |
| 185 } | 174 } |
| 186 | 175 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 current_count_++; | 215 current_count_++; |
| 227 } | 216 } |
| 228 | 217 |
| 229 void Set(T* v, int index) { | 218 void Set(T* v, int index) { |
| 230 typename MallocMap<T, int>::Pair* entry = variables_.LookupPair(v); | 219 typename MallocMap<T, int>::Pair* entry = variables_.LookupPair(v); |
| 231 ASSERT(entry != NULL); | 220 ASSERT(entry != NULL); |
| 232 entry->value = index; | 221 entry->value = index; |
| 233 } | 222 } |
| 234 | 223 |
| 235 void Push(List<T>* decl) { | 224 void Push(List<T>* decl) { |
| 236 for (int i = 0; i < decl->length(); i++) { | 225 for (intptr_t i = 0; i < decl->length(); i++) { |
| 237 Push(decl[i]); | 226 Push(decl[i]); |
| 238 } | 227 } |
| 239 } | 228 } |
| 240 | 229 |
| 241 void Pop(T* v) { | 230 void Pop(T* v) { |
| 242 current_count_--; | 231 current_count_--; |
| 243 stack_height_--; | 232 stack_height_--; |
| 244 } | 233 } |
| 245 | 234 |
| 246 private: | 235 private: |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 Program* program() { return program_; } | 303 Program* program() { return program_; } |
| 315 void set_program(Program* program) { program_ = program; } | 304 void set_program(Program* program) { program_ = program; } |
| 316 | 305 |
| 317 BlockStack<VariableDeclaration>& variables() { return scope_; } | 306 BlockStack<VariableDeclaration>& variables() { return scope_; } |
| 318 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } | 307 BlockStack<TypeParameter>& type_parameters() { return type_parameters_; } |
| 319 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } | 308 BlockStack<SwitchCase>& switch_cases() { return switch_cases_; } |
| 320 | 309 |
| 321 BlockStack<LabeledStatement>* labels() { return labels_; } | 310 BlockStack<LabeledStatement>* labels() { return labels_; } |
| 322 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } | 311 void set_labels(BlockStack<LabeledStatement>* labels) { labels_ = labels; } |
| 323 | 312 |
| 313 CanonicalName* GetCanonicalName(int index) { return canonical_names_[index]; } |
| 314 void SetCanonicalName(int index, CanonicalName* name) { |
| 315 canonical_names_[index] = name; |
| 316 } |
| 317 void SetCanonicalNameCount(int count) { canonical_names_.SetLength(count); } |
| 318 |
| 324 private: | 319 private: |
| 325 Program* program_; | 320 Program* program_; |
| 321 MallocGrowableArray<Ref<CanonicalName> > canonical_names_; |
| 326 BlockStack<VariableDeclaration> scope_; | 322 BlockStack<VariableDeclaration> scope_; |
| 327 BlockStack<TypeParameter> type_parameters_; | 323 BlockStack<TypeParameter> type_parameters_; |
| 328 BlockStack<SwitchCase> switch_cases_; | 324 BlockStack<SwitchCase> switch_cases_; |
| 329 BlockStack<LabeledStatement>* labels_; | 325 BlockStack<LabeledStatement>* labels_; |
| 330 }; | 326 }; |
| 331 | 327 |
| 332 | 328 |
| 333 class Reader { | 329 class Reader { |
| 334 public: | 330 public: |
| 335 Reader(const uint8_t* buffer, int64_t size) | 331 Reader(const uint8_t* buffer, int64_t size) |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 return RT::ReadFrom(this); | 479 return RT::ReadFrom(this); |
| 484 } | 480 } |
| 485 | 481 |
| 486 template <typename T> | 482 template <typename T> |
| 487 T* ReadOptional() { | 483 T* ReadOptional() { |
| 488 return ReadOptional<T, T>(); | 484 return ReadOptional<T, T>(); |
| 489 } | 485 } |
| 490 | 486 |
| 491 ReaderHelper* helper() { return &builder_; } | 487 ReaderHelper* helper() { return &builder_; } |
| 492 | 488 |
| 489 CanonicalName* ReadCanonicalNameReference() { |
| 490 int index = ReadUInt(); |
| 491 if (index == 0) return NULL; |
| 492 CanonicalName* name = builder_.GetCanonicalName(index - 1); |
| 493 ASSERT(name != NULL); |
| 494 return name; |
| 495 } |
| 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 |
| 493 private: | 504 private: |
| 494 const uint8_t* buffer_; | 505 const uint8_t* buffer_; |
| 495 int64_t size_; | 506 int64_t size_; |
| 496 int64_t offset_; | 507 int64_t offset_; |
| 497 ReaderHelper builder_; | 508 ReaderHelper builder_; |
| 498 TokenPosition max_position_; | 509 TokenPosition max_position_; |
| 499 TokenPosition min_position_; | 510 TokenPosition min_position_; |
| 500 intptr_t current_script_id_; | 511 intptr_t current_script_id_; |
| 501 | 512 |
| 502 friend class PositionScope; | 513 friend class PositionScope; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 533 }; | 544 }; |
| 534 | 545 |
| 535 template <typename T> | 546 template <typename T> |
| 536 template <typename IT> | 547 template <typename IT> |
| 537 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { | 548 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { |
| 538 TRACE_READ_OFFSET(); | 549 TRACE_READ_OFFSET(); |
| 539 ASSERT(parent != NULL); | 550 ASSERT(parent != NULL); |
| 540 int length = reader->ReadListLength(); | 551 int length = reader->ReadListLength(); |
| 541 EnsureInitialized(length); | 552 EnsureInitialized(length); |
| 542 | 553 |
| 543 for (int i = 0; i < length_; i++) { | 554 for (intptr_t i = 0; i < length_; i++) { |
| 544 IT* object = GetOrCreate<IT>(i, parent); | 555 IT* object = GetOrCreate<IT>(i, parent); |
| 545 object->ReadFrom(reader); | 556 object->ReadFrom(reader); |
| 546 } | 557 } |
| 547 } | 558 } |
| 548 | 559 |
| 549 | 560 |
| 550 template <typename T> | 561 template <typename T> |
| 551 template <typename IT> | 562 template <typename IT> |
| 552 void List<T>::ReadFrom(Reader* reader) { | 563 void List<T>::ReadFrom(Reader* reader) { |
| 553 TRACE_READ_OFFSET(); | 564 TRACE_READ_OFFSET(); |
| 554 int length = reader->ReadListLength(); | 565 int length = reader->ReadListLength(); |
| 555 EnsureInitialized(length); | 566 EnsureInitialized(length); |
| 556 | 567 |
| 557 for (int i = 0; i < length_; i++) { | 568 for (intptr_t i = 0; i < length_; i++) { |
| 558 GetOrCreate<IT>(i)->ReadFrom(reader); | 569 GetOrCreate<IT>(i)->ReadFrom(reader); |
| 559 } | 570 } |
| 560 } | 571 } |
| 561 | 572 |
| 562 | 573 |
| 563 template <typename T> | 574 template <typename T> |
| 564 template <typename IT> | 575 template <typename IT> |
| 565 void List<T>::ReadFromStatic(Reader* reader) { | 576 void List<T>::ReadFromStatic(Reader* reader) { |
| 566 TRACE_READ_OFFSET(); | 577 TRACE_READ_OFFSET(); |
| 567 int length = reader->ReadListLength(); | 578 int length = reader->ReadListLength(); |
| 568 EnsureInitialized(length); | 579 EnsureInitialized(length); |
| 569 | 580 |
| 570 for (int i = 0; i < length_; i++) { | 581 for (intptr_t i = 0; i < length_; i++) { |
| 571 ASSERT(array_[i] == NULL); | 582 ASSERT(array_[i] == NULL); |
| 572 array_[i] = IT::ReadFrom(reader); | 583 array_[i] = IT::ReadFrom(reader); |
| 573 } | 584 } |
| 574 } | 585 } |
| 575 | 586 |
| 576 void TypeParameterList::ReadFrom(Reader* reader) { | 587 void TypeParameterList::ReadFrom(Reader* reader) { |
| 577 // It is possible for the bound of the first type parameter to refer to | 588 // It is possible for the bound of the first type parameter to refer to |
| 578 // the second type parameter. This means we need to create [TypeParameter] | 589 // the second type parameter. This means we need to create [TypeParameter] |
| 579 // objects before reading the bounds. | 590 // objects before reading the bounds. |
| 580 int length = reader->ReadListLength(); | 591 int length = reader->ReadListLength(); |
| 581 EnsureInitialized(length); | 592 EnsureInitialized(length); |
| 582 | 593 |
| 583 // Make all [TypeParameter]s available in scope. | 594 // Make all [TypeParameter]s available in scope. |
| 584 for (int i = 0; i < length; i++) { | 595 for (intptr_t i = 0; i < length; i++) { |
| 585 TypeParameter* parameter = (*this)[i] = new TypeParameter(); | 596 TypeParameter* parameter = (*this)[i] = new TypeParameter(); |
| 586 reader->helper()->type_parameters().Push(parameter); | 597 reader->helper()->type_parameters().Push(parameter); |
| 587 } | 598 } |
| 588 | 599 |
| 589 // Read all [TypeParameter]s and their bounds. | 600 // Read all [TypeParameter]s and their bounds. |
| 590 for (int i = 0; i < length; i++) { | 601 for (intptr_t i = 0; i < length; i++) { |
| 591 (*this)[i]->ReadFrom(reader); | 602 (*this)[i]->ReadFrom(reader); |
| 592 } | 603 } |
| 593 } | 604 } |
| 594 | 605 |
| 595 | 606 |
| 596 template <typename A, typename B> | 607 template <typename A, typename B> |
| 597 Tuple<A, B>* Tuple<A, B>::ReadFrom(Reader* reader) { | 608 Tuple<A, B>* Tuple<A, B>::ReadFrom(Reader* reader) { |
| 598 TRACE_READ_OFFSET(); | 609 TRACE_READ_OFFSET(); |
| 599 A* first = A::ReadFrom(reader); | 610 A* first = A::ReadFrom(reader); |
| 600 B* second = B::ReadFrom(reader); | 611 B* second = B::ReadFrom(reader); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 } | 677 } |
| 667 line_starts_[i] = line_starts; | 678 line_starts_[i] = line_starts; |
| 668 } | 679 } |
| 669 } | 680 } |
| 670 | 681 |
| 671 | 682 |
| 672 Library* Library::ReadFrom(Reader* reader) { | 683 Library* Library::ReadFrom(Reader* reader) { |
| 673 TRACE_READ_OFFSET(); | 684 TRACE_READ_OFFSET(); |
| 674 int flags = reader->ReadFlags(); | 685 int flags = reader->ReadFlags(); |
| 675 ASSERT(flags == 0); // external libraries not supported | 686 ASSERT(flags == 0); // external libraries not supported |
| 687 |
| 688 CanonicalName* canonical_name = |
| 689 reader->ReadDefiningCanonicalNameReference(this); |
| 690 |
| 676 name_ = Reference::ReadStringFrom(reader); | 691 name_ = Reference::ReadStringFrom(reader); |
| 677 import_uri_ = Reference::ReadStringFrom(reader); | 692 import_uri_ = canonical_name->name(); |
| 678 source_uri_index_ = reader->ReadUInt(); | 693 source_uri_index_ = reader->ReadUInt(); |
| 679 reader->set_current_script_id(source_uri_index_); | 694 reader->set_current_script_id(source_uri_index_); |
| 680 | 695 |
| 681 int num_imports = reader->ReadUInt(); | 696 int num_imports = reader->ReadUInt(); |
| 682 if (num_imports != 0) { | 697 if (num_imports != 0) { |
| 683 FATAL("Deferred imports not implemented in VM"); | 698 FATAL("Deferred imports not implemented in VM"); |
| 684 } | 699 } |
| 685 int num_classes = reader->ReadUInt(); | 700 int num_classes = reader->ReadUInt(); |
| 686 classes().EnsureInitialized(num_classes); | 701 classes().EnsureInitialized(num_classes); |
| 687 for (int i = 0; i < num_classes; i++) { | 702 for (intptr_t i = 0; i < num_classes; i++) { |
| 688 Tag tag = reader->ReadTag(); | 703 Tag tag = reader->ReadTag(); |
| 689 if (tag == kNormalClass) { | 704 ASSERT(tag == kClass); |
| 690 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); | 705 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); |
| 691 klass->ReadFrom(reader); | 706 klass->ReadFrom(reader); |
| 692 } else { | |
| 693 ASSERT(tag == kMixinClass); | |
| 694 MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this); | |
| 695 klass->ReadFrom(reader); | |
| 696 } | |
| 697 } | 707 } |
| 698 | 708 |
| 699 fields().ReadFrom<Field>(reader, this); | 709 fields().ReadFrom<Field>(reader, this); |
| 700 procedures().ReadFrom<Procedure>(reader, this); | 710 procedures().ReadFrom<Procedure>(reader, this); |
| 701 return this; | 711 return this; |
| 702 } | 712 } |
| 703 | 713 |
| 704 | 714 |
| 705 Class* Class::ReadFrom(Reader* reader) { | 715 Class* Class::ReadFrom(Reader* reader) { |
| 706 TRACE_READ_OFFSET(); | 716 TRACE_READ_OFFSET(); |
| 707 | 717 |
| 718 reader->ReadDefiningCanonicalNameReference(this); |
| 708 position_ = reader->ReadPosition(false); | 719 position_ = reader->ReadPosition(false); |
| 709 is_abstract_ = reader->ReadBool(); | 720 is_abstract_ = reader->ReadBool(); |
| 710 name_ = Reference::ReadStringFrom(reader); | 721 name_ = Reference::ReadStringFrom(reader); |
| 711 source_uri_index_ = reader->ReadUInt(); | 722 source_uri_index_ = reader->ReadUInt(); |
| 712 reader->set_current_script_id(source_uri_index_); | 723 reader->set_current_script_id(source_uri_index_); |
| 713 reader->record_token_position(position_); | 724 reader->record_token_position(position_); |
| 714 annotations_.ReadFromStatic<Expression>(reader); | 725 annotations_.ReadFromStatic<Expression>(reader); |
| 715 | 726 |
| 716 return this; | 727 return this; |
| 717 } | 728 } |
| 718 | 729 |
| 719 | 730 |
| 720 NormalClass* NormalClass::ReadFrom(Reader* reader) { | 731 NormalClass* NormalClass::ReadFrom(Reader* reader) { |
| 721 TRACE_READ_OFFSET(); | 732 TRACE_READ_OFFSET(); |
| 722 Class::ReadFrom(reader); | 733 Class::ReadFrom(reader); |
| 723 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 734 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 724 | 735 |
| 725 type_parameters_.ReadFrom(reader); | 736 type_parameters_.ReadFrom(reader); |
| 726 DartType* type = reader->ReadOptional<DartType>(); | 737 DartType* type = reader->ReadOptional<DartType>(); |
| 727 | 738 |
| 728 super_class_ = InterfaceType::Cast(type); | 739 super_class_ = InterfaceType::Cast(type); |
| 740 reader->ReadOptional<DartType>(); // Mixed-in type is unused. |
| 729 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 741 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
| 730 reader); | 742 reader); |
| 731 fields_.ReadFrom<Field>(reader, this); | 743 fields_.ReadFrom<Field>(reader, this); |
| 732 constructors_.ReadFrom<Constructor>(reader, this); | 744 constructors_.ReadFrom<Constructor>(reader, this); |
| 733 procedures_.ReadFrom<Procedure>(reader, this); | 745 procedures_.ReadFrom<Procedure>(reader, this); |
| 734 | 746 |
| 735 return this; | 747 return this; |
| 736 } | 748 } |
| 737 | 749 |
| 738 | 750 |
| 739 MixinClass* MixinClass::ReadFrom(Reader* reader) { | 751 MixinClass* MixinClass::ReadFrom(Reader* reader) { |
| 740 TRACE_READ_OFFSET(); | 752 TRACE_READ_OFFSET(); |
| 741 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 753 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 742 | 754 |
| 743 Class::ReadFrom(reader); | 755 Class::ReadFrom(reader); |
| 744 type_parameters_.ReadFrom(reader); | 756 type_parameters_.ReadFrom(reader); |
| 745 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 757 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 746 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 758 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 747 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 759 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
| 748 reader); | 760 reader); |
| 749 constructors_.ReadFrom<Constructor>(reader, this); | 761 constructors_.ReadFrom<Constructor>(reader, this); |
| 750 return this; | 762 return this; |
| 751 } | 763 } |
| 752 | 764 |
| 753 | 765 |
| 754 Member* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { | 766 CanonicalName* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
| 755 TRACE_READ_OFFSET(); | 767 TRACE_READ_OFFSET(); |
| 756 | 768 |
| 757 Program* program = reader->helper()->program(); | 769 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
| 758 Tag tag = reader->ReadTag(); | 770 if (canonical_name == NULL && !allow_null) { |
| 759 switch (tag) { | 771 FATAL("Expected a valid member reference, but got `null`"); |
| 760 case kLibraryFieldReference: { | |
| 761 int library_idx = reader->ReadUInt(); | |
| 762 int field_idx = reader->ReadUInt(); | |
| 763 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | |
| 764 return library->fields().GetOrCreate<Field>(field_idx, library); | |
| 765 } | |
| 766 case kLibraryProcedureReference: { | |
| 767 int library_idx = reader->ReadUInt(); | |
| 768 int procedure_idx = reader->ReadUInt(); | |
| 769 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | |
| 770 return library->procedures().GetOrCreate<Procedure>(procedure_idx, | |
| 771 library); | |
| 772 } | |
| 773 case kClassFieldReference: | |
| 774 case kClassConstructorReference: | |
| 775 case kClassProcedureReference: { | |
| 776 Class* klass = Reference::ReadClassFrom(reader); | |
| 777 if (tag == kClassFieldReference) { | |
| 778 int field_idx = reader->ReadUInt(); | |
| 779 return klass->fields().GetOrCreate<Field>(field_idx, klass); | |
| 780 } else if (tag == kClassConstructorReference) { | |
| 781 int constructor_idx = reader->ReadUInt(); | |
| 782 return klass->constructors().GetOrCreate<Constructor>(constructor_idx, | |
| 783 klass); | |
| 784 } else { | |
| 785 ASSERT(tag == kClassProcedureReference); | |
| 786 int procedure_idx = reader->ReadUInt(); | |
| 787 return klass->procedures().GetOrCreate<Procedure>(procedure_idx, klass); | |
| 788 } | |
| 789 } | |
| 790 case kNullReference: | |
| 791 if (allow_null) { | |
| 792 return NULL; | |
| 793 } else { | |
| 794 FATAL("Expected a valid member reference, but got `null`"); | |
| 795 } | |
| 796 default: | |
| 797 UNREACHABLE(); | |
| 798 break; | |
| 799 } | 772 } |
| 800 | 773 |
| 801 UNREACHABLE(); | 774 if (canonical_name != NULL) { |
| 802 return NULL; | 775 canonical_name->set_referenced(true); |
| 776 } |
| 777 |
| 778 return canonical_name; |
| 803 } | 779 } |
| 804 | 780 |
| 805 | 781 |
| 806 Class* Reference::ReadClassFrom(Reader* reader, bool allow_null) { | 782 CanonicalName* Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
| 807 TRACE_READ_OFFSET(); | 783 TRACE_READ_OFFSET(); |
| 808 Program* program = reader->helper()->program(); | |
| 809 | 784 |
| 810 Tag klass_member_tag = reader->ReadTag(); | 785 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
| 811 if (klass_member_tag == kNullReference) { | 786 if (canonical_name == NULL && !allow_null) { |
| 812 if (allow_null) { | 787 FATAL("Expected a valid class reference, but got `null`"); |
| 813 return NULL; | |
| 814 } else { | |
| 815 FATAL("Expected a valid class reference but got `null`."); | |
| 816 } | |
| 817 } | 788 } |
| 818 int library_idx = reader->ReadUInt(); | |
| 819 int class_idx = reader->ReadUInt(); | |
| 820 | 789 |
| 821 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | 790 if (canonical_name != NULL) { |
| 822 Class* klass; | 791 canonical_name->set_referenced(true); |
| 823 if (klass_member_tag == kNormalClassReference) { | |
| 824 klass = library->classes().GetOrCreate<NormalClass>(class_idx, library); | |
| 825 } else { | |
| 826 ASSERT(klass_member_tag == kMixinClassReference); | |
| 827 klass = library->classes().GetOrCreate<MixinClass>(class_idx, library); | |
| 828 } | 792 } |
| 829 return klass; | 793 |
| 794 return canonical_name; |
| 830 } | 795 } |
| 831 | 796 |
| 832 | 797 |
| 833 String* Reference::ReadStringFrom(Reader* reader) { | 798 String* Reference::ReadStringFrom(Reader* reader) { |
| 834 int index = reader->ReadUInt(); | 799 int index = reader->ReadUInt(); |
| 835 return reader->helper()->program()->string_table().strings()[index]; | 800 return reader->helper()->program()->string_table().strings()[index]; |
| 836 } | 801 } |
| 837 | 802 |
| 838 | 803 |
| 839 Field* Field::ReadFrom(Reader* reader) { | 804 Field* Field::ReadFrom(Reader* reader) { |
| 840 TRACE_READ_OFFSET(); | 805 TRACE_READ_OFFSET(); |
| 841 Tag tag = reader->ReadTag(); | 806 Tag tag = reader->ReadTag(); |
| 842 ASSERT(tag == kField); | 807 ASSERT(tag == kField); |
| 843 | 808 |
| 809 reader->ReadDefiningCanonicalNameReference(this); |
| 844 position_ = reader->ReadPosition(false); | 810 position_ = reader->ReadPosition(false); |
| 845 end_position_ = reader->ReadPosition(false); | 811 end_position_ = reader->ReadPosition(false); |
| 846 flags_ = reader->ReadFlags(); | 812 flags_ = reader->ReadFlags(); |
| 847 name_ = Name::ReadFrom(reader); | 813 name_ = Name::ReadFrom(reader); |
| 848 source_uri_index_ = reader->ReadUInt(); | 814 source_uri_index_ = reader->ReadUInt(); |
| 849 reader->set_current_script_id(source_uri_index_); | 815 reader->set_current_script_id(source_uri_index_); |
| 850 reader->record_token_position(position_); | 816 reader->record_token_position(position_); |
| 851 reader->record_token_position(end_position_); | 817 reader->record_token_position(end_position_); |
| 852 annotations_.ReadFromStatic<Expression>(reader); | 818 annotations_.ReadFromStatic<Expression>(reader); |
| 853 type_ = DartType::ReadFrom(reader); | 819 type_ = DartType::ReadFrom(reader); |
| 854 inferred_value_ = reader->ReadOptional<InferredValue>(); | 820 inferred_value_ = reader->ReadOptional<InferredValue>(); |
| 855 initializer_ = reader->ReadOptional<Expression>(); | 821 initializer_ = reader->ReadOptional<Expression>(); |
| 856 return this; | 822 return this; |
| 857 } | 823 } |
| 858 | 824 |
| 859 | 825 |
| 860 Constructor* Constructor::ReadFrom(Reader* reader) { | 826 Constructor* Constructor::ReadFrom(Reader* reader) { |
| 861 TRACE_READ_OFFSET(); | 827 TRACE_READ_OFFSET(); |
| 862 Tag tag = reader->ReadTag(); | 828 Tag tag = reader->ReadTag(); |
| 863 ASSERT(tag == kConstructor); | 829 ASSERT(tag == kConstructor); |
| 864 | 830 |
| 831 reader->ReadDefiningCanonicalNameReference(this); |
| 865 VariableScope<ReaderHelper> parameters(reader->helper()); | 832 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 866 position_ = reader->ReadPosition(); | 833 position_ = reader->ReadPosition(); |
| 867 end_position_ = reader->ReadPosition(); | 834 end_position_ = reader->ReadPosition(); |
| 868 flags_ = reader->ReadFlags(); | 835 flags_ = reader->ReadFlags(); |
| 869 name_ = Name::ReadFrom(reader); | 836 name_ = Name::ReadFrom(reader); |
| 870 annotations_.ReadFromStatic<Expression>(reader); | 837 annotations_.ReadFromStatic<Expression>(reader); |
| 871 function_ = FunctionNode::ReadFrom(reader); | 838 function_ = FunctionNode::ReadFrom(reader); |
| 872 initializers_.ReadFromStatic<Initializer>(reader); | 839 initializers_.ReadFromStatic<Initializer>(reader); |
| 873 return this; | 840 return this; |
| 874 } | 841 } |
| 875 | 842 |
| 876 | 843 |
| 877 Procedure* Procedure::ReadFrom(Reader* reader) { | 844 Procedure* Procedure::ReadFrom(Reader* reader) { |
| 878 TRACE_READ_OFFSET(); | 845 TRACE_READ_OFFSET(); |
| 879 Tag tag = reader->ReadTag(); | 846 Tag tag = reader->ReadTag(); |
| 880 ASSERT(tag == kProcedure); | 847 ASSERT(tag == kProcedure); |
| 881 | 848 |
| 849 reader->ReadDefiningCanonicalNameReference(this); |
| 882 VariableScope<ReaderHelper> parameters(reader->helper()); | 850 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 883 position_ = reader->ReadPosition(false); | 851 position_ = reader->ReadPosition(false); |
| 884 end_position_ = reader->ReadPosition(false); | 852 end_position_ = reader->ReadPosition(false); |
| 885 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 853 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
| 886 flags_ = reader->ReadFlags(); | 854 flags_ = reader->ReadFlags(); |
| 887 name_ = Name::ReadFrom(reader); | 855 name_ = Name::ReadFrom(reader); |
| 888 source_uri_index_ = reader->ReadUInt(); | 856 source_uri_index_ = reader->ReadUInt(); |
| 889 reader->set_current_script_id(source_uri_index_); | 857 reader->set_current_script_id(source_uri_index_); |
| 890 reader->record_token_position(position_); | 858 reader->record_token_position(position_); |
| 891 reader->record_token_position(end_position_); | 859 reader->record_token_position(end_position_); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 918 | 886 |
| 919 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { | 887 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { |
| 920 TRACE_READ_OFFSET(); | 888 TRACE_READ_OFFSET(); |
| 921 return new InvalidInitializer(); | 889 return new InvalidInitializer(); |
| 922 } | 890 } |
| 923 | 891 |
| 924 | 892 |
| 925 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { | 893 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { |
| 926 TRACE_READ_OFFSET(); | 894 TRACE_READ_OFFSET(); |
| 927 FieldInitializer* initializer = new FieldInitializer(); | 895 FieldInitializer* initializer = new FieldInitializer(); |
| 928 initializer->field_ = Field::Cast(Reference::ReadMemberFrom(reader)); | 896 initializer->field_reference_ = Reference::ReadMemberFrom(reader); |
| 929 initializer->value_ = Expression::ReadFrom(reader); | 897 initializer->value_ = Expression::ReadFrom(reader); |
| 930 return initializer; | 898 return initializer; |
| 931 } | 899 } |
| 932 | 900 |
| 933 | 901 |
| 934 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { | 902 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { |
| 935 TRACE_READ_OFFSET(); | 903 TRACE_READ_OFFSET(); |
| 936 SuperInitializer* init = new SuperInitializer(); | 904 SuperInitializer* init = new SuperInitializer(); |
| 937 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 905 init->target_reference_ = Reference::ReadMemberFrom(reader); |
| 938 init->arguments_ = Arguments::ReadFrom(reader); | 906 init->arguments_ = Arguments::ReadFrom(reader); |
| 939 return init; | 907 return init; |
| 940 } | 908 } |
| 941 | 909 |
| 942 | 910 |
| 943 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { | 911 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { |
| 944 TRACE_READ_OFFSET(); | 912 TRACE_READ_OFFSET(); |
| 945 RedirectingInitializer* init = new RedirectingInitializer(); | 913 RedirectingInitializer* init = new RedirectingInitializer(); |
| 946 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 914 init->target_reference_ = Reference::ReadMemberFrom(reader); |
| 947 init->arguments_ = Arguments::ReadFrom(reader); | 915 init->arguments_ = Arguments::ReadFrom(reader); |
| 948 return init; | 916 return init; |
| 949 } | 917 } |
| 950 | 918 |
| 951 | 919 |
| 952 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { | 920 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { |
| 953 TRACE_READ_OFFSET(); | 921 TRACE_READ_OFFSET(); |
| 954 LocalInitializer* init = new LocalInitializer(); | 922 LocalInitializer* init = new LocalInitializer(); |
| 955 init->variable_ = VariableDeclaration::ReadFromImpl(reader); | 923 init->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 956 return init; | 924 return init; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1101 return set; | 1069 return set; |
| 1102 } | 1070 } |
| 1103 | 1071 |
| 1104 | 1072 |
| 1105 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { | 1073 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { |
| 1106 TRACE_READ_OFFSET(); | 1074 TRACE_READ_OFFSET(); |
| 1107 PropertyGet* get = new PropertyGet(); | 1075 PropertyGet* get = new PropertyGet(); |
| 1108 get->position_ = reader->ReadPosition(); | 1076 get->position_ = reader->ReadPosition(); |
| 1109 get->receiver_ = Expression::ReadFrom(reader); | 1077 get->receiver_ = Expression::ReadFrom(reader); |
| 1110 get->name_ = Name::ReadFrom(reader); | 1078 get->name_ = Name::ReadFrom(reader); |
| 1111 get->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1079 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
| 1112 return get; | 1080 return get; |
| 1113 } | 1081 } |
| 1114 | 1082 |
| 1115 | 1083 |
| 1116 PropertySet* PropertySet::ReadFrom(Reader* reader) { | 1084 PropertySet* PropertySet::ReadFrom(Reader* reader) { |
| 1117 TRACE_READ_OFFSET(); | 1085 TRACE_READ_OFFSET(); |
| 1118 PropertySet* set = new PropertySet(); | 1086 PropertySet* set = new PropertySet(); |
| 1119 set->position_ = reader->ReadPosition(); | 1087 set->position_ = reader->ReadPosition(); |
| 1120 set->receiver_ = Expression::ReadFrom(reader); | 1088 set->receiver_ = Expression::ReadFrom(reader); |
| 1121 set->name_ = Name::ReadFrom(reader); | 1089 set->name_ = Name::ReadFrom(reader); |
| 1122 set->value_ = Expression::ReadFrom(reader); | 1090 set->value_ = Expression::ReadFrom(reader); |
| 1123 set->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1091 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
| 1124 return set; | 1092 return set; |
| 1125 } | 1093 } |
| 1126 | 1094 |
| 1127 | 1095 |
| 1128 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { | 1096 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { |
| 1129 TRACE_READ_OFFSET(); | 1097 TRACE_READ_OFFSET(); |
| 1130 DirectPropertyGet* get = new DirectPropertyGet(); | 1098 DirectPropertyGet* get = new DirectPropertyGet(); |
| 1131 get->receiver_ = Expression::ReadFrom(reader); | 1099 get->receiver_ = Expression::ReadFrom(reader); |
| 1132 get->target_ = Reference::ReadMemberFrom(reader); | 1100 get->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1133 return get; | 1101 return get; |
| 1134 } | 1102 } |
| 1135 | 1103 |
| 1136 | 1104 |
| 1137 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { | 1105 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { |
| 1138 TRACE_READ_OFFSET(); | 1106 TRACE_READ_OFFSET(); |
| 1139 DirectPropertySet* set = new DirectPropertySet(); | 1107 DirectPropertySet* set = new DirectPropertySet(); |
| 1140 set->receiver_ = Expression::ReadFrom(reader); | 1108 set->receiver_ = Expression::ReadFrom(reader); |
| 1141 set->target_ = Reference::ReadMemberFrom(reader); | 1109 set->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1142 set->value_ = Expression::ReadFrom(reader); | 1110 set->value_ = Expression::ReadFrom(reader); |
| 1143 return set; | 1111 return set; |
| 1144 } | 1112 } |
| 1145 | 1113 |
| 1146 | 1114 |
| 1147 StaticGet* StaticGet::ReadFrom(Reader* reader) { | 1115 StaticGet* StaticGet::ReadFrom(Reader* reader) { |
| 1148 TRACE_READ_OFFSET(); | 1116 TRACE_READ_OFFSET(); |
| 1149 StaticGet* get = new StaticGet(); | 1117 StaticGet* get = new StaticGet(); |
| 1150 get->position_ = reader->ReadPosition(); | 1118 get->position_ = reader->ReadPosition(); |
| 1151 get->target_ = Reference::ReadMemberFrom(reader); | 1119 get->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1152 return get; | 1120 return get; |
| 1153 } | 1121 } |
| 1154 | 1122 |
| 1155 | 1123 |
| 1156 StaticSet* StaticSet::ReadFrom(Reader* reader) { | 1124 StaticSet* StaticSet::ReadFrom(Reader* reader) { |
| 1157 TRACE_READ_OFFSET(); | 1125 TRACE_READ_OFFSET(); |
| 1158 StaticSet* set = new StaticSet(); | 1126 StaticSet* set = new StaticSet(); |
| 1159 set->target_ = Reference::ReadMemberFrom(reader); | 1127 set->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1160 set->expression_ = Expression::ReadFrom(reader); | 1128 set->expression_ = Expression::ReadFrom(reader); |
| 1161 return set; | 1129 return set; |
| 1162 } | 1130 } |
| 1163 | 1131 |
| 1164 | 1132 |
| 1165 Arguments* Arguments::ReadFrom(Reader* reader) { | 1133 Arguments* Arguments::ReadFrom(Reader* reader) { |
| 1166 TRACE_READ_OFFSET(); | 1134 TRACE_READ_OFFSET(); |
| 1167 Arguments* arguments = new Arguments(); | 1135 Arguments* arguments = new Arguments(); |
| 1168 arguments->types().ReadFromStatic<DartType>(reader); | 1136 arguments->types().ReadFromStatic<DartType>(reader); |
| 1169 arguments->positional().ReadFromStatic<Expression>(reader); | 1137 arguments->positional().ReadFromStatic<Expression>(reader); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1180 } | 1148 } |
| 1181 | 1149 |
| 1182 | 1150 |
| 1183 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { | 1151 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { |
| 1184 TRACE_READ_OFFSET(); | 1152 TRACE_READ_OFFSET(); |
| 1185 MethodInvocation* invocation = new MethodInvocation(); | 1153 MethodInvocation* invocation = new MethodInvocation(); |
| 1186 invocation->position_ = reader->ReadPosition(); | 1154 invocation->position_ = reader->ReadPosition(); |
| 1187 invocation->receiver_ = Expression::ReadFrom(reader); | 1155 invocation->receiver_ = Expression::ReadFrom(reader); |
| 1188 invocation->name_ = Name::ReadFrom(reader); | 1156 invocation->name_ = Name::ReadFrom(reader); |
| 1189 invocation->arguments_ = Arguments::ReadFrom(reader); | 1157 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1190 invocation->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1158 invocation->interface_target_reference_ = |
| 1159 Reference::ReadMemberFrom(reader, true); |
| 1191 return invocation; | 1160 return invocation; |
| 1192 } | 1161 } |
| 1193 | 1162 |
| 1194 | 1163 |
| 1195 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { | 1164 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { |
| 1196 TRACE_READ_OFFSET(); | 1165 TRACE_READ_OFFSET(); |
| 1197 DirectMethodInvocation* invocation = new DirectMethodInvocation(); | 1166 DirectMethodInvocation* invocation = new DirectMethodInvocation(); |
| 1198 invocation->receiver_ = Expression::ReadFrom(reader); | 1167 invocation->receiver_ = Expression::ReadFrom(reader); |
| 1199 invocation->target_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1168 invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1200 invocation->arguments_ = Arguments::ReadFrom(reader); | 1169 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1201 return invocation; | 1170 return invocation; |
| 1202 } | 1171 } |
| 1203 | 1172 |
| 1204 | 1173 |
| 1205 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { | 1174 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { |
| 1206 TRACE_READ_OFFSET(); | 1175 TRACE_READ_OFFSET(); |
| 1207 StaticInvocation* invocation = new StaticInvocation(); | 1176 StaticInvocation* invocation = new StaticInvocation(); |
| 1208 invocation->is_const_ = is_const; | 1177 invocation->is_const_ = is_const; |
| 1209 invocation->position_ = reader->ReadPosition(); | 1178 invocation->position_ = reader->ReadPosition(); |
| 1210 invocation->procedure_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1179 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); |
| 1211 invocation->arguments_ = Arguments::ReadFrom(reader); | 1180 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1212 return invocation; | 1181 return invocation; |
| 1213 } | 1182 } |
| 1214 | 1183 |
| 1215 | 1184 |
| 1216 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, | 1185 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, |
| 1217 bool is_const) { | 1186 bool is_const) { |
| 1218 TRACE_READ_OFFSET(); | 1187 TRACE_READ_OFFSET(); |
| 1219 ConstructorInvocation* invocation = new ConstructorInvocation(); | 1188 ConstructorInvocation* invocation = new ConstructorInvocation(); |
| 1220 invocation->is_const_ = is_const; | 1189 invocation->is_const_ = is_const; |
| 1221 invocation->position_ = reader->ReadPosition(); | 1190 invocation->position_ = reader->ReadPosition(); |
| 1222 invocation->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 1191 invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
| 1223 invocation->arguments_ = Arguments::ReadFrom(reader); | 1192 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1224 return invocation; | 1193 return invocation; |
| 1225 } | 1194 } |
| 1226 | 1195 |
| 1227 | 1196 |
| 1228 Not* Not::ReadFrom(Reader* reader) { | 1197 Not* Not::ReadFrom(Reader* reader) { |
| 1229 TRACE_READ_OFFSET(); | 1198 TRACE_READ_OFFSET(); |
| 1230 Not* n = new Not(); | 1199 Not* n = new Not(); |
| 1231 n->expression_ = Expression::ReadFrom(reader); | 1200 n->expression_ = Expression::ReadFrom(reader); |
| 1232 return n; | 1201 return n; |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1598 | 1567 |
| 1599 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { | 1568 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { |
| 1600 TRACE_READ_OFFSET(); | 1569 TRACE_READ_OFFSET(); |
| 1601 SwitchCaseScope<ReaderHelper> scope(reader->helper()); | 1570 SwitchCaseScope<ReaderHelper> scope(reader->helper()); |
| 1602 SwitchStatement* stmt = new SwitchStatement(); | 1571 SwitchStatement* stmt = new SwitchStatement(); |
| 1603 stmt->condition_ = Expression::ReadFrom(reader); | 1572 stmt->condition_ = Expression::ReadFrom(reader); |
| 1604 // We need to explicitly create empty [SwitchCase]s first in order to add them | 1573 // We need to explicitly create empty [SwitchCase]s first in order to add them |
| 1605 // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch | 1574 // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch |
| 1606 // case can refer to one defined later on. | 1575 // case can refer to one defined later on. |
| 1607 int count = reader->ReadUInt(); | 1576 int count = reader->ReadUInt(); |
| 1608 for (int i = 0; i < count; i++) { | 1577 for (intptr_t i = 0; i < count; i++) { |
| 1609 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); | 1578 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); |
| 1610 reader->helper()->switch_cases().Push(sc); | 1579 reader->helper()->switch_cases().Push(sc); |
| 1611 } | 1580 } |
| 1612 for (int i = 0; i < count; i++) { | 1581 for (intptr_t i = 0; i < count; i++) { |
| 1613 SwitchCase* sc = stmt->cases_[i]; | 1582 SwitchCase* sc = stmt->cases_[i]; |
| 1614 sc->ReadFrom(reader); | 1583 sc->ReadFrom(reader); |
| 1615 } | 1584 } |
| 1616 return stmt; | 1585 return stmt; |
| 1617 } | 1586 } |
| 1618 | 1587 |
| 1619 | 1588 |
| 1620 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { | 1589 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { |
| 1621 TRACE_READ_OFFSET(); | 1590 TRACE_READ_OFFSET(); |
| 1622 expressions_.ReadFromStatic<Expression>(reader); | 1591 expressions_.ReadFromStatic<Expression>(reader); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1743 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); | 1712 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 1744 VariableScope<ReaderHelper> parameters(reader->helper()); | 1713 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 1745 decl->function_ = FunctionNode::ReadFrom(reader); | 1714 decl->function_ = FunctionNode::ReadFrom(reader); |
| 1746 return decl; | 1715 return decl; |
| 1747 } | 1716 } |
| 1748 | 1717 |
| 1749 | 1718 |
| 1750 Name* Name::ReadFrom(Reader* reader) { | 1719 Name* Name::ReadFrom(Reader* reader) { |
| 1751 String* string = Reference::ReadStringFrom(reader); | 1720 String* string = Reference::ReadStringFrom(reader); |
| 1752 if (string->size() >= 1 && string->buffer()[0] == '_') { | 1721 if (string->size() >= 1 && string->buffer()[0] == '_') { |
| 1753 int lib_index = reader->ReadUInt(); | 1722 CanonicalName* library_reference = reader->ReadCanonicalNameReference(); |
| 1754 Library* library = | 1723 return new Name(string, library_reference); |
| 1755 reader->helper()->program()->libraries().GetOrCreate<Library>( | |
| 1756 lib_index); | |
| 1757 return new Name(string, library); | |
| 1758 } else { | 1724 } else { |
| 1759 return new Name(string, NULL); | 1725 return new Name(string, NULL); |
| 1760 } | 1726 } |
| 1761 } | 1727 } |
| 1762 | 1728 |
| 1763 | 1729 |
| 1764 InferredValue* InferredValue::ReadFrom(Reader* reader) { | 1730 InferredValue* InferredValue::ReadFrom(Reader* reader) { |
| 1765 InferredValue* type = new InferredValue(); | 1731 InferredValue* type = new InferredValue(); |
| 1766 type->klass_ = Reference::ReadClassFrom(reader, true); | 1732 type->klass_reference_ = Reference::ReadClassFrom(reader, true); |
| 1767 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); | 1733 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); |
| 1768 type->value_bits_ = reader->ReadByte(); | 1734 type->value_bits_ = reader->ReadByte(); |
| 1769 return type; | 1735 return type; |
| 1770 } | 1736 } |
| 1771 | 1737 |
| 1772 | 1738 |
| 1773 DartType* DartType::ReadFrom(Reader* reader) { | 1739 DartType* DartType::ReadFrom(Reader* reader) { |
| 1774 TRACE_READ_OFFSET(); | 1740 TRACE_READ_OFFSET(); |
| 1775 Tag tag = reader->ReadTag(); | 1741 Tag tag = reader->ReadTag(); |
| 1776 switch (tag) { | 1742 switch (tag) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1811 | 1777 |
| 1812 | 1778 |
| 1813 VoidType* VoidType::ReadFrom(Reader* reader) { | 1779 VoidType* VoidType::ReadFrom(Reader* reader) { |
| 1814 TRACE_READ_OFFSET(); | 1780 TRACE_READ_OFFSET(); |
| 1815 return new VoidType(); | 1781 return new VoidType(); |
| 1816 } | 1782 } |
| 1817 | 1783 |
| 1818 | 1784 |
| 1819 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { | 1785 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
| 1820 TRACE_READ_OFFSET(); | 1786 TRACE_READ_OFFSET(); |
| 1821 Class* klass = Reference::ReadClassFrom(reader); | 1787 CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
| 1822 InterfaceType* type = new InterfaceType(klass); | 1788 InterfaceType* type = new InterfaceType(klass_name); |
| 1823 type->type_arguments().ReadFromStatic<DartType>(reader); | 1789 type->type_arguments().ReadFromStatic<DartType>(reader); |
| 1824 return type; | 1790 return type; |
| 1825 } | 1791 } |
| 1826 | 1792 |
| 1827 | 1793 |
| 1828 InterfaceType* InterfaceType::ReadFrom(Reader* reader, | 1794 InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
| 1829 bool _without_type_arguments_) { | 1795 bool _without_type_arguments_) { |
| 1830 TRACE_READ_OFFSET(); | 1796 TRACE_READ_OFFSET(); |
| 1831 Class* klass = Reference::ReadClassFrom(reader); | 1797 CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
| 1832 InterfaceType* type = new InterfaceType(klass); | 1798 InterfaceType* type = new InterfaceType(klass_name); |
| 1833 ASSERT(_without_type_arguments_); | 1799 ASSERT(_without_type_arguments_); |
| 1834 return type; | 1800 return type; |
| 1835 } | 1801 } |
| 1836 | 1802 |
| 1837 | 1803 |
| 1838 FunctionType* FunctionType::ReadFrom(Reader* reader) { | 1804 FunctionType* FunctionType::ReadFrom(Reader* reader) { |
| 1839 TRACE_READ_OFFSET(); | 1805 TRACE_READ_OFFSET(); |
| 1840 FunctionType* type = new FunctionType(); | 1806 FunctionType* type = new FunctionType(); |
| 1841 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1807 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 1842 type->type_parameters().ReadFrom(reader); | 1808 type->type_parameters().ReadFrom(reader); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1867 return type; | 1833 return type; |
| 1868 } | 1834 } |
| 1869 | 1835 |
| 1870 | 1836 |
| 1871 Program* Program::ReadFrom(Reader* reader) { | 1837 Program* Program::ReadFrom(Reader* reader) { |
| 1872 TRACE_READ_OFFSET(); | 1838 TRACE_READ_OFFSET(); |
| 1873 uint32_t magic = reader->ReadUInt32(); | 1839 uint32_t magic = reader->ReadUInt32(); |
| 1874 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); | 1840 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
| 1875 | 1841 |
| 1876 Program* program = new Program(); | 1842 Program* program = new Program(); |
| 1843 program->canonical_name_root_ = CanonicalName::NewRoot(); |
| 1877 reader->helper()->set_program(program); | 1844 reader->helper()->set_program(program); |
| 1878 | 1845 |
| 1879 program->string_table_.ReadFrom(reader); | 1846 program->string_table_.ReadFrom(reader); |
| 1880 program->source_uri_table_.ReadFrom(reader); | 1847 program->source_uri_table_.ReadFrom(reader); |
| 1881 program->source_table_.ReadFrom(reader); | 1848 program->source_table_.ReadFrom(reader); |
| 1882 | 1849 |
| 1850 int canonical_names = reader->ReadUInt(); |
| 1851 reader->helper()->SetCanonicalNameCount(canonical_names); |
| 1852 for (int i = 0; i < canonical_names; ++i) { |
| 1853 int biased_parent_index = reader->ReadUInt(); |
| 1854 CanonicalName* parent; |
| 1855 if (biased_parent_index != 0) { |
| 1856 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); |
| 1857 } else { |
| 1858 parent = program->canonical_name_root(); |
| 1859 } |
| 1860 ASSERT(parent != NULL); |
| 1861 int name_index = reader->ReadUInt(); |
| 1862 String* name = program->string_table().strings()[name_index]; |
| 1863 CanonicalName* canonical_name = parent->AddChild(name); |
| 1864 reader->helper()->SetCanonicalName(i, canonical_name); |
| 1865 } |
| 1866 |
| 1883 int libraries = reader->ReadUInt(); | 1867 int libraries = reader->ReadUInt(); |
| 1884 program->libraries().EnsureInitialized(libraries); | 1868 program->libraries().EnsureInitialized(libraries); |
| 1885 for (int i = 0; i < libraries; i++) { | 1869 for (intptr_t i = 0; i < libraries; i++) { |
| 1886 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | 1870 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
| 1887 } | 1871 } |
| 1888 | 1872 |
| 1889 program->main_method_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1873 program->main_method_reference_ = Reference::ReadMemberFrom(reader); |
| 1874 |
| 1875 #ifdef DEBUG |
| 1876 for (intptr_t i = 0; i < canonical_names; ++i) { |
| 1877 CanonicalName* name = reader->helper()->GetCanonicalName(i); |
| 1878 if (name->is_referenced() && name->definition() == NULL) { |
| 1879 FATAL("Missing definition for canonical name"); |
| 1880 } |
| 1881 } |
| 1882 #endif |
| 1890 | 1883 |
| 1891 return program; | 1884 return program; |
| 1892 } | 1885 } |
| 1893 | 1886 |
| 1894 | 1887 |
| 1895 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { | 1888 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
| 1896 TRACE_READ_OFFSET(); | 1889 TRACE_READ_OFFSET(); |
| 1897 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1890 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 1898 | 1891 |
| 1899 FunctionNode* function = new FunctionNode(); | 1892 FunctionNode* function = new FunctionNode(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1931 | 1924 |
| 1932 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1925 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
| 1933 intptr_t buffer_length) { | 1926 intptr_t buffer_length) { |
| 1934 kernel::Reader reader(buffer, buffer_length); | 1927 kernel::Reader reader(buffer, buffer_length); |
| 1935 return kernel::Program::ReadFrom(&reader); | 1928 return kernel::Program::ReadFrom(&reader); |
| 1936 } | 1929 } |
| 1937 | 1930 |
| 1938 | 1931 |
| 1939 } // namespace dart | 1932 } // namespace dart |
| 1940 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1933 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |