| 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" |
| 11 #include "vm/kernel.h" | 11 #include "vm/kernel.h" |
| 12 #include "vm/os.h" | 12 #include "vm/os.h" |
| 13 | 13 |
| 14 #if defined(DEBUG) | 14 #if defined(DEBUG) |
| 15 #define TRACE_READ_OFFSET() \ | 15 #define TRACE_READ_OFFSET() \ |
| 16 do { \ | 16 do { \ |
| 17 if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ | 17 if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ |
| 18 } while (0) | 18 } while (0) |
| 19 #define TRACE_WRITE_OFFSET() \ | |
| 20 do { \ | |
| 21 if (FLAG_trace_kernel_binary) writer->DumpOffset(DART_PRETTY_FUNCTION); \ | |
| 22 } while (0) | |
| 23 #else | 19 #else |
| 24 #define TRACE_READ_OFFSET() | 20 #define TRACE_READ_OFFSET() |
| 25 #define TRACE_WRITE_OFFSET() | |
| 26 #endif | 21 #endif |
| 27 | 22 |
| 28 namespace dart { | 23 namespace dart { |
| 29 | 24 |
| 30 | 25 |
| 31 ByteWriter::~ByteWriter() {} | |
| 32 | |
| 33 | |
| 34 namespace kernel { | 26 namespace kernel { |
| 35 | 27 |
| 36 | 28 |
| 37 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; | 29 static const uint32_t kMagicProgramFile = 0x90ABCDEFu; |
| 38 | 30 |
| 39 | 31 |
| 40 // Keep in sync with package:dynamo/lib/binary/tag.dart | 32 // Keep in sync with package:dynamo/lib/binary/tag.dart |
| 41 enum Tag { | 33 enum Tag { |
| 42 kNothing = 0, | 34 kNothing = 0, |
| 43 kSomething = 1, | 35 kSomething = 1, |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 ReaderHelper* helper() { return &builder_; } | 430 ReaderHelper* helper() { return &builder_; } |
| 439 | 431 |
| 440 private: | 432 private: |
| 441 const uint8_t* buffer_; | 433 const uint8_t* buffer_; |
| 442 int64_t size_; | 434 int64_t size_; |
| 443 int64_t offset_; | 435 int64_t offset_; |
| 444 ReaderHelper builder_; | 436 ReaderHelper builder_; |
| 445 }; | 437 }; |
| 446 | 438 |
| 447 | 439 |
| 448 class WriterHelper { | |
| 449 public: | |
| 450 WriterHelper() : labels_(NULL) {} | |
| 451 | |
| 452 void SetProgram(Program* program) { | |
| 453 program_ = program; | |
| 454 for (int i = 0; i < program->libraries().length(); i++) { | |
| 455 Library* lib = program->libraries()[i]; | |
| 456 libraries_.Set(lib, i); | |
| 457 | |
| 458 for (int j = 0; j < lib->classes().length(); j++) { | |
| 459 Class* klass = lib->classes()[j]; | |
| 460 classes_.Set(klass, j); | |
| 461 | |
| 462 for (int k = 0; k < klass->fields().length(); k++) { | |
| 463 Field* field = klass->fields()[k]; | |
| 464 fields_.Set(field, k); | |
| 465 } | |
| 466 for (int k = 0; k < klass->constructors().length(); k++) { | |
| 467 Constructor* constructor = klass->constructors()[k]; | |
| 468 constructors_.Set(constructor, k); | |
| 469 } | |
| 470 for (int k = 0; k < klass->procedures().length(); k++) { | |
| 471 Procedure* procedure = klass->procedures()[k]; | |
| 472 procedures_.Set(procedure, k); | |
| 473 } | |
| 474 } | |
| 475 | |
| 476 for (int k = 0; k < lib->fields().length(); k++) { | |
| 477 Field* field = lib->fields()[k]; | |
| 478 fields_.Set(field, k); | |
| 479 } | |
| 480 | |
| 481 for (int k = 0; k < lib->procedures().length(); k++) { | |
| 482 Procedure* procedure = lib->procedures()[k]; | |
| 483 procedures_.Set(procedure, k); | |
| 484 } | |
| 485 } | |
| 486 } | |
| 487 | |
| 488 Program* program() { return program_; } | |
| 489 | |
| 490 BlockMap<String>& strings() { return strings_; } | |
| 491 BlockMap<Library>& libraries() { return libraries_; } | |
| 492 BlockMap<Class>& classes() { return classes_; } | |
| 493 BlockMap<Field>& fields() { return fields_; } | |
| 494 BlockMap<Procedure>& procedures() { return procedures_; } | |
| 495 BlockMap<Constructor>& constructors() { return constructors_; } | |
| 496 | |
| 497 BlockMap<VariableDeclaration>& variables() { return scope_; } | |
| 498 BlockMap<TypeParameter>& type_parameters() { return type_parameters_; } | |
| 499 BlockMap<SwitchCase>& switch_cases() { return switch_cases_; } | |
| 500 | |
| 501 BlockMap<LabeledStatement>* labels() { return labels_; } | |
| 502 void set_labels(BlockMap<LabeledStatement>* labels) { labels_ = labels; } | |
| 503 | |
| 504 private: | |
| 505 Program* program_; | |
| 506 | |
| 507 BlockMap<String> strings_; | |
| 508 BlockMap<Library> libraries_; | |
| 509 BlockMap<Class> classes_; | |
| 510 BlockMap<Field> fields_; | |
| 511 BlockMap<Procedure> procedures_; | |
| 512 BlockMap<Constructor> constructors_; | |
| 513 | |
| 514 BlockMap<VariableDeclaration> scope_; | |
| 515 BlockMap<TypeParameter> type_parameters_; | |
| 516 BlockMap<SwitchCase> switch_cases_; | |
| 517 BlockMap<LabeledStatement>* labels_; | |
| 518 }; | |
| 519 | |
| 520 | |
| 521 class Writer { | |
| 522 public: | |
| 523 explicit Writer(ByteWriter* writer) : out_(writer), offset_(0) {} | |
| 524 | |
| 525 void WriteUInt32(uint32_t value) { | |
| 526 uint8_t buffer[4] = { | |
| 527 static_cast<uint8_t>((value >> 24) & 0xff), | |
| 528 static_cast<uint8_t>((value >> 16) & 0xff), | |
| 529 static_cast<uint8_t>((value >> 8) & 0xff), | |
| 530 static_cast<uint8_t>((value >> 0) & 0xff), | |
| 531 }; | |
| 532 WriteBytes(buffer, 4); | |
| 533 } | |
| 534 | |
| 535 void WriteUInt(uint32_t value) { | |
| 536 if (value < 0x80) { | |
| 537 // 0... | |
| 538 WriteByte(static_cast<uint8_t>(value)); | |
| 539 } else if (value < 0x4000) { | |
| 540 // 10... | |
| 541 WriteByte(static_cast<uint8_t>(((value >> 8) & 0x3f) | 0x80)); | |
| 542 WriteByte(static_cast<uint8_t>(value & 0xff)); | |
| 543 } else { | |
| 544 // 11... | |
| 545 // Ensure the highest 2 bits is not used for anything (we use it to for | |
| 546 // encoding). | |
| 547 ASSERT(static_cast<uint8_t>((value >> 24) & 0xc0) == 0); | |
| 548 uint8_t buffer[4] = { | |
| 549 static_cast<uint8_t>(((value >> 24) & 0x7f) | 0xc0), | |
| 550 static_cast<uint8_t>((value >> 16) & 0xff), | |
| 551 static_cast<uint8_t>((value >> 8) & 0xff), | |
| 552 static_cast<uint8_t>((value >> 0) & 0xff), | |
| 553 }; | |
| 554 WriteBytes(buffer, 4); | |
| 555 } | |
| 556 } | |
| 557 | |
| 558 void WriteListLength(intptr_t value) { return WriteUInt(value); } | |
| 559 | |
| 560 void WriteByte(uint8_t value) { | |
| 561 out_->WriteByte(value); | |
| 562 offset_++; | |
| 563 } | |
| 564 | |
| 565 void WriteBool(bool value) { WriteByte(value ? 1 : 0); } | |
| 566 | |
| 567 void WriteFlags(uint8_t value) { WriteByte(value); } | |
| 568 | |
| 569 void WriteTag(Tag tag) { WriteByte(static_cast<uint8_t>(tag)); } | |
| 570 | |
| 571 void WriteTag(Tag tag, uint8_t payload) { | |
| 572 ASSERT((payload & ~kSpecializedPayloadMask) == 0); | |
| 573 WriteByte(kSpecializedTagHighBit | static_cast<uint8_t>(tag) | payload); | |
| 574 } | |
| 575 | |
| 576 void WriteBytes(uint8_t* bytes, int length) { | |
| 577 out_->WriteBytes(bytes, length); | |
| 578 offset_ += length; | |
| 579 } | |
| 580 | |
| 581 void WritePosition(TokenPosition position) { | |
| 582 intptr_t value = position.value() + 1; | |
| 583 WriteUInt(value); | |
| 584 } | |
| 585 | |
| 586 template <typename T> | |
| 587 void WriteOptional(T* object) { | |
| 588 if (object == NULL) { | |
| 589 WriteTag(kNothing); | |
| 590 } else { | |
| 591 WriteTag(kSomething); | |
| 592 object->WriteTo(this); | |
| 593 } | |
| 594 } | |
| 595 | |
| 596 template <typename T, typename WT> | |
| 597 void WriteOptionalStatic(T* object) { | |
| 598 if (object == NULL) { | |
| 599 WriteTag(kNothing); | |
| 600 } else { | |
| 601 WriteTag(kSomething); | |
| 602 WT::WriteTo(this, object); | |
| 603 } | |
| 604 } | |
| 605 | |
| 606 template <typename T> | |
| 607 void WriteOptionalStatic(T* object) { | |
| 608 return WriteOptionalStatic<T, T>(object); | |
| 609 } | |
| 610 | |
| 611 void DumpOffset(const char* str) { | |
| 612 OS::PrintErr("@%" Pd64 " %s\n", offset_, str); | |
| 613 } | |
| 614 | |
| 615 WriterHelper* helper() { return &helper_; } | |
| 616 | |
| 617 private: | |
| 618 ByteWriter* out_; | |
| 619 WriterHelper helper_; | |
| 620 int64_t offset_; | |
| 621 }; | |
| 622 | |
| 623 | |
| 624 template <typename T> | 440 template <typename T> |
| 625 template <typename IT> | 441 template <typename IT> |
| 626 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { | 442 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { |
| 627 TRACE_READ_OFFSET(); | 443 TRACE_READ_OFFSET(); |
| 628 ASSERT(parent != NULL); | 444 ASSERT(parent != NULL); |
| 629 int length = reader->ReadListLength(); | 445 int length = reader->ReadListLength(); |
| 630 EnsureInitialized(length); | 446 EnsureInitialized(length); |
| 631 | 447 |
| 632 for (int i = 0; i < length_; i++) { | 448 for (int i = 0; i < length_; i++) { |
| 633 IT* object = GetOrCreate<IT>(i, parent); | 449 IT* object = GetOrCreate<IT>(i, parent); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 655 TRACE_READ_OFFSET(); | 471 TRACE_READ_OFFSET(); |
| 656 int length = reader->ReadListLength(); | 472 int length = reader->ReadListLength(); |
| 657 EnsureInitialized(length); | 473 EnsureInitialized(length); |
| 658 | 474 |
| 659 for (int i = 0; i < length_; i++) { | 475 for (int i = 0; i < length_; i++) { |
| 660 ASSERT(array_[i] == NULL); | 476 ASSERT(array_[i] == NULL); |
| 661 array_[i] = IT::ReadFrom(reader); | 477 array_[i] = IT::ReadFrom(reader); |
| 662 } | 478 } |
| 663 } | 479 } |
| 664 | 480 |
| 665 | |
| 666 template <typename T> | |
| 667 void List<T>::WriteTo(Writer* writer) { | |
| 668 TRACE_WRITE_OFFSET(); | |
| 669 | |
| 670 // NOTE: We only support dense lists. | |
| 671 writer->WriteListLength(length_); | |
| 672 for (int i = 0; i < length_; i++) { | |
| 673 T* object = array_[i]; | |
| 674 ASSERT(object != NULL); | |
| 675 object->WriteTo(writer); | |
| 676 } | |
| 677 } | |
| 678 | |
| 679 | |
| 680 template <typename T> | |
| 681 template <typename IT> | |
| 682 void List<T>::WriteToStatic(Writer* writer) { | |
| 683 TRACE_WRITE_OFFSET(); | |
| 684 | |
| 685 // NOTE: We only support dense lists. | |
| 686 writer->WriteListLength(length_); | |
| 687 for (int i = 0; i < length_; i++) { | |
| 688 T* object = array_[i]; | |
| 689 ASSERT(object != NULL); | |
| 690 IT::WriteTo(writer, object); | |
| 691 } | |
| 692 } | |
| 693 | |
| 694 | |
| 695 void TypeParameterList::ReadFrom(Reader* reader) { | 481 void TypeParameterList::ReadFrom(Reader* reader) { |
| 696 // It is possible for the bound of the first type parameter to refer to | 482 // It is possible for the bound of the first type parameter to refer to |
| 697 // the second type parameter. This means we need to create [TypeParameter] | 483 // the second type parameter. This means we need to create [TypeParameter] |
| 698 // objects before reading the bounds. | 484 // objects before reading the bounds. |
| 699 int length = reader->ReadListLength(); | 485 int length = reader->ReadListLength(); |
| 700 EnsureInitialized(length); | 486 EnsureInitialized(length); |
| 701 | 487 |
| 702 // Make all [TypeParameter]s available in scope. | 488 // Make all [TypeParameter]s available in scope. |
| 703 for (int i = 0; i < length; i++) { | 489 for (int i = 0; i < length; i++) { |
| 704 TypeParameter* parameter = (*this)[i] = new TypeParameter(); | 490 TypeParameter* parameter = (*this)[i] = new TypeParameter(); |
| 705 reader->helper()->type_parameters().Push(parameter); | 491 reader->helper()->type_parameters().Push(parameter); |
| 706 } | 492 } |
| 707 | 493 |
| 708 // Read all [TypeParameter]s and their bounds. | 494 // Read all [TypeParameter]s and their bounds. |
| 709 for (int i = 0; i < length; i++) { | 495 for (int i = 0; i < length; i++) { |
| 710 (*this)[i]->ReadFrom(reader); | 496 (*this)[i]->ReadFrom(reader); |
| 711 } | 497 } |
| 712 } | 498 } |
| 713 | 499 |
| 714 | 500 |
| 715 void TypeParameterList::WriteTo(Writer* writer) { | |
| 716 writer->WriteListLength(length()); | |
| 717 | |
| 718 // Make all [TypeParameter]s available in scope. | |
| 719 for (int i = 0; i < length(); i++) { | |
| 720 TypeParameter* parameter = (*this)[i]; | |
| 721 writer->helper()->type_parameters().Push(parameter); | |
| 722 } | |
| 723 | |
| 724 // Write all [TypeParameter]s and their bounds. | |
| 725 for (int i = 0; i < length(); i++) { | |
| 726 TypeParameter* parameter = (*this)[i]; | |
| 727 parameter->WriteTo(writer); | |
| 728 } | |
| 729 } | |
| 730 | |
| 731 | |
| 732 template <typename A, typename B> | 501 template <typename A, typename B> |
| 733 Tuple<A, B>* Tuple<A, B>::ReadFrom(Reader* reader) { | 502 Tuple<A, B>* Tuple<A, B>::ReadFrom(Reader* reader) { |
| 734 TRACE_READ_OFFSET(); | 503 TRACE_READ_OFFSET(); |
| 735 A* first = A::ReadFrom(reader); | 504 A* first = A::ReadFrom(reader); |
| 736 B* second = B::ReadFrom(reader); | 505 B* second = B::ReadFrom(reader); |
| 737 return new Tuple<A, B>(first, second); | 506 return new Tuple<A, B>(first, second); |
| 738 } | 507 } |
| 739 | 508 |
| 740 | 509 |
| 741 template <typename A, typename B> | |
| 742 void Tuple<A, B>::WriteTo(Writer* writer) { | |
| 743 TRACE_WRITE_OFFSET(); | |
| 744 first_->WriteTo(writer); | |
| 745 second_->WriteTo(writer); | |
| 746 } | |
| 747 | |
| 748 | |
| 749 template <typename B, typename S> | 510 template <typename B, typename S> |
| 750 class DowncastReader { | 511 class DowncastReader { |
| 751 public: | 512 public: |
| 752 static S* ReadFrom(Reader* reader) { | 513 static S* ReadFrom(Reader* reader) { |
| 753 TRACE_READ_OFFSET(); | 514 TRACE_READ_OFFSET(); |
| 754 return S::Cast(B::ReadFrom(reader)); | 515 return S::Cast(B::ReadFrom(reader)); |
| 755 } | 516 } |
| 756 }; | 517 }; |
| 757 | 518 |
| 758 | 519 |
| 759 class StringImpl { | 520 class StringImpl { |
| 760 public: | 521 public: |
| 761 static String* ReadFrom(Reader* reader) { | 522 static String* ReadFrom(Reader* reader) { |
| 762 TRACE_READ_OFFSET(); | 523 TRACE_READ_OFFSET(); |
| 763 return String::ReadFromImpl(reader); | 524 return String::ReadFromImpl(reader); |
| 764 } | 525 } |
| 765 | |
| 766 static void WriteTo(Writer* writer, String* string) { | |
| 767 TRACE_WRITE_OFFSET(); | |
| 768 string->WriteToImpl(writer); | |
| 769 } | |
| 770 }; | 526 }; |
| 771 | 527 |
| 772 | 528 |
| 773 class VariableDeclarationImpl { | 529 class VariableDeclarationImpl { |
| 774 public: | 530 public: |
| 775 static VariableDeclaration* ReadFrom(Reader* reader) { | 531 static VariableDeclaration* ReadFrom(Reader* reader) { |
| 776 TRACE_READ_OFFSET(); | 532 TRACE_READ_OFFSET(); |
| 777 return VariableDeclaration::ReadFromImpl(reader); | 533 return VariableDeclaration::ReadFromImpl(reader); |
| 778 } | 534 } |
| 779 | |
| 780 static void WriteTo(Writer* writer, VariableDeclaration* d) { | |
| 781 TRACE_WRITE_OFFSET(); | |
| 782 d->WriteToImpl(writer); | |
| 783 } | |
| 784 }; | 535 }; |
| 785 | 536 |
| 786 | 537 |
| 787 String* String::ReadFrom(Reader* reader) { | 538 String* String::ReadFrom(Reader* reader) { |
| 788 TRACE_READ_OFFSET(); | 539 TRACE_READ_OFFSET(); |
| 789 return Reference::ReadStringFrom(reader); | 540 return Reference::ReadStringFrom(reader); |
| 790 } | 541 } |
| 791 | 542 |
| 792 | 543 |
| 793 String* String::ReadFromImpl(Reader* reader) { | 544 String* String::ReadFromImpl(Reader* reader) { |
| 794 TRACE_READ_OFFSET(); | 545 TRACE_READ_OFFSET(); |
| 795 uint32_t bytes = reader->ReadUInt(); | 546 uint32_t bytes = reader->ReadUInt(); |
| 796 String* string = new String(reader->Consume(bytes), bytes); | 547 String* string = new String(reader->Consume(bytes), bytes); |
| 797 return string; | 548 return string; |
| 798 } | 549 } |
| 799 | 550 |
| 800 | |
| 801 void String::WriteTo(Writer* writer) { | |
| 802 TRACE_WRITE_OFFSET(); | |
| 803 Reference::WriteStringTo(writer, this); | |
| 804 } | |
| 805 | |
| 806 | |
| 807 void String::WriteToImpl(Writer* writer) { | |
| 808 TRACE_WRITE_OFFSET(); | |
| 809 writer->WriteUInt(size_); | |
| 810 writer->WriteBytes(buffer_, size_); | |
| 811 } | |
| 812 | |
| 813 | |
| 814 void StringTable::ReadFrom(Reader* reader) { | 551 void StringTable::ReadFrom(Reader* reader) { |
| 815 strings_.ReadFromStatic<StringImpl>(reader); | 552 strings_.ReadFromStatic<StringImpl>(reader); |
| 816 } | 553 } |
| 817 | 554 |
| 818 | 555 |
| 819 void StringTable::WriteTo(Writer* writer) { | |
| 820 strings_.WriteToStatic<StringImpl>(writer); | |
| 821 | |
| 822 // Build up the "String* -> index" table. | |
| 823 WriterHelper* helper = writer->helper(); | |
| 824 for (int i = 0; i < strings_.length(); i++) { | |
| 825 helper->strings().Push(strings_[i]); | |
| 826 } | |
| 827 } | |
| 828 | |
| 829 | |
| 830 void SourceTable::ReadFrom(Reader* reader) { | 556 void SourceTable::ReadFrom(Reader* reader) { |
| 831 size_ = reader->helper()->program()->source_uri_table().strings().length(); | 557 size_ = reader->helper()->program()->source_uri_table().strings().length(); |
| 832 source_code_ = new String*[size_]; | 558 source_code_ = new String*[size_]; |
| 833 line_starts_ = new intptr_t*[size_]; | 559 line_starts_ = new intptr_t*[size_]; |
| 834 line_count_ = new intptr_t[size_]; | 560 line_count_ = new intptr_t[size_]; |
| 835 for (intptr_t i = 0; i < size_; ++i) { | 561 for (intptr_t i = 0; i < size_; ++i) { |
| 836 source_code_[i] = StringImpl::ReadFrom(reader); | 562 source_code_[i] = StringImpl::ReadFrom(reader); |
| 837 intptr_t line_count = reader->ReadUInt(); | 563 intptr_t line_count = reader->ReadUInt(); |
| 838 intptr_t* line_starts = new intptr_t[line_count]; | 564 intptr_t* line_starts = new intptr_t[line_count]; |
| 839 line_count_[i] = line_count; | 565 line_count_[i] = line_count; |
| 840 intptr_t previous_line_start = 0; | 566 intptr_t previous_line_start = 0; |
| 841 for (intptr_t j = 0; j < line_count; ++j) { | 567 for (intptr_t j = 0; j < line_count; ++j) { |
| 842 intptr_t line_start = reader->ReadUInt() + previous_line_start; | 568 intptr_t line_start = reader->ReadUInt() + previous_line_start; |
| 843 line_starts[j] = line_start; | 569 line_starts[j] = line_start; |
| 844 previous_line_start = line_start; | 570 previous_line_start = line_start; |
| 845 } | 571 } |
| 846 line_starts_[i] = line_starts; | 572 line_starts_[i] = line_starts; |
| 847 } | 573 } |
| 848 } | 574 } |
| 849 | 575 |
| 850 | 576 |
| 851 void SourceTable::WriteTo(Writer* writer) { | |
| 852 for (intptr_t i = 0; i < size_; ++i) { | |
| 853 StringImpl::WriteTo(writer, source_code_[i]); | |
| 854 intptr_t* line_starts = line_starts_[i]; | |
| 855 intptr_t line_count = line_count_[i]; | |
| 856 writer->WriteUInt(line_count); | |
| 857 | |
| 858 intptr_t previous_line_start = 0; | |
| 859 for (intptr_t j = 0; j < line_count; ++j) { | |
| 860 intptr_t line_start = line_starts[j]; | |
| 861 writer->WriteUInt(line_start - previous_line_start); | |
| 862 previous_line_start = line_start; | |
| 863 } | |
| 864 } | |
| 865 } | |
| 866 | |
| 867 | |
| 868 Library* Library::ReadFrom(Reader* reader) { | 577 Library* Library::ReadFrom(Reader* reader) { |
| 869 TRACE_READ_OFFSET(); | 578 TRACE_READ_OFFSET(); |
| 870 int flags = reader->ReadFlags(); | 579 int flags = reader->ReadFlags(); |
| 871 ASSERT(flags == 0); // external libraries not supported | 580 ASSERT(flags == 0); // external libraries not supported |
| 872 name_ = Reference::ReadStringFrom(reader); | 581 name_ = Reference::ReadStringFrom(reader); |
| 873 import_uri_ = Reference::ReadStringFrom(reader); | 582 import_uri_ = Reference::ReadStringFrom(reader); |
| 874 source_uri_index_ = reader->ReadUInt(); | 583 source_uri_index_ = reader->ReadUInt(); |
| 875 | 584 |
| 876 int num_classes = reader->ReadUInt(); | 585 int num_classes = reader->ReadUInt(); |
| 877 classes().EnsureInitialized(num_classes); | 586 classes().EnsureInitialized(num_classes); |
| 878 for (int i = 0; i < num_classes; i++) { | 587 for (int i = 0; i < num_classes; i++) { |
| 879 Tag tag = reader->ReadTag(); | 588 Tag tag = reader->ReadTag(); |
| 880 if (tag == kNormalClass) { | 589 if (tag == kNormalClass) { |
| 881 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); | 590 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); |
| 882 klass->ReadFrom(reader); | 591 klass->ReadFrom(reader); |
| 883 } else { | 592 } else { |
| 884 ASSERT(tag == kMixinClass); | 593 ASSERT(tag == kMixinClass); |
| 885 MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this); | 594 MixinClass* klass = classes().GetOrCreate<MixinClass>(i, this); |
| 886 klass->ReadFrom(reader); | 595 klass->ReadFrom(reader); |
| 887 } | 596 } |
| 888 } | 597 } |
| 889 | 598 |
| 890 fields().ReadFrom<Field>(reader, this); | 599 fields().ReadFrom<Field>(reader, this); |
| 891 procedures().ReadFrom<Procedure>(reader, this); | 600 procedures().ReadFrom<Procedure>(reader, this); |
| 892 return this; | 601 return this; |
| 893 } | 602 } |
| 894 | 603 |
| 895 | 604 |
| 896 void Library::WriteTo(Writer* writer) { | |
| 897 TRACE_WRITE_OFFSET(); | |
| 898 name_->WriteTo(writer); | |
| 899 import_uri_->WriteTo(writer); | |
| 900 writer->WriteUInt(source_uri_index_); | |
| 901 | |
| 902 writer->WriteUInt(classes_.length()); | |
| 903 for (int i = 0; i < classes_.length(); i++) { | |
| 904 Class* klass = classes_[i]; | |
| 905 if (klass->IsNormalClass()) { | |
| 906 writer->WriteTag(kNormalClass); | |
| 907 NormalClass::Cast(klass)->WriteTo(writer); | |
| 908 } else { | |
| 909 writer->WriteTag(kMixinClass); | |
| 910 MixinClass::Cast(klass)->WriteTo(writer); | |
| 911 } | |
| 912 } | |
| 913 fields().WriteTo(writer); | |
| 914 procedures().WriteTo(writer); | |
| 915 } | |
| 916 | |
| 917 | |
| 918 Class* Class::ReadFrom(Reader* reader) { | 605 Class* Class::ReadFrom(Reader* reader) { |
| 919 TRACE_READ_OFFSET(); | 606 TRACE_READ_OFFSET(); |
| 920 | 607 |
| 921 position_ = reader->ReadPosition(); | 608 position_ = reader->ReadPosition(); |
| 922 is_abstract_ = reader->ReadBool(); | 609 is_abstract_ = reader->ReadBool(); |
| 923 name_ = Reference::ReadStringFrom(reader); | 610 name_ = Reference::ReadStringFrom(reader); |
| 924 source_uri_index_ = reader->ReadUInt(); | 611 source_uri_index_ = reader->ReadUInt(); |
| 925 annotations_.ReadFromStatic<Expression>(reader); | 612 annotations_.ReadFromStatic<Expression>(reader); |
| 926 | 613 |
| 927 return this; | 614 return this; |
| 928 } | 615 } |
| 929 | 616 |
| 930 | 617 |
| 931 void Class::WriteTo(Writer* writer) { | |
| 932 TRACE_WRITE_OFFSET(); | |
| 933 writer->WritePosition(position_); | |
| 934 writer->WriteBool(is_abstract_); | |
| 935 name_->WriteTo(writer); | |
| 936 writer->WriteUInt(source_uri_index_); | |
| 937 annotations_.WriteTo(writer); | |
| 938 } | |
| 939 | |
| 940 | |
| 941 NormalClass* NormalClass::ReadFrom(Reader* reader) { | 618 NormalClass* NormalClass::ReadFrom(Reader* reader) { |
| 942 TRACE_READ_OFFSET(); | 619 TRACE_READ_OFFSET(); |
| 943 Class::ReadFrom(reader); | 620 Class::ReadFrom(reader); |
| 944 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 621 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 945 | 622 |
| 946 type_parameters_.ReadFrom(reader); | 623 type_parameters_.ReadFrom(reader); |
| 947 DartType* type = reader->ReadOptional<DartType>(); | 624 DartType* type = reader->ReadOptional<DartType>(); |
| 948 | 625 |
| 949 super_class_ = InterfaceType::Cast(type); | 626 super_class_ = InterfaceType::Cast(type); |
| 950 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 627 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
| 951 reader); | 628 reader); |
| 952 fields_.ReadFrom<Field>(reader, this); | 629 fields_.ReadFrom<Field>(reader, this); |
| 953 constructors_.ReadFrom<Constructor>(reader, this); | 630 constructors_.ReadFrom<Constructor>(reader, this); |
| 954 procedures_.ReadFrom<Procedure>(reader, this); | 631 procedures_.ReadFrom<Procedure>(reader, this); |
| 955 | 632 |
| 956 return this; | 633 return this; |
| 957 } | 634 } |
| 958 | 635 |
| 959 | 636 |
| 960 void NormalClass::WriteTo(Writer* writer) { | |
| 961 TRACE_WRITE_OFFSET(); | |
| 962 Class::WriteTo(writer); | |
| 963 TypeParameterScope<WriterHelper> scope(writer->helper()); | |
| 964 | |
| 965 type_parameters().WriteTo(writer); | |
| 966 writer->WriteOptional<DartType>(super_class_); | |
| 967 implemented_classes().WriteTo(writer); | |
| 968 fields_.WriteTo(writer); | |
| 969 constructors_.WriteTo(writer); | |
| 970 procedures_.WriteTo(writer); | |
| 971 } | |
| 972 | |
| 973 | |
| 974 MixinClass* MixinClass::ReadFrom(Reader* reader) { | 637 MixinClass* MixinClass::ReadFrom(Reader* reader) { |
| 975 TRACE_READ_OFFSET(); | 638 TRACE_READ_OFFSET(); |
| 976 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 639 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 977 | 640 |
| 978 Class::ReadFrom(reader); | 641 Class::ReadFrom(reader); |
| 979 type_parameters_.ReadFrom(reader); | 642 type_parameters_.ReadFrom(reader); |
| 980 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 643 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 981 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 644 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 982 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 645 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
| 983 reader); | 646 reader); |
| 984 constructors_.ReadFrom<Constructor>(reader, this); | 647 constructors_.ReadFrom<Constructor>(reader, this); |
| 985 return this; | 648 return this; |
| 986 } | 649 } |
| 987 | 650 |
| 988 | 651 |
| 989 void MixinClass::WriteTo(Writer* writer) { | |
| 990 TRACE_WRITE_OFFSET(); | |
| 991 TypeParameterScope<WriterHelper> scope(writer->helper()); | |
| 992 | |
| 993 Class::WriteTo(writer); | |
| 994 type_parameters_.WriteTo(writer); | |
| 995 first_->WriteTo(writer); | |
| 996 second_->WriteTo(writer); | |
| 997 implemented_classes_.WriteTo(writer); | |
| 998 constructors_.WriteTo(writer); | |
| 999 } | |
| 1000 | |
| 1001 | |
| 1002 Member* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { | 652 Member* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
| 1003 TRACE_READ_OFFSET(); | 653 TRACE_READ_OFFSET(); |
| 1004 | 654 |
| 1005 Program* program = reader->helper()->program(); | 655 Program* program = reader->helper()->program(); |
| 1006 Tag tag = reader->ReadTag(); | 656 Tag tag = reader->ReadTag(); |
| 1007 switch (tag) { | 657 switch (tag) { |
| 1008 case kLibraryFieldReference: { | 658 case kLibraryFieldReference: { |
| 1009 int library_idx = reader->ReadUInt(); | 659 int library_idx = reader->ReadUInt(); |
| 1010 int field_idx = reader->ReadUInt(); | 660 int field_idx = reader->ReadUInt(); |
| 1011 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | 661 Library* library = program->libraries().GetOrCreate<Library>(library_idx); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 default: | 694 default: |
| 1045 UNREACHABLE(); | 695 UNREACHABLE(); |
| 1046 break; | 696 break; |
| 1047 } | 697 } |
| 1048 | 698 |
| 1049 UNREACHABLE(); | 699 UNREACHABLE(); |
| 1050 return NULL; | 700 return NULL; |
| 1051 } | 701 } |
| 1052 | 702 |
| 1053 | 703 |
| 1054 void Reference::WriteMemberTo(Writer* writer, Member* member, bool allow_null) { | |
| 1055 TRACE_WRITE_OFFSET(); | |
| 1056 if (member == NULL) { | |
| 1057 if (allow_null) { | |
| 1058 writer->WriteTag(kNullReference); | |
| 1059 return; | |
| 1060 } else { | |
| 1061 FATAL("Expected a valid member reference but got `null`"); | |
| 1062 } | |
| 1063 } | |
| 1064 TreeNode* node = member->parent(); | |
| 1065 | |
| 1066 WriterHelper* helper = writer->helper(); | |
| 1067 | |
| 1068 if (node->IsLibrary()) { | |
| 1069 Library* library = Library::Cast(node); | |
| 1070 if (member->IsField()) { | |
| 1071 Field* field = Field::Cast(member); | |
| 1072 writer->WriteTag(kLibraryFieldReference); | |
| 1073 writer->WriteUInt(helper->libraries().Lookup(library)); | |
| 1074 writer->WriteUInt(helper->fields().Lookup(field)); | |
| 1075 } else { | |
| 1076 Procedure* procedure = Procedure::Cast(member); | |
| 1077 writer->WriteTag(kLibraryProcedureReference); | |
| 1078 writer->WriteUInt(helper->libraries().Lookup(library)); | |
| 1079 writer->WriteUInt(helper->procedures().Lookup(procedure)); | |
| 1080 } | |
| 1081 } else { | |
| 1082 Class* klass = Class::Cast(node); | |
| 1083 | |
| 1084 if (member->IsField()) { | |
| 1085 Field* field = Field::Cast(member); | |
| 1086 writer->WriteTag(kClassFieldReference); | |
| 1087 Reference::WriteClassTo(writer, klass); | |
| 1088 writer->WriteUInt(helper->fields().Lookup(field)); | |
| 1089 } else if (member->IsConstructor()) { | |
| 1090 Constructor* constructor = Constructor::Cast(member); | |
| 1091 writer->WriteTag(kClassConstructorReference); | |
| 1092 Reference::WriteClassTo(writer, klass); | |
| 1093 writer->WriteUInt(helper->constructors().Lookup(constructor)); | |
| 1094 } else { | |
| 1095 Procedure* procedure = Procedure::Cast(member); | |
| 1096 writer->WriteTag(kClassProcedureReference); | |
| 1097 Reference::WriteClassTo(writer, klass); | |
| 1098 writer->WriteUInt(helper->procedures().Lookup(procedure)); | |
| 1099 } | |
| 1100 } | |
| 1101 } | |
| 1102 | |
| 1103 | |
| 1104 Class* Reference::ReadClassFrom(Reader* reader, bool allow_null) { | 704 Class* Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
| 1105 TRACE_READ_OFFSET(); | 705 TRACE_READ_OFFSET(); |
| 1106 Program* program = reader->helper()->program(); | 706 Program* program = reader->helper()->program(); |
| 1107 | 707 |
| 1108 Tag klass_member_tag = reader->ReadTag(); | 708 Tag klass_member_tag = reader->ReadTag(); |
| 1109 if (klass_member_tag == kNullReference) { | 709 if (klass_member_tag == kNullReference) { |
| 1110 if (allow_null) { | 710 if (allow_null) { |
| 1111 return NULL; | 711 return NULL; |
| 1112 } else { | 712 } else { |
| 1113 FATAL("Expected a valid class reference but got `null`."); | 713 FATAL("Expected a valid class reference but got `null`."); |
| 1114 } | 714 } |
| 1115 } | 715 } |
| 1116 int library_idx = reader->ReadUInt(); | 716 int library_idx = reader->ReadUInt(); |
| 1117 int class_idx = reader->ReadUInt(); | 717 int class_idx = reader->ReadUInt(); |
| 1118 | 718 |
| 1119 Library* library = program->libraries().GetOrCreate<Library>(library_idx); | 719 Library* library = program->libraries().GetOrCreate<Library>(library_idx); |
| 1120 Class* klass; | 720 Class* klass; |
| 1121 if (klass_member_tag == kNormalClassReference) { | 721 if (klass_member_tag == kNormalClassReference) { |
| 1122 klass = library->classes().GetOrCreate<NormalClass>(class_idx, library); | 722 klass = library->classes().GetOrCreate<NormalClass>(class_idx, library); |
| 1123 } else { | 723 } else { |
| 1124 ASSERT(klass_member_tag == kMixinClassReference); | 724 ASSERT(klass_member_tag == kMixinClassReference); |
| 1125 klass = library->classes().GetOrCreate<MixinClass>(class_idx, library); | 725 klass = library->classes().GetOrCreate<MixinClass>(class_idx, library); |
| 1126 } | 726 } |
| 1127 return klass; | 727 return klass; |
| 1128 } | 728 } |
| 1129 | 729 |
| 1130 | 730 |
| 1131 void Reference::WriteClassTo(Writer* writer, Class* klass, bool allow_null) { | |
| 1132 TRACE_WRITE_OFFSET(); | |
| 1133 if (klass == NULL) { | |
| 1134 if (allow_null) { | |
| 1135 writer->WriteTag(kNullReference); | |
| 1136 return; | |
| 1137 } else { | |
| 1138 FATAL("Expected a valid class reference but got `null`."); | |
| 1139 } | |
| 1140 } | |
| 1141 if (klass->IsNormalClass()) { | |
| 1142 writer->WriteTag(kNormalClassReference); | |
| 1143 } else { | |
| 1144 ASSERT(klass->IsMixinClass()); | |
| 1145 writer->WriteTag(kMixinClassReference); | |
| 1146 } | |
| 1147 | |
| 1148 writer->WriteUInt(writer->helper()->libraries().Lookup(klass->parent())); | |
| 1149 writer->WriteUInt(writer->helper()->classes().Lookup(klass)); | |
| 1150 } | |
| 1151 | |
| 1152 | |
| 1153 String* Reference::ReadStringFrom(Reader* reader) { | 731 String* Reference::ReadStringFrom(Reader* reader) { |
| 1154 int index = reader->ReadUInt(); | 732 int index = reader->ReadUInt(); |
| 1155 return reader->helper()->program()->string_table().strings()[index]; | 733 return reader->helper()->program()->string_table().strings()[index]; |
| 1156 } | 734 } |
| 1157 | 735 |
| 1158 | 736 |
| 1159 void Reference::WriteStringTo(Writer* writer, String* string) { | |
| 1160 int index = writer->helper()->strings().Lookup(string); | |
| 1161 writer->WriteUInt(index); | |
| 1162 } | |
| 1163 | |
| 1164 | |
| 1165 Field* Field::ReadFrom(Reader* reader) { | 737 Field* Field::ReadFrom(Reader* reader) { |
| 1166 TRACE_READ_OFFSET(); | 738 TRACE_READ_OFFSET(); |
| 1167 Tag tag = reader->ReadTag(); | 739 Tag tag = reader->ReadTag(); |
| 1168 ASSERT(tag == kField); | 740 ASSERT(tag == kField); |
| 1169 | 741 |
| 1170 position_ = reader->ReadPosition(); | 742 position_ = reader->ReadPosition(); |
| 1171 end_position_ = reader->ReadPosition(); | 743 end_position_ = reader->ReadPosition(); |
| 1172 flags_ = reader->ReadFlags(); | 744 flags_ = reader->ReadFlags(); |
| 1173 name_ = Name::ReadFrom(reader); | 745 name_ = Name::ReadFrom(reader); |
| 1174 source_uri_index_ = reader->ReadUInt(); | 746 source_uri_index_ = reader->ReadUInt(); |
| 1175 annotations_.ReadFromStatic<Expression>(reader); | 747 annotations_.ReadFromStatic<Expression>(reader); |
| 1176 type_ = DartType::ReadFrom(reader); | 748 type_ = DartType::ReadFrom(reader); |
| 1177 inferred_value_ = reader->ReadOptional<InferredValue>(); | 749 inferred_value_ = reader->ReadOptional<InferredValue>(); |
| 1178 initializer_ = reader->ReadOptional<Expression>(); | 750 initializer_ = reader->ReadOptional<Expression>(); |
| 1179 return this; | 751 return this; |
| 1180 } | 752 } |
| 1181 | 753 |
| 1182 | 754 |
| 1183 void Field::WriteTo(Writer* writer) { | |
| 1184 TRACE_WRITE_OFFSET(); | |
| 1185 writer->WriteTag(kField); | |
| 1186 writer->WritePosition(position_); | |
| 1187 writer->WritePosition(end_position_); | |
| 1188 writer->WriteFlags(flags_); | |
| 1189 name_->WriteTo(writer); | |
| 1190 writer->WriteUInt(source_uri_index_); | |
| 1191 annotations_.WriteTo(writer); | |
| 1192 type_->WriteTo(writer); | |
| 1193 writer->WriteOptional<InferredValue>(inferred_value_); | |
| 1194 writer->WriteOptional<Expression>(initializer_); | |
| 1195 } | |
| 1196 | |
| 1197 | |
| 1198 Constructor* Constructor::ReadFrom(Reader* reader) { | 755 Constructor* Constructor::ReadFrom(Reader* reader) { |
| 1199 TRACE_READ_OFFSET(); | 756 TRACE_READ_OFFSET(); |
| 1200 Tag tag = reader->ReadTag(); | 757 Tag tag = reader->ReadTag(); |
| 1201 ASSERT(tag == kConstructor); | 758 ASSERT(tag == kConstructor); |
| 1202 | 759 |
| 1203 VariableScope<ReaderHelper> parameters(reader->helper()); | 760 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 1204 position_ = reader->ReadPosition(); | 761 position_ = reader->ReadPosition(); |
| 1205 end_position_ = reader->ReadPosition(); | 762 end_position_ = reader->ReadPosition(); |
| 1206 flags_ = reader->ReadFlags(); | 763 flags_ = reader->ReadFlags(); |
| 1207 name_ = Name::ReadFrom(reader); | 764 name_ = Name::ReadFrom(reader); |
| 1208 annotations_.ReadFromStatic<Expression>(reader); | 765 annotations_.ReadFromStatic<Expression>(reader); |
| 1209 function_ = FunctionNode::ReadFrom(reader); | 766 function_ = FunctionNode::ReadFrom(reader); |
| 1210 initializers_.ReadFromStatic<Initializer>(reader); | 767 initializers_.ReadFromStatic<Initializer>(reader); |
| 1211 return this; | 768 return this; |
| 1212 } | 769 } |
| 1213 | 770 |
| 1214 | 771 |
| 1215 void Constructor::WriteTo(Writer* writer) { | |
| 1216 TRACE_WRITE_OFFSET(); | |
| 1217 writer->WriteTag(kConstructor); | |
| 1218 | |
| 1219 writer->WritePosition(position_); | |
| 1220 writer->WritePosition(end_position_); | |
| 1221 VariableScope<WriterHelper> parameters(writer->helper()); | |
| 1222 writer->WriteFlags(flags_); | |
| 1223 name_->WriteTo(writer); | |
| 1224 annotations_.WriteTo(writer); | |
| 1225 function_->WriteTo(writer); | |
| 1226 initializers_.WriteTo(writer); | |
| 1227 } | |
| 1228 | |
| 1229 | |
| 1230 Procedure* Procedure::ReadFrom(Reader* reader) { | 772 Procedure* Procedure::ReadFrom(Reader* reader) { |
| 1231 TRACE_READ_OFFSET(); | 773 TRACE_READ_OFFSET(); |
| 1232 Tag tag = reader->ReadTag(); | 774 Tag tag = reader->ReadTag(); |
| 1233 ASSERT(tag == kProcedure); | 775 ASSERT(tag == kProcedure); |
| 1234 | 776 |
| 1235 VariableScope<ReaderHelper> parameters(reader->helper()); | 777 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 1236 position_ = reader->ReadPosition(); | 778 position_ = reader->ReadPosition(); |
| 1237 end_position_ = reader->ReadPosition(); | 779 end_position_ = reader->ReadPosition(); |
| 1238 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | 780 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
| 1239 flags_ = reader->ReadFlags(); | 781 flags_ = reader->ReadFlags(); |
| 1240 name_ = Name::ReadFrom(reader); | 782 name_ = Name::ReadFrom(reader); |
| 1241 source_uri_index_ = reader->ReadUInt(); | 783 source_uri_index_ = reader->ReadUInt(); |
| 1242 annotations_.ReadFromStatic<Expression>(reader); | 784 annotations_.ReadFromStatic<Expression>(reader); |
| 1243 function_ = reader->ReadOptional<FunctionNode>(); | 785 function_ = reader->ReadOptional<FunctionNode>(); |
| 1244 return this; | 786 return this; |
| 1245 } | 787 } |
| 1246 | 788 |
| 1247 | 789 |
| 1248 void Procedure::WriteTo(Writer* writer) { | |
| 1249 TRACE_WRITE_OFFSET(); | |
| 1250 writer->WriteTag(kProcedure); | |
| 1251 | |
| 1252 writer->WritePosition(position_); | |
| 1253 writer->WritePosition(end_position_); | |
| 1254 VariableScope<WriterHelper> parameters(writer->helper()); | |
| 1255 writer->WriteByte(kind_); | |
| 1256 writer->WriteFlags(flags_); | |
| 1257 name_->WriteTo(writer); | |
| 1258 writer->WriteUInt(source_uri_index_); | |
| 1259 annotations_.WriteTo(writer); | |
| 1260 writer->WriteOptional<FunctionNode>(function_); | |
| 1261 } | |
| 1262 | |
| 1263 | |
| 1264 Initializer* Initializer::ReadFrom(Reader* reader) { | 790 Initializer* Initializer::ReadFrom(Reader* reader) { |
| 1265 TRACE_READ_OFFSET(); | 791 TRACE_READ_OFFSET(); |
| 1266 Tag tag = reader->ReadTag(); | 792 Tag tag = reader->ReadTag(); |
| 1267 switch (tag) { | 793 switch (tag) { |
| 1268 case kInvalidInitializer: | 794 case kInvalidInitializer: |
| 1269 return InvalidInitializer::ReadFromImpl(reader); | 795 return InvalidInitializer::ReadFromImpl(reader); |
| 1270 case kFieldInitializer: | 796 case kFieldInitializer: |
| 1271 return FieldInitializer::ReadFromImpl(reader); | 797 return FieldInitializer::ReadFromImpl(reader); |
| 1272 case kSuperInitializer: | 798 case kSuperInitializer: |
| 1273 return SuperInitializer::ReadFromImpl(reader); | 799 return SuperInitializer::ReadFromImpl(reader); |
| 1274 case kRedirectingInitializer: | 800 case kRedirectingInitializer: |
| 1275 return RedirectingInitializer::ReadFromImpl(reader); | 801 return RedirectingInitializer::ReadFromImpl(reader); |
| 1276 case kLocalInitializer: | 802 case kLocalInitializer: |
| 1277 return LocalInitializer::ReadFromImpl(reader); | 803 return LocalInitializer::ReadFromImpl(reader); |
| 1278 default: | 804 default: |
| 1279 UNREACHABLE(); | 805 UNREACHABLE(); |
| 1280 } | 806 } |
| 1281 return NULL; | 807 return NULL; |
| 1282 } | 808 } |
| 1283 | 809 |
| 1284 | 810 |
| 1285 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { | 811 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { |
| 1286 TRACE_READ_OFFSET(); | 812 TRACE_READ_OFFSET(); |
| 1287 return new InvalidInitializer(); | 813 return new InvalidInitializer(); |
| 1288 } | 814 } |
| 1289 | 815 |
| 1290 | 816 |
| 1291 void InvalidInitializer::WriteTo(Writer* writer) { | |
| 1292 TRACE_WRITE_OFFSET(); | |
| 1293 writer->WriteTag(kInvalidInitializer); | |
| 1294 } | |
| 1295 | |
| 1296 | |
| 1297 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { | 817 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { |
| 1298 TRACE_READ_OFFSET(); | 818 TRACE_READ_OFFSET(); |
| 1299 FieldInitializer* initializer = new FieldInitializer(); | 819 FieldInitializer* initializer = new FieldInitializer(); |
| 1300 initializer->field_ = Field::Cast(Reference::ReadMemberFrom(reader)); | 820 initializer->field_ = Field::Cast(Reference::ReadMemberFrom(reader)); |
| 1301 initializer->value_ = Expression::ReadFrom(reader); | 821 initializer->value_ = Expression::ReadFrom(reader); |
| 1302 return initializer; | 822 return initializer; |
| 1303 } | 823 } |
| 1304 | 824 |
| 1305 | 825 |
| 1306 void FieldInitializer::WriteTo(Writer* writer) { | |
| 1307 TRACE_WRITE_OFFSET(); | |
| 1308 writer->WriteTag(kFieldInitializer); | |
| 1309 Reference::WriteMemberTo(writer, field_); | |
| 1310 value_->WriteTo(writer); | |
| 1311 } | |
| 1312 | |
| 1313 | |
| 1314 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { | 826 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { |
| 1315 TRACE_READ_OFFSET(); | 827 TRACE_READ_OFFSET(); |
| 1316 SuperInitializer* init = new SuperInitializer(); | 828 SuperInitializer* init = new SuperInitializer(); |
| 1317 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 829 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); |
| 1318 init->arguments_ = Arguments::ReadFrom(reader); | 830 init->arguments_ = Arguments::ReadFrom(reader); |
| 1319 return init; | 831 return init; |
| 1320 } | 832 } |
| 1321 | 833 |
| 1322 | 834 |
| 1323 void SuperInitializer::WriteTo(Writer* writer) { | |
| 1324 TRACE_WRITE_OFFSET(); | |
| 1325 writer->WriteTag(kSuperInitializer); | |
| 1326 Reference::WriteMemberTo(writer, target_); | |
| 1327 arguments_->WriteTo(writer); | |
| 1328 } | |
| 1329 | |
| 1330 | |
| 1331 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { | 835 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { |
| 1332 TRACE_READ_OFFSET(); | 836 TRACE_READ_OFFSET(); |
| 1333 RedirectingInitializer* init = new RedirectingInitializer(); | 837 RedirectingInitializer* init = new RedirectingInitializer(); |
| 1334 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 838 init->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); |
| 1335 init->arguments_ = Arguments::ReadFrom(reader); | 839 init->arguments_ = Arguments::ReadFrom(reader); |
| 1336 return init; | 840 return init; |
| 1337 } | 841 } |
| 1338 | 842 |
| 1339 | 843 |
| 1340 void RedirectingInitializer::WriteTo(Writer* writer) { | |
| 1341 TRACE_WRITE_OFFSET(); | |
| 1342 writer->WriteTag(kRedirectingInitializer); | |
| 1343 Reference::WriteMemberTo(writer, target_); | |
| 1344 arguments_->WriteTo(writer); | |
| 1345 } | |
| 1346 | |
| 1347 | |
| 1348 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { | 844 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { |
| 1349 TRACE_READ_OFFSET(); | 845 TRACE_READ_OFFSET(); |
| 1350 LocalInitializer* init = new LocalInitializer(); | 846 LocalInitializer* init = new LocalInitializer(); |
| 1351 init->variable_ = VariableDeclaration::ReadFromImpl(reader); | 847 init->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 1352 return init; | 848 return init; |
| 1353 } | 849 } |
| 1354 | 850 |
| 1355 | 851 |
| 1356 void LocalInitializer::WriteTo(Writer* writer) { | |
| 1357 TRACE_WRITE_OFFSET(); | |
| 1358 writer->WriteTag(kLocalInitializer); | |
| 1359 variable_->WriteToImpl(writer); | |
| 1360 } | |
| 1361 | |
| 1362 | |
| 1363 Expression* Expression::ReadFrom(Reader* reader) { | 852 Expression* Expression::ReadFrom(Reader* reader) { |
| 1364 TRACE_READ_OFFSET(); | 853 TRACE_READ_OFFSET(); |
| 1365 uint8_t payload = 0; | 854 uint8_t payload = 0; |
| 1366 Tag tag = reader->ReadTag(&payload); | 855 Tag tag = reader->ReadTag(&payload); |
| 1367 switch (tag) { | 856 switch (tag) { |
| 1368 case kInvalidExpression: | 857 case kInvalidExpression: |
| 1369 return InvalidExpression::ReadFrom(reader); | 858 return InvalidExpression::ReadFrom(reader); |
| 1370 case kVariableGet: | 859 case kVariableGet: |
| 1371 return VariableGet::ReadFrom(reader); | 860 return VariableGet::ReadFrom(reader); |
| 1372 case kSpecializedVariableGet: | 861 case kSpecializedVariableGet: |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 return NULL; | 948 return NULL; |
| 1460 } | 949 } |
| 1461 | 950 |
| 1462 | 951 |
| 1463 InvalidExpression* InvalidExpression::ReadFrom(Reader* reader) { | 952 InvalidExpression* InvalidExpression::ReadFrom(Reader* reader) { |
| 1464 TRACE_READ_OFFSET(); | 953 TRACE_READ_OFFSET(); |
| 1465 return new InvalidExpression(); | 954 return new InvalidExpression(); |
| 1466 } | 955 } |
| 1467 | 956 |
| 1468 | 957 |
| 1469 void InvalidExpression::WriteTo(Writer* writer) { | |
| 1470 TRACE_WRITE_OFFSET(); | |
| 1471 writer->WriteTag(kInvalidExpression); | |
| 1472 } | |
| 1473 | |
| 1474 | |
| 1475 VariableGet* VariableGet::ReadFrom(Reader* reader) { | 958 VariableGet* VariableGet::ReadFrom(Reader* reader) { |
| 1476 TRACE_READ_OFFSET(); | 959 TRACE_READ_OFFSET(); |
| 1477 VariableGet* get = new VariableGet(); | 960 VariableGet* get = new VariableGet(); |
| 1478 get->position_ = reader->ReadPosition(); | 961 get->position_ = reader->ReadPosition(); |
| 1479 get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); | 962 get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
| 1480 reader->ReadOptional<DartType>(); // Unused promoted type. | 963 reader->ReadOptional<DartType>(); // Unused promoted type. |
| 1481 return get; | 964 return get; |
| 1482 } | 965 } |
| 1483 | 966 |
| 1484 | 967 |
| 1485 VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { | 968 VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { |
| 1486 TRACE_READ_OFFSET(); | 969 TRACE_READ_OFFSET(); |
| 1487 VariableGet* get = new VariableGet(); | 970 VariableGet* get = new VariableGet(); |
| 1488 get->position_ = reader->ReadPosition(); | 971 get->position_ = reader->ReadPosition(); |
| 1489 get->variable_ = reader->helper()->variables().Lookup(payload); | 972 get->variable_ = reader->helper()->variables().Lookup(payload); |
| 1490 return get; | 973 return get; |
| 1491 } | 974 } |
| 1492 | 975 |
| 1493 | 976 |
| 1494 void VariableGet::WriteTo(Writer* writer) { | |
| 1495 TRACE_WRITE_OFFSET(); | |
| 1496 int index = writer->helper()->variables().Lookup(variable_); | |
| 1497 if ((index & kSpecializedPayloadMask) == index) { | |
| 1498 writer->WriteTag(kSpecializedVariableGet, static_cast<uint8_t>(index)); | |
| 1499 writer->WritePosition(position_); | |
| 1500 } else { | |
| 1501 writer->WriteTag(kVariableGet); | |
| 1502 writer->WritePosition(position_); | |
| 1503 writer->WriteUInt(index); | |
| 1504 writer->WriteOptional<DartType>(NULL); | |
| 1505 } | |
| 1506 } | |
| 1507 | |
| 1508 | |
| 1509 VariableSet* VariableSet::ReadFrom(Reader* reader) { | 977 VariableSet* VariableSet::ReadFrom(Reader* reader) { |
| 1510 TRACE_READ_OFFSET(); | 978 TRACE_READ_OFFSET(); |
| 1511 VariableSet* set = new VariableSet(); | 979 VariableSet* set = new VariableSet(); |
| 1512 set->position_ = reader->ReadPosition(); | 980 set->position_ = reader->ReadPosition(); |
| 1513 set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); | 981 set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
| 1514 set->expression_ = Expression::ReadFrom(reader); | 982 set->expression_ = Expression::ReadFrom(reader); |
| 1515 return set; | 983 return set; |
| 1516 } | 984 } |
| 1517 | 985 |
| 1518 | 986 |
| 1519 VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { | 987 VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { |
| 1520 TRACE_READ_OFFSET(); | 988 TRACE_READ_OFFSET(); |
| 1521 VariableSet* set = new VariableSet(); | 989 VariableSet* set = new VariableSet(); |
| 1522 set->variable_ = reader->helper()->variables().Lookup(payload); | 990 set->variable_ = reader->helper()->variables().Lookup(payload); |
| 1523 set->position_ = reader->ReadPosition(); | 991 set->position_ = reader->ReadPosition(); |
| 1524 set->expression_ = Expression::ReadFrom(reader); | 992 set->expression_ = Expression::ReadFrom(reader); |
| 1525 return set; | 993 return set; |
| 1526 } | 994 } |
| 1527 | 995 |
| 1528 | 996 |
| 1529 void VariableSet::WriteTo(Writer* writer) { | |
| 1530 TRACE_WRITE_OFFSET(); | |
| 1531 int index = writer->helper()->variables().Lookup(variable_); | |
| 1532 if ((index & kSpecializedPayloadMask) == index) { | |
| 1533 writer->WriteTag(kSpecializedVariableSet, static_cast<uint8_t>(index)); | |
| 1534 writer->WritePosition(position_); | |
| 1535 } else { | |
| 1536 writer->WriteTag(kVariableSet); | |
| 1537 writer->WritePosition(position_); | |
| 1538 writer->WriteUInt(index); | |
| 1539 } | |
| 1540 expression_->WriteTo(writer); | |
| 1541 } | |
| 1542 | |
| 1543 | |
| 1544 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { | 997 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { |
| 1545 TRACE_READ_OFFSET(); | 998 TRACE_READ_OFFSET(); |
| 1546 PropertyGet* get = new PropertyGet(); | 999 PropertyGet* get = new PropertyGet(); |
| 1547 get->position_ = reader->ReadPosition(); | 1000 get->position_ = reader->ReadPosition(); |
| 1548 get->receiver_ = Expression::ReadFrom(reader); | 1001 get->receiver_ = Expression::ReadFrom(reader); |
| 1549 get->name_ = Name::ReadFrom(reader); | 1002 get->name_ = Name::ReadFrom(reader); |
| 1550 get->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1003 get->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); |
| 1551 return get; | 1004 return get; |
| 1552 } | 1005 } |
| 1553 | 1006 |
| 1554 | 1007 |
| 1555 void PropertyGet::WriteTo(Writer* writer) { | |
| 1556 TRACE_WRITE_OFFSET(); | |
| 1557 writer->WriteTag(kPropertyGet); | |
| 1558 writer->WritePosition(position_); | |
| 1559 receiver_->WriteTo(writer); | |
| 1560 name_->WriteTo(writer); | |
| 1561 Reference::WriteMemberTo(writer, interfaceTarget_, true); | |
| 1562 } | |
| 1563 | |
| 1564 | |
| 1565 PropertySet* PropertySet::ReadFrom(Reader* reader) { | 1008 PropertySet* PropertySet::ReadFrom(Reader* reader) { |
| 1566 TRACE_READ_OFFSET(); | 1009 TRACE_READ_OFFSET(); |
| 1567 PropertySet* set = new PropertySet(); | 1010 PropertySet* set = new PropertySet(); |
| 1568 set->position_ = reader->ReadPosition(); | 1011 set->position_ = reader->ReadPosition(); |
| 1569 set->receiver_ = Expression::ReadFrom(reader); | 1012 set->receiver_ = Expression::ReadFrom(reader); |
| 1570 set->name_ = Name::ReadFrom(reader); | 1013 set->name_ = Name::ReadFrom(reader); |
| 1571 set->value_ = Expression::ReadFrom(reader); | 1014 set->value_ = Expression::ReadFrom(reader); |
| 1572 set->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1015 set->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); |
| 1573 return set; | 1016 return set; |
| 1574 } | 1017 } |
| 1575 | 1018 |
| 1576 | 1019 |
| 1577 void PropertySet::WriteTo(Writer* writer) { | |
| 1578 TRACE_WRITE_OFFSET(); | |
| 1579 writer->WriteTag(kPropertySet); | |
| 1580 writer->WritePosition(position_); | |
| 1581 receiver_->WriteTo(writer); | |
| 1582 name_->WriteTo(writer); | |
| 1583 value_->WriteTo(writer); | |
| 1584 Reference::WriteMemberTo(writer, interfaceTarget_, true); | |
| 1585 } | |
| 1586 | |
| 1587 | |
| 1588 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { | 1020 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { |
| 1589 TRACE_READ_OFFSET(); | 1021 TRACE_READ_OFFSET(); |
| 1590 DirectPropertyGet* get = new DirectPropertyGet(); | 1022 DirectPropertyGet* get = new DirectPropertyGet(); |
| 1591 get->receiver_ = Expression::ReadFrom(reader); | 1023 get->receiver_ = Expression::ReadFrom(reader); |
| 1592 get->target_ = Reference::ReadMemberFrom(reader); | 1024 get->target_ = Reference::ReadMemberFrom(reader); |
| 1593 return get; | 1025 return get; |
| 1594 } | 1026 } |
| 1595 | 1027 |
| 1596 | 1028 |
| 1597 void DirectPropertyGet::WriteTo(Writer* writer) { | |
| 1598 TRACE_WRITE_OFFSET(); | |
| 1599 writer->WriteTag(kDirectPropertyGet); | |
| 1600 receiver_->WriteTo(writer); | |
| 1601 Reference::WriteMemberTo(writer, target_); | |
| 1602 } | |
| 1603 | |
| 1604 | |
| 1605 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { | 1029 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { |
| 1606 TRACE_READ_OFFSET(); | 1030 TRACE_READ_OFFSET(); |
| 1607 DirectPropertySet* set = new DirectPropertySet(); | 1031 DirectPropertySet* set = new DirectPropertySet(); |
| 1608 set->receiver_ = Expression::ReadFrom(reader); | 1032 set->receiver_ = Expression::ReadFrom(reader); |
| 1609 set->target_ = Reference::ReadMemberFrom(reader); | 1033 set->target_ = Reference::ReadMemberFrom(reader); |
| 1610 set->value_ = Expression::ReadFrom(reader); | 1034 set->value_ = Expression::ReadFrom(reader); |
| 1611 return set; | 1035 return set; |
| 1612 } | 1036 } |
| 1613 | 1037 |
| 1614 | 1038 |
| 1615 void DirectPropertySet::WriteTo(Writer* writer) { | |
| 1616 TRACE_WRITE_OFFSET(); | |
| 1617 writer->WriteTag(kDirectPropertySet); | |
| 1618 receiver_->WriteTo(writer); | |
| 1619 Reference::WriteMemberTo(writer, target_); | |
| 1620 value_->WriteTo(writer); | |
| 1621 } | |
| 1622 | |
| 1623 | |
| 1624 StaticGet* StaticGet::ReadFrom(Reader* reader) { | 1039 StaticGet* StaticGet::ReadFrom(Reader* reader) { |
| 1625 TRACE_READ_OFFSET(); | 1040 TRACE_READ_OFFSET(); |
| 1626 StaticGet* get = new StaticGet(); | 1041 StaticGet* get = new StaticGet(); |
| 1627 get->position_ = reader->ReadPosition(); | 1042 get->position_ = reader->ReadPosition(); |
| 1628 get->target_ = Reference::ReadMemberFrom(reader); | 1043 get->target_ = Reference::ReadMemberFrom(reader); |
| 1629 return get; | 1044 return get; |
| 1630 } | 1045 } |
| 1631 | 1046 |
| 1632 | 1047 |
| 1633 void StaticGet::WriteTo(Writer* writer) { | |
| 1634 TRACE_WRITE_OFFSET(); | |
| 1635 writer->WriteTag(kStaticGet); | |
| 1636 writer->WritePosition(position_); | |
| 1637 Reference::WriteMemberTo(writer, target_); | |
| 1638 } | |
| 1639 | |
| 1640 | |
| 1641 StaticSet* StaticSet::ReadFrom(Reader* reader) { | 1048 StaticSet* StaticSet::ReadFrom(Reader* reader) { |
| 1642 TRACE_READ_OFFSET(); | 1049 TRACE_READ_OFFSET(); |
| 1643 StaticSet* set = new StaticSet(); | 1050 StaticSet* set = new StaticSet(); |
| 1644 set->target_ = Reference::ReadMemberFrom(reader); | 1051 set->target_ = Reference::ReadMemberFrom(reader); |
| 1645 set->expression_ = Expression::ReadFrom(reader); | 1052 set->expression_ = Expression::ReadFrom(reader); |
| 1646 return set; | 1053 return set; |
| 1647 } | 1054 } |
| 1648 | 1055 |
| 1649 | 1056 |
| 1650 void StaticSet::WriteTo(Writer* writer) { | |
| 1651 TRACE_WRITE_OFFSET(); | |
| 1652 writer->WriteTag(kStaticSet); | |
| 1653 Reference::WriteMemberTo(writer, target_); | |
| 1654 expression_->WriteTo(writer); | |
| 1655 } | |
| 1656 | |
| 1657 | |
| 1658 Arguments* Arguments::ReadFrom(Reader* reader) { | 1057 Arguments* Arguments::ReadFrom(Reader* reader) { |
| 1659 TRACE_READ_OFFSET(); | 1058 TRACE_READ_OFFSET(); |
| 1660 Arguments* arguments = new Arguments(); | 1059 Arguments* arguments = new Arguments(); |
| 1661 arguments->types().ReadFromStatic<DartType>(reader); | 1060 arguments->types().ReadFromStatic<DartType>(reader); |
| 1662 arguments->positional().ReadFromStatic<Expression>(reader); | 1061 arguments->positional().ReadFromStatic<Expression>(reader); |
| 1663 arguments->named().ReadFromStatic<NamedExpression>(reader); | 1062 arguments->named().ReadFromStatic<NamedExpression>(reader); |
| 1664 return arguments; | 1063 return arguments; |
| 1665 } | 1064 } |
| 1666 | 1065 |
| 1667 | 1066 |
| 1668 void Arguments::WriteTo(Writer* writer) { | |
| 1669 TRACE_WRITE_OFFSET(); | |
| 1670 types().WriteTo(writer); | |
| 1671 positional().WriteTo(writer); | |
| 1672 named().WriteTo(writer); | |
| 1673 } | |
| 1674 | |
| 1675 | |
| 1676 NamedExpression* NamedExpression::ReadFrom(Reader* reader) { | 1067 NamedExpression* NamedExpression::ReadFrom(Reader* reader) { |
| 1677 TRACE_READ_OFFSET(); | 1068 TRACE_READ_OFFSET(); |
| 1678 String* name = Reference::ReadStringFrom(reader); | 1069 String* name = Reference::ReadStringFrom(reader); |
| 1679 Expression* expression = Expression::ReadFrom(reader); | 1070 Expression* expression = Expression::ReadFrom(reader); |
| 1680 return new NamedExpression(name, expression); | 1071 return new NamedExpression(name, expression); |
| 1681 } | 1072 } |
| 1682 | 1073 |
| 1683 | 1074 |
| 1684 void NamedExpression::WriteTo(Writer* writer) { | |
| 1685 TRACE_WRITE_OFFSET(); | |
| 1686 name_->WriteTo(writer); | |
| 1687 expression_->WriteTo(writer); | |
| 1688 } | |
| 1689 | |
| 1690 | |
| 1691 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { | 1075 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { |
| 1692 TRACE_READ_OFFSET(); | 1076 TRACE_READ_OFFSET(); |
| 1693 MethodInvocation* invocation = new MethodInvocation(); | 1077 MethodInvocation* invocation = new MethodInvocation(); |
| 1694 invocation->position_ = reader->ReadPosition(); | 1078 invocation->position_ = reader->ReadPosition(); |
| 1695 invocation->receiver_ = Expression::ReadFrom(reader); | 1079 invocation->receiver_ = Expression::ReadFrom(reader); |
| 1696 invocation->name_ = Name::ReadFrom(reader); | 1080 invocation->name_ = Name::ReadFrom(reader); |
| 1697 invocation->arguments_ = Arguments::ReadFrom(reader); | 1081 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1698 invocation->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); | 1082 invocation->interfaceTarget_ = Reference::ReadMemberFrom(reader, true); |
| 1699 return invocation; | 1083 return invocation; |
| 1700 } | 1084 } |
| 1701 | 1085 |
| 1702 | 1086 |
| 1703 void MethodInvocation::WriteTo(Writer* writer) { | |
| 1704 TRACE_WRITE_OFFSET(); | |
| 1705 writer->WriteTag(kMethodInvocation); | |
| 1706 writer->WritePosition(position_); | |
| 1707 receiver_->WriteTo(writer); | |
| 1708 name_->WriteTo(writer); | |
| 1709 arguments_->WriteTo(writer); | |
| 1710 Reference::WriteMemberTo(writer, interfaceTarget_, true); | |
| 1711 } | |
| 1712 | |
| 1713 | |
| 1714 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { | 1087 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { |
| 1715 TRACE_READ_OFFSET(); | 1088 TRACE_READ_OFFSET(); |
| 1716 DirectMethodInvocation* invocation = new DirectMethodInvocation(); | 1089 DirectMethodInvocation* invocation = new DirectMethodInvocation(); |
| 1717 invocation->receiver_ = Expression::ReadFrom(reader); | 1090 invocation->receiver_ = Expression::ReadFrom(reader); |
| 1718 invocation->target_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1091 invocation->target_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); |
| 1719 invocation->arguments_ = Arguments::ReadFrom(reader); | 1092 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1720 return invocation; | 1093 return invocation; |
| 1721 } | 1094 } |
| 1722 | 1095 |
| 1723 | 1096 |
| 1724 void DirectMethodInvocation::WriteTo(Writer* writer) { | |
| 1725 TRACE_WRITE_OFFSET(); | |
| 1726 writer->WriteTag(kDirectMethodInvocation); | |
| 1727 receiver_->WriteTo(writer); | |
| 1728 Reference::WriteMemberTo(writer, target_); | |
| 1729 arguments_->WriteTo(writer); | |
| 1730 } | |
| 1731 | |
| 1732 | |
| 1733 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { | 1097 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { |
| 1734 TRACE_READ_OFFSET(); | 1098 TRACE_READ_OFFSET(); |
| 1735 StaticInvocation* invocation = new StaticInvocation(); | 1099 StaticInvocation* invocation = new StaticInvocation(); |
| 1736 invocation->is_const_ = is_const; | 1100 invocation->is_const_ = is_const; |
| 1737 invocation->position_ = reader->ReadPosition(); | 1101 invocation->position_ = reader->ReadPosition(); |
| 1738 invocation->procedure_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1102 invocation->procedure_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); |
| 1739 invocation->arguments_ = Arguments::ReadFrom(reader); | 1103 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1740 return invocation; | 1104 return invocation; |
| 1741 } | 1105 } |
| 1742 | 1106 |
| 1743 | 1107 |
| 1744 void StaticInvocation::WriteTo(Writer* writer) { | |
| 1745 TRACE_WRITE_OFFSET(); | |
| 1746 writer->WriteTag(is_const_ ? kConstStaticInvocation : kStaticInvocation); | |
| 1747 writer->WritePosition(position_); | |
| 1748 Reference::WriteMemberTo(writer, procedure_); | |
| 1749 arguments_->WriteTo(writer); | |
| 1750 } | |
| 1751 | |
| 1752 | |
| 1753 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, | 1108 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, |
| 1754 bool is_const) { | 1109 bool is_const) { |
| 1755 TRACE_READ_OFFSET(); | 1110 TRACE_READ_OFFSET(); |
| 1756 ConstructorInvocation* invocation = new ConstructorInvocation(); | 1111 ConstructorInvocation* invocation = new ConstructorInvocation(); |
| 1757 invocation->is_const_ = is_const; | 1112 invocation->is_const_ = is_const; |
| 1758 invocation->position_ = reader->ReadPosition(); | 1113 invocation->position_ = reader->ReadPosition(); |
| 1759 invocation->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); | 1114 invocation->target_ = Constructor::Cast(Reference::ReadMemberFrom(reader)); |
| 1760 invocation->arguments_ = Arguments::ReadFrom(reader); | 1115 invocation->arguments_ = Arguments::ReadFrom(reader); |
| 1761 return invocation; | 1116 return invocation; |
| 1762 } | 1117 } |
| 1763 | 1118 |
| 1764 | 1119 |
| 1765 void ConstructorInvocation::WriteTo(Writer* writer) { | |
| 1766 TRACE_WRITE_OFFSET(); | |
| 1767 writer->WriteTag(is_const_ ? kConstConstructorInvocation | |
| 1768 : kConstructorInvocation); | |
| 1769 writer->WritePosition(position_); | |
| 1770 Reference::WriteMemberTo(writer, target_); | |
| 1771 arguments_->WriteTo(writer); | |
| 1772 } | |
| 1773 | |
| 1774 | |
| 1775 Not* Not::ReadFrom(Reader* reader) { | 1120 Not* Not::ReadFrom(Reader* reader) { |
| 1776 TRACE_READ_OFFSET(); | 1121 TRACE_READ_OFFSET(); |
| 1777 Not* n = new Not(); | 1122 Not* n = new Not(); |
| 1778 n->expression_ = Expression::ReadFrom(reader); | 1123 n->expression_ = Expression::ReadFrom(reader); |
| 1779 return n; | 1124 return n; |
| 1780 } | 1125 } |
| 1781 | 1126 |
| 1782 | 1127 |
| 1783 void Not::WriteTo(Writer* writer) { | |
| 1784 TRACE_WRITE_OFFSET(); | |
| 1785 writer->WriteTag(kNot); | |
| 1786 expression_->WriteTo(writer); | |
| 1787 } | |
| 1788 | |
| 1789 | |
| 1790 LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { | 1128 LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { |
| 1791 TRACE_READ_OFFSET(); | 1129 TRACE_READ_OFFSET(); |
| 1792 LogicalExpression* expr = new LogicalExpression(); | 1130 LogicalExpression* expr = new LogicalExpression(); |
| 1793 expr->left_ = Expression::ReadFrom(reader); | 1131 expr->left_ = Expression::ReadFrom(reader); |
| 1794 expr->operator_ = static_cast<Operator>(reader->ReadByte()); | 1132 expr->operator_ = static_cast<Operator>(reader->ReadByte()); |
| 1795 expr->right_ = Expression::ReadFrom(reader); | 1133 expr->right_ = Expression::ReadFrom(reader); |
| 1796 return expr; | 1134 return expr; |
| 1797 } | 1135 } |
| 1798 | 1136 |
| 1799 | 1137 |
| 1800 void LogicalExpression::WriteTo(Writer* writer) { | |
| 1801 TRACE_WRITE_OFFSET(); | |
| 1802 writer->WriteTag(kLogicalExpression); | |
| 1803 left_->WriteTo(writer); | |
| 1804 writer->WriteByte(operator_); | |
| 1805 right_->WriteTo(writer); | |
| 1806 } | |
| 1807 | |
| 1808 | |
| 1809 ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { | 1138 ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { |
| 1810 TRACE_READ_OFFSET(); | 1139 TRACE_READ_OFFSET(); |
| 1811 ConditionalExpression* expr = new ConditionalExpression(); | 1140 ConditionalExpression* expr = new ConditionalExpression(); |
| 1812 expr->condition_ = Expression::ReadFrom(reader); | 1141 expr->condition_ = Expression::ReadFrom(reader); |
| 1813 expr->then_ = Expression::ReadFrom(reader); | 1142 expr->then_ = Expression::ReadFrom(reader); |
| 1814 expr->otherwise_ = Expression::ReadFrom(reader); | 1143 expr->otherwise_ = Expression::ReadFrom(reader); |
| 1815 reader->ReadOptional<DartType>(); // Unused static type. | 1144 reader->ReadOptional<DartType>(); // Unused static type. |
| 1816 return expr; | 1145 return expr; |
| 1817 } | 1146 } |
| 1818 | 1147 |
| 1819 | 1148 |
| 1820 void ConditionalExpression::WriteTo(Writer* writer) { | |
| 1821 TRACE_WRITE_OFFSET(); | |
| 1822 writer->WriteTag(kConditionalExpression); | |
| 1823 condition_->WriteTo(writer); | |
| 1824 then_->WriteTo(writer); | |
| 1825 otherwise_->WriteTo(writer); | |
| 1826 writer->WriteOptional<DartType>(NULL); // Unused static type. | |
| 1827 } | |
| 1828 | |
| 1829 | |
| 1830 StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { | 1149 StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { |
| 1831 TRACE_READ_OFFSET(); | 1150 TRACE_READ_OFFSET(); |
| 1832 StringConcatenation* concat = new StringConcatenation(); | 1151 StringConcatenation* concat = new StringConcatenation(); |
| 1833 concat->position_ = reader->ReadPosition(); | 1152 concat->position_ = reader->ReadPosition(); |
| 1834 concat->expressions_.ReadFromStatic<Expression>(reader); | 1153 concat->expressions_.ReadFromStatic<Expression>(reader); |
| 1835 return concat; | 1154 return concat; |
| 1836 } | 1155 } |
| 1837 | 1156 |
| 1838 | 1157 |
| 1839 void StringConcatenation::WriteTo(Writer* writer) { | |
| 1840 TRACE_WRITE_OFFSET(); | |
| 1841 writer->WriteTag(kStringConcatenation); | |
| 1842 writer->WritePosition(position_); | |
| 1843 expressions_.WriteTo(writer); | |
| 1844 } | |
| 1845 | |
| 1846 | |
| 1847 IsExpression* IsExpression::ReadFrom(Reader* reader) { | 1158 IsExpression* IsExpression::ReadFrom(Reader* reader) { |
| 1848 TRACE_READ_OFFSET(); | 1159 TRACE_READ_OFFSET(); |
| 1849 IsExpression* expr = new IsExpression(); | 1160 IsExpression* expr = new IsExpression(); |
| 1850 expr->position_ = reader->ReadPosition(); | 1161 expr->position_ = reader->ReadPosition(); |
| 1851 expr->operand_ = Expression::ReadFrom(reader); | 1162 expr->operand_ = Expression::ReadFrom(reader); |
| 1852 expr->type_ = DartType::ReadFrom(reader); | 1163 expr->type_ = DartType::ReadFrom(reader); |
| 1853 return expr; | 1164 return expr; |
| 1854 } | 1165 } |
| 1855 | 1166 |
| 1856 | 1167 |
| 1857 void IsExpression::WriteTo(Writer* writer) { | |
| 1858 TRACE_WRITE_OFFSET(); | |
| 1859 writer->WriteTag(kIsExpression); | |
| 1860 writer->WritePosition(position_); | |
| 1861 operand_->WriteTo(writer); | |
| 1862 type_->WriteTo(writer); | |
| 1863 } | |
| 1864 | |
| 1865 | |
| 1866 AsExpression* AsExpression::ReadFrom(Reader* reader) { | 1168 AsExpression* AsExpression::ReadFrom(Reader* reader) { |
| 1867 TRACE_READ_OFFSET(); | 1169 TRACE_READ_OFFSET(); |
| 1868 AsExpression* expr = new AsExpression(); | 1170 AsExpression* expr = new AsExpression(); |
| 1869 expr->operand_ = Expression::ReadFrom(reader); | 1171 expr->operand_ = Expression::ReadFrom(reader); |
| 1870 expr->type_ = DartType::ReadFrom(reader); | 1172 expr->type_ = DartType::ReadFrom(reader); |
| 1871 return expr; | 1173 return expr; |
| 1872 } | 1174 } |
| 1873 | 1175 |
| 1874 | 1176 |
| 1875 void AsExpression::WriteTo(Writer* writer) { | |
| 1876 TRACE_WRITE_OFFSET(); | |
| 1877 writer->WriteTag(kAsExpression); | |
| 1878 operand_->WriteTo(writer); | |
| 1879 type_->WriteTo(writer); | |
| 1880 } | |
| 1881 | |
| 1882 | |
| 1883 StringLiteral* StringLiteral::ReadFrom(Reader* reader) { | 1177 StringLiteral* StringLiteral::ReadFrom(Reader* reader) { |
| 1884 TRACE_READ_OFFSET(); | 1178 TRACE_READ_OFFSET(); |
| 1885 return new StringLiteral(Reference::ReadStringFrom(reader)); | 1179 return new StringLiteral(Reference::ReadStringFrom(reader)); |
| 1886 } | 1180 } |
| 1887 | 1181 |
| 1888 | 1182 |
| 1889 void StringLiteral::WriteTo(Writer* writer) { | |
| 1890 TRACE_WRITE_OFFSET(); | |
| 1891 writer->WriteTag(kStringLiteral); | |
| 1892 value_->WriteTo(writer); | |
| 1893 } | |
| 1894 | |
| 1895 | |
| 1896 BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) { | 1183 BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) { |
| 1897 TRACE_READ_OFFSET(); | 1184 TRACE_READ_OFFSET(); |
| 1898 return new BigintLiteral(Reference::ReadStringFrom(reader)); | 1185 return new BigintLiteral(Reference::ReadStringFrom(reader)); |
| 1899 } | 1186 } |
| 1900 | 1187 |
| 1901 | 1188 |
| 1902 void BigintLiteral::WriteTo(Writer* writer) { | |
| 1903 TRACE_WRITE_OFFSET(); | |
| 1904 writer->WriteTag(kBigIntLiteral); | |
| 1905 value_->WriteTo(writer); | |
| 1906 } | |
| 1907 | |
| 1908 | |
| 1909 IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) { | 1189 IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) { |
| 1910 TRACE_READ_OFFSET(); | 1190 TRACE_READ_OFFSET(); |
| 1911 IntLiteral* literal = new IntLiteral(); | 1191 IntLiteral* literal = new IntLiteral(); |
| 1912 literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt()) | 1192 literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt()) |
| 1913 : reader->ReadUInt(); | 1193 : reader->ReadUInt(); |
| 1914 return literal; | 1194 return literal; |
| 1915 } | 1195 } |
| 1916 | 1196 |
| 1917 | 1197 |
| 1918 IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) { | 1198 IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) { |
| 1919 TRACE_READ_OFFSET(); | 1199 TRACE_READ_OFFSET(); |
| 1920 IntLiteral* literal = new IntLiteral(); | 1200 IntLiteral* literal = new IntLiteral(); |
| 1921 literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; | 1201 literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; |
| 1922 return literal; | 1202 return literal; |
| 1923 } | 1203 } |
| 1924 | 1204 |
| 1925 | 1205 |
| 1926 void IntLiteral::WriteTo(Writer* writer) { | |
| 1927 TRACE_WRITE_OFFSET(); | |
| 1928 int64_t payload = value_ + SpecializedIntLiteralBias; | |
| 1929 if ((payload & kSpecializedPayloadMask) == payload) { | |
| 1930 writer->WriteTag(kSpecialIntLiteral, static_cast<uint8_t>(payload)); | |
| 1931 } else { | |
| 1932 writer->WriteTag(value_ < 0 ? kNegativeIntLiteral : kPositiveIntLiteral); | |
| 1933 writer->WriteUInt(static_cast<uint32_t>(value_ < 0 ? -value_ : value_)); | |
| 1934 } | |
| 1935 } | |
| 1936 | |
| 1937 | |
| 1938 DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) { | 1206 DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) { |
| 1939 TRACE_READ_OFFSET(); | 1207 TRACE_READ_OFFSET(); |
| 1940 DoubleLiteral* literal = new DoubleLiteral(); | 1208 DoubleLiteral* literal = new DoubleLiteral(); |
| 1941 literal->value_ = Reference::ReadStringFrom(reader); | 1209 literal->value_ = Reference::ReadStringFrom(reader); |
| 1942 return literal; | 1210 return literal; |
| 1943 } | 1211 } |
| 1944 | 1212 |
| 1945 | 1213 |
| 1946 void DoubleLiteral::WriteTo(Writer* writer) { | |
| 1947 TRACE_WRITE_OFFSET(); | |
| 1948 writer->WriteTag(kDoubleLiteral); | |
| 1949 value_->WriteTo(writer); | |
| 1950 } | |
| 1951 | |
| 1952 | |
| 1953 BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) { | 1214 BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) { |
| 1954 TRACE_READ_OFFSET(); | 1215 TRACE_READ_OFFSET(); |
| 1955 BoolLiteral* lit = new BoolLiteral(); | 1216 BoolLiteral* lit = new BoolLiteral(); |
| 1956 lit->value_ = value; | 1217 lit->value_ = value; |
| 1957 return lit; | 1218 return lit; |
| 1958 } | 1219 } |
| 1959 | 1220 |
| 1960 | 1221 |
| 1961 void BoolLiteral::WriteTo(Writer* writer) { | |
| 1962 TRACE_WRITE_OFFSET(); | |
| 1963 writer->WriteTag(value_ ? kTrueLiteral : kFalseLiteral); | |
| 1964 } | |
| 1965 | |
| 1966 | |
| 1967 NullLiteral* NullLiteral::ReadFrom(Reader* reader) { | 1222 NullLiteral* NullLiteral::ReadFrom(Reader* reader) { |
| 1968 TRACE_READ_OFFSET(); | 1223 TRACE_READ_OFFSET(); |
| 1969 return new NullLiteral(); | 1224 return new NullLiteral(); |
| 1970 } | 1225 } |
| 1971 | 1226 |
| 1972 | 1227 |
| 1973 void NullLiteral::WriteTo(Writer* writer) { | |
| 1974 TRACE_WRITE_OFFSET(); | |
| 1975 writer->WriteTag(kNullLiteral); | |
| 1976 } | |
| 1977 | |
| 1978 | |
| 1979 SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) { | 1228 SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) { |
| 1980 TRACE_READ_OFFSET(); | 1229 TRACE_READ_OFFSET(); |
| 1981 SymbolLiteral* lit = new SymbolLiteral(); | 1230 SymbolLiteral* lit = new SymbolLiteral(); |
| 1982 lit->value_ = Reference::ReadStringFrom(reader); | 1231 lit->value_ = Reference::ReadStringFrom(reader); |
| 1983 return lit; | 1232 return lit; |
| 1984 } | 1233 } |
| 1985 | 1234 |
| 1986 | 1235 |
| 1987 void SymbolLiteral::WriteTo(Writer* writer) { | |
| 1988 TRACE_WRITE_OFFSET(); | |
| 1989 writer->WriteTag(kSymbolLiteral); | |
| 1990 value_->WriteTo(writer); | |
| 1991 } | |
| 1992 | |
| 1993 | |
| 1994 TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) { | 1236 TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) { |
| 1995 TRACE_READ_OFFSET(); | 1237 TRACE_READ_OFFSET(); |
| 1996 TypeLiteral* literal = new TypeLiteral(); | 1238 TypeLiteral* literal = new TypeLiteral(); |
| 1997 literal->type_ = DartType::ReadFrom(reader); | 1239 literal->type_ = DartType::ReadFrom(reader); |
| 1998 return literal; | 1240 return literal; |
| 1999 } | 1241 } |
| 2000 | 1242 |
| 2001 | 1243 |
| 2002 void TypeLiteral::WriteTo(Writer* writer) { | |
| 2003 TRACE_WRITE_OFFSET(); | |
| 2004 writer->WriteTag(kTypeLiteral); | |
| 2005 type_->WriteTo(writer); | |
| 2006 } | |
| 2007 | |
| 2008 | |
| 2009 ThisExpression* ThisExpression::ReadFrom(Reader* reader) { | 1244 ThisExpression* ThisExpression::ReadFrom(Reader* reader) { |
| 2010 TRACE_READ_OFFSET(); | 1245 TRACE_READ_OFFSET(); |
| 2011 return new ThisExpression(); | 1246 return new ThisExpression(); |
| 2012 } | 1247 } |
| 2013 | 1248 |
| 2014 | 1249 |
| 2015 void ThisExpression::WriteTo(Writer* writer) { | |
| 2016 TRACE_WRITE_OFFSET(); | |
| 2017 writer->WriteTag(kThisExpression); | |
| 2018 } | |
| 2019 | |
| 2020 | |
| 2021 Rethrow* Rethrow::ReadFrom(Reader* reader) { | 1250 Rethrow* Rethrow::ReadFrom(Reader* reader) { |
| 2022 TRACE_READ_OFFSET(); | 1251 TRACE_READ_OFFSET(); |
| 2023 return new Rethrow(); | 1252 return new Rethrow(); |
| 2024 } | 1253 } |
| 2025 | 1254 |
| 2026 | 1255 |
| 2027 void Rethrow::WriteTo(Writer* writer) { | |
| 2028 TRACE_WRITE_OFFSET(); | |
| 2029 writer->WriteTag(kRethrow); | |
| 2030 } | |
| 2031 | |
| 2032 | |
| 2033 Throw* Throw::ReadFrom(Reader* reader) { | 1256 Throw* Throw::ReadFrom(Reader* reader) { |
| 2034 TRACE_READ_OFFSET(); | 1257 TRACE_READ_OFFSET(); |
| 2035 Throw* t = new Throw(); | 1258 Throw* t = new Throw(); |
| 2036 t->position_ = reader->ReadPosition(); | 1259 t->position_ = reader->ReadPosition(); |
| 2037 t->expression_ = Expression::ReadFrom(reader); | 1260 t->expression_ = Expression::ReadFrom(reader); |
| 2038 return t; | 1261 return t; |
| 2039 } | 1262 } |
| 2040 | 1263 |
| 2041 | 1264 |
| 2042 void Throw::WriteTo(Writer* writer) { | |
| 2043 TRACE_WRITE_OFFSET(); | |
| 2044 writer->WriteTag(kThrow); | |
| 2045 writer->WritePosition(position_); | |
| 2046 expression_->WriteTo(writer); | |
| 2047 } | |
| 2048 | |
| 2049 | |
| 2050 ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { | 1265 ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { |
| 2051 TRACE_READ_OFFSET(); | 1266 TRACE_READ_OFFSET(); |
| 2052 ListLiteral* literal = new ListLiteral(); | 1267 ListLiteral* literal = new ListLiteral(); |
| 2053 literal->is_const_ = is_const; | 1268 literal->is_const_ = is_const; |
| 2054 literal->type_ = DartType::ReadFrom(reader); | 1269 literal->type_ = DartType::ReadFrom(reader); |
| 2055 literal->expressions_.ReadFromStatic<Expression>(reader); | 1270 literal->expressions_.ReadFromStatic<Expression>(reader); |
| 2056 return literal; | 1271 return literal; |
| 2057 } | 1272 } |
| 2058 | 1273 |
| 2059 | 1274 |
| 2060 void ListLiteral::WriteTo(Writer* writer) { | |
| 2061 TRACE_WRITE_OFFSET(); | |
| 2062 writer->WriteTag(is_const_ ? kConstListLiteral : kListLiteral); | |
| 2063 type_->WriteTo(writer); | |
| 2064 expressions_.WriteTo(writer); | |
| 2065 } | |
| 2066 | |
| 2067 | |
| 2068 MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { | 1275 MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { |
| 2069 TRACE_READ_OFFSET(); | 1276 TRACE_READ_OFFSET(); |
| 2070 MapLiteral* literal = new MapLiteral(); | 1277 MapLiteral* literal = new MapLiteral(); |
| 2071 literal->is_const_ = is_const; | 1278 literal->is_const_ = is_const; |
| 2072 literal->position_ = reader->ReadPosition(); | 1279 literal->position_ = reader->ReadPosition(); |
| 2073 literal->key_type_ = DartType::ReadFrom(reader); | 1280 literal->key_type_ = DartType::ReadFrom(reader); |
| 2074 literal->value_type_ = DartType::ReadFrom(reader); | 1281 literal->value_type_ = DartType::ReadFrom(reader); |
| 2075 literal->entries_.ReadFromStatic<MapEntry>(reader); | 1282 literal->entries_.ReadFromStatic<MapEntry>(reader); |
| 2076 return literal; | 1283 return literal; |
| 2077 } | 1284 } |
| 2078 | 1285 |
| 2079 | 1286 |
| 2080 void MapLiteral::WriteTo(Writer* writer) { | |
| 2081 TRACE_WRITE_OFFSET(); | |
| 2082 writer->WriteTag(is_const_ ? kConstMapLiteral : kMapLiteral); | |
| 2083 writer->WritePosition(position_); | |
| 2084 key_type_->WriteTo(writer); | |
| 2085 value_type_->WriteTo(writer); | |
| 2086 entries_.WriteTo(writer); | |
| 2087 } | |
| 2088 | |
| 2089 | |
| 2090 MapEntry* MapEntry::ReadFrom(Reader* reader) { | 1287 MapEntry* MapEntry::ReadFrom(Reader* reader) { |
| 2091 MapEntry* entry = new MapEntry(); | 1288 MapEntry* entry = new MapEntry(); |
| 2092 entry->key_ = Expression::ReadFrom(reader); | 1289 entry->key_ = Expression::ReadFrom(reader); |
| 2093 entry->value_ = Expression::ReadFrom(reader); | 1290 entry->value_ = Expression::ReadFrom(reader); |
| 2094 return entry; | 1291 return entry; |
| 2095 } | 1292 } |
| 2096 | 1293 |
| 2097 | 1294 |
| 2098 void MapEntry::WriteTo(Writer* writer) { | |
| 2099 TRACE_WRITE_OFFSET(); | |
| 2100 key_->WriteTo(writer); | |
| 2101 value_->WriteTo(writer); | |
| 2102 } | |
| 2103 | |
| 2104 | |
| 2105 AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { | 1295 AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { |
| 2106 TRACE_READ_OFFSET(); | 1296 TRACE_READ_OFFSET(); |
| 2107 AwaitExpression* await = new AwaitExpression(); | 1297 AwaitExpression* await = new AwaitExpression(); |
| 2108 await->operand_ = Expression::ReadFrom(reader); | 1298 await->operand_ = Expression::ReadFrom(reader); |
| 2109 return await; | 1299 return await; |
| 2110 } | 1300 } |
| 2111 | 1301 |
| 2112 | 1302 |
| 2113 void AwaitExpression::WriteTo(Writer* writer) { | |
| 2114 TRACE_WRITE_OFFSET(); | |
| 2115 writer->WriteTag(kAwaitExpression); | |
| 2116 operand_->WriteTo(writer); | |
| 2117 } | |
| 2118 | |
| 2119 | |
| 2120 FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { | 1303 FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { |
| 2121 TRACE_READ_OFFSET(); | 1304 TRACE_READ_OFFSET(); |
| 2122 VariableScope<ReaderHelper> parameters(reader->helper()); | 1305 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 2123 FunctionExpression* expr = new FunctionExpression(); | 1306 FunctionExpression* expr = new FunctionExpression(); |
| 2124 expr->function_ = FunctionNode::ReadFrom(reader); | 1307 expr->function_ = FunctionNode::ReadFrom(reader); |
| 2125 return expr; | 1308 return expr; |
| 2126 } | 1309 } |
| 2127 | 1310 |
| 2128 | 1311 |
| 2129 void FunctionExpression::WriteTo(Writer* writer) { | |
| 2130 TRACE_WRITE_OFFSET(); | |
| 2131 VariableScope<WriterHelper> parameters(writer->helper()); | |
| 2132 writer->WriteTag(kFunctionExpression); | |
| 2133 function_->WriteTo(writer); | |
| 2134 } | |
| 2135 | |
| 2136 | |
| 2137 Let* Let::ReadFrom(Reader* reader) { | 1312 Let* Let::ReadFrom(Reader* reader) { |
| 2138 TRACE_READ_OFFSET(); | 1313 TRACE_READ_OFFSET(); |
| 2139 VariableScope<ReaderHelper> vars(reader->helper()); | 1314 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2140 Let* let = new Let(); | 1315 Let* let = new Let(); |
| 2141 let->variable_ = VariableDeclaration::ReadFromImpl(reader); | 1316 let->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 2142 let->body_ = Expression::ReadFrom(reader); | 1317 let->body_ = Expression::ReadFrom(reader); |
| 2143 return let; | 1318 return let; |
| 2144 } | 1319 } |
| 2145 | 1320 |
| 2146 | 1321 |
| 2147 void Let::WriteTo(Writer* writer) { | |
| 2148 TRACE_WRITE_OFFSET(); | |
| 2149 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2150 writer->WriteTag(kLet); | |
| 2151 variable_->WriteToImpl(writer); | |
| 2152 body_->WriteTo(writer); | |
| 2153 } | |
| 2154 | |
| 2155 | |
| 2156 Statement* Statement::ReadFrom(Reader* reader) { | 1322 Statement* Statement::ReadFrom(Reader* reader) { |
| 2157 TRACE_READ_OFFSET(); | 1323 TRACE_READ_OFFSET(); |
| 2158 Tag tag = reader->ReadTag(); | 1324 Tag tag = reader->ReadTag(); |
| 2159 switch (tag) { | 1325 switch (tag) { |
| 2160 case kInvalidStatement: | 1326 case kInvalidStatement: |
| 2161 return InvalidStatement::ReadFrom(reader); | 1327 return InvalidStatement::ReadFrom(reader); |
| 2162 case kExpressionStatement: | 1328 case kExpressionStatement: |
| 2163 return ExpressionStatement::ReadFrom(reader); | 1329 return ExpressionStatement::ReadFrom(reader); |
| 2164 case kBlock: | 1330 case kBlock: |
| 2165 return Block::ReadFromImpl(reader); | 1331 return Block::ReadFromImpl(reader); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2205 return NULL; | 1371 return NULL; |
| 2206 } | 1372 } |
| 2207 | 1373 |
| 2208 | 1374 |
| 2209 InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { | 1375 InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { |
| 2210 TRACE_READ_OFFSET(); | 1376 TRACE_READ_OFFSET(); |
| 2211 return new InvalidStatement(); | 1377 return new InvalidStatement(); |
| 2212 } | 1378 } |
| 2213 | 1379 |
| 2214 | 1380 |
| 2215 void InvalidStatement::WriteTo(Writer* writer) { | |
| 2216 TRACE_WRITE_OFFSET(); | |
| 2217 writer->WriteTag(kInvalidStatement); | |
| 2218 } | |
| 2219 | |
| 2220 | |
| 2221 ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { | 1381 ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { |
| 2222 TRACE_READ_OFFSET(); | 1382 TRACE_READ_OFFSET(); |
| 2223 return new ExpressionStatement(Expression::ReadFrom(reader)); | 1383 return new ExpressionStatement(Expression::ReadFrom(reader)); |
| 2224 } | 1384 } |
| 2225 | 1385 |
| 2226 | 1386 |
| 2227 void ExpressionStatement::WriteTo(Writer* writer) { | |
| 2228 TRACE_WRITE_OFFSET(); | |
| 2229 writer->WriteTag(kExpressionStatement); | |
| 2230 expression_->WriteTo(writer); | |
| 2231 } | |
| 2232 | |
| 2233 | |
| 2234 Block* Block::ReadFromImpl(Reader* reader) { | 1387 Block* Block::ReadFromImpl(Reader* reader) { |
| 2235 TRACE_READ_OFFSET(); | 1388 TRACE_READ_OFFSET(); |
| 2236 VariableScope<ReaderHelper> vars(reader->helper()); | 1389 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2237 Block* block = new Block(); | 1390 Block* block = new Block(); |
| 2238 block->statements().ReadFromStatic<Statement>(reader); | 1391 block->statements().ReadFromStatic<Statement>(reader); |
| 2239 return block; | 1392 return block; |
| 2240 } | 1393 } |
| 2241 | 1394 |
| 2242 | 1395 |
| 2243 void Block::WriteTo(Writer* writer) { | |
| 2244 writer->WriteTag(kBlock); | |
| 2245 WriteToImpl(writer); | |
| 2246 } | |
| 2247 | |
| 2248 | |
| 2249 void Block::WriteToImpl(Writer* writer) { | |
| 2250 TRACE_WRITE_OFFSET(); | |
| 2251 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2252 statements_.WriteTo(writer); | |
| 2253 } | |
| 2254 | |
| 2255 | |
| 2256 EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { | 1396 EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { |
| 2257 TRACE_READ_OFFSET(); | 1397 TRACE_READ_OFFSET(); |
| 2258 return new EmptyStatement(); | 1398 return new EmptyStatement(); |
| 2259 } | 1399 } |
| 2260 | 1400 |
| 2261 | 1401 |
| 2262 void EmptyStatement::WriteTo(Writer* writer) { | |
| 2263 TRACE_WRITE_OFFSET(); | |
| 2264 writer->WriteTag(kEmptyStatement); | |
| 2265 } | |
| 2266 | |
| 2267 | |
| 2268 AssertStatement* AssertStatement::ReadFrom(Reader* reader) { | 1402 AssertStatement* AssertStatement::ReadFrom(Reader* reader) { |
| 2269 TRACE_READ_OFFSET(); | 1403 TRACE_READ_OFFSET(); |
| 2270 AssertStatement* stmt = new AssertStatement(); | 1404 AssertStatement* stmt = new AssertStatement(); |
| 2271 stmt->condition_ = Expression::ReadFrom(reader); | 1405 stmt->condition_ = Expression::ReadFrom(reader); |
| 2272 stmt->message_ = reader->ReadOptional<Expression>(); | 1406 stmt->message_ = reader->ReadOptional<Expression>(); |
| 2273 return stmt; | 1407 return stmt; |
| 2274 } | 1408 } |
| 2275 | 1409 |
| 2276 | 1410 |
| 2277 void AssertStatement::WriteTo(Writer* writer) { | |
| 2278 TRACE_WRITE_OFFSET(); | |
| 2279 writer->WriteTag(kAssertStatement); | |
| 2280 condition_->WriteTo(writer); | |
| 2281 writer->WriteOptional<Expression>(message_); | |
| 2282 } | |
| 2283 | |
| 2284 | |
| 2285 LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { | 1411 LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { |
| 2286 TRACE_READ_OFFSET(); | 1412 TRACE_READ_OFFSET(); |
| 2287 LabeledStatement* stmt = new LabeledStatement(); | 1413 LabeledStatement* stmt = new LabeledStatement(); |
| 2288 reader->helper()->labels()->Push(stmt); | 1414 reader->helper()->labels()->Push(stmt); |
| 2289 stmt->body_ = Statement::ReadFrom(reader); | 1415 stmt->body_ = Statement::ReadFrom(reader); |
| 2290 reader->helper()->labels()->Pop(stmt); | 1416 reader->helper()->labels()->Pop(stmt); |
| 2291 return stmt; | 1417 return stmt; |
| 2292 } | 1418 } |
| 2293 | 1419 |
| 2294 | 1420 |
| 2295 void LabeledStatement::WriteTo(Writer* writer) { | |
| 2296 TRACE_WRITE_OFFSET(); | |
| 2297 writer->WriteTag(kLabeledStatement); | |
| 2298 writer->helper()->labels()->Push(this); | |
| 2299 body_->WriteTo(writer); | |
| 2300 writer->helper()->labels()->Pop(this); | |
| 2301 } | |
| 2302 | |
| 2303 | |
| 2304 BreakStatement* BreakStatement::ReadFrom(Reader* reader) { | 1421 BreakStatement* BreakStatement::ReadFrom(Reader* reader) { |
| 2305 TRACE_READ_OFFSET(); | 1422 TRACE_READ_OFFSET(); |
| 2306 BreakStatement* stmt = new BreakStatement(); | 1423 BreakStatement* stmt = new BreakStatement(); |
| 2307 stmt->target_ = reader->helper()->labels()->Lookup(reader->ReadUInt()); | 1424 stmt->target_ = reader->helper()->labels()->Lookup(reader->ReadUInt()); |
| 2308 return stmt; | 1425 return stmt; |
| 2309 } | 1426 } |
| 2310 | 1427 |
| 2311 | 1428 |
| 2312 void BreakStatement::WriteTo(Writer* writer) { | |
| 2313 TRACE_WRITE_OFFSET(); | |
| 2314 writer->WriteTag(kBreakStatement); | |
| 2315 writer->WriteUInt(writer->helper()->labels()->Lookup(target_)); | |
| 2316 } | |
| 2317 | |
| 2318 | |
| 2319 WhileStatement* WhileStatement::ReadFrom(Reader* reader) { | 1429 WhileStatement* WhileStatement::ReadFrom(Reader* reader) { |
| 2320 TRACE_READ_OFFSET(); | 1430 TRACE_READ_OFFSET(); |
| 2321 WhileStatement* stmt = new WhileStatement(); | 1431 WhileStatement* stmt = new WhileStatement(); |
| 2322 stmt->condition_ = Expression::ReadFrom(reader); | 1432 stmt->condition_ = Expression::ReadFrom(reader); |
| 2323 stmt->body_ = Statement::ReadFrom(reader); | 1433 stmt->body_ = Statement::ReadFrom(reader); |
| 2324 return stmt; | 1434 return stmt; |
| 2325 } | 1435 } |
| 2326 | 1436 |
| 2327 | 1437 |
| 2328 void WhileStatement::WriteTo(Writer* writer) { | |
| 2329 TRACE_WRITE_OFFSET(); | |
| 2330 writer->WriteTag(kWhileStatement); | |
| 2331 condition_->WriteTo(writer); | |
| 2332 body_->WriteTo(writer); | |
| 2333 } | |
| 2334 | |
| 2335 | |
| 2336 DoStatement* DoStatement::ReadFrom(Reader* reader) { | 1438 DoStatement* DoStatement::ReadFrom(Reader* reader) { |
| 2337 TRACE_READ_OFFSET(); | 1439 TRACE_READ_OFFSET(); |
| 2338 DoStatement* dostmt = new DoStatement(); | 1440 DoStatement* dostmt = new DoStatement(); |
| 2339 dostmt->body_ = Statement::ReadFrom(reader); | 1441 dostmt->body_ = Statement::ReadFrom(reader); |
| 2340 dostmt->condition_ = Expression::ReadFrom(reader); | 1442 dostmt->condition_ = Expression::ReadFrom(reader); |
| 2341 return dostmt; | 1443 return dostmt; |
| 2342 } | 1444 } |
| 2343 | 1445 |
| 2344 | 1446 |
| 2345 void DoStatement::WriteTo(Writer* writer) { | |
| 2346 TRACE_WRITE_OFFSET(); | |
| 2347 writer->WriteTag(kDoStatement); | |
| 2348 body_->WriteTo(writer); | |
| 2349 condition_->WriteTo(writer); | |
| 2350 } | |
| 2351 | |
| 2352 | |
| 2353 ForStatement* ForStatement::ReadFrom(Reader* reader) { | 1447 ForStatement* ForStatement::ReadFrom(Reader* reader) { |
| 2354 TRACE_READ_OFFSET(); | 1448 TRACE_READ_OFFSET(); |
| 2355 VariableScope<ReaderHelper> vars(reader->helper()); | 1449 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2356 ForStatement* forstmt = new ForStatement(); | 1450 ForStatement* forstmt = new ForStatement(); |
| 2357 forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader); | 1451 forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader); |
| 2358 forstmt->condition_ = reader->ReadOptional<Expression>(); | 1452 forstmt->condition_ = reader->ReadOptional<Expression>(); |
| 2359 forstmt->updates_.ReadFromStatic<Expression>(reader); | 1453 forstmt->updates_.ReadFromStatic<Expression>(reader); |
| 2360 forstmt->body_ = Statement::ReadFrom(reader); | 1454 forstmt->body_ = Statement::ReadFrom(reader); |
| 2361 return forstmt; | 1455 return forstmt; |
| 2362 } | 1456 } |
| 2363 | 1457 |
| 2364 | 1458 |
| 2365 void ForStatement::WriteTo(Writer* writer) { | |
| 2366 TRACE_WRITE_OFFSET(); | |
| 2367 writer->WriteTag(kForStatement); | |
| 2368 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2369 variables_.WriteToStatic<VariableDeclarationImpl>(writer); | |
| 2370 writer->WriteOptional<Expression>(condition_); | |
| 2371 updates_.WriteTo(writer); | |
| 2372 body_->WriteTo(writer); | |
| 2373 } | |
| 2374 | |
| 2375 | |
| 2376 ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { | 1459 ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { |
| 2377 TRACE_READ_OFFSET(); | 1460 TRACE_READ_OFFSET(); |
| 2378 VariableScope<ReaderHelper> vars(reader->helper()); | 1461 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2379 ForInStatement* forinstmt = new ForInStatement(); | 1462 ForInStatement* forinstmt = new ForInStatement(); |
| 2380 forinstmt->is_async_ = is_async; | 1463 forinstmt->is_async_ = is_async; |
| 2381 forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader); | 1464 forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 2382 forinstmt->iterable_ = Expression::ReadFrom(reader); | 1465 forinstmt->iterable_ = Expression::ReadFrom(reader); |
| 2383 forinstmt->body_ = Statement::ReadFrom(reader); | 1466 forinstmt->body_ = Statement::ReadFrom(reader); |
| 2384 return forinstmt; | 1467 return forinstmt; |
| 2385 } | 1468 } |
| 2386 | 1469 |
| 2387 | 1470 |
| 2388 void ForInStatement::WriteTo(Writer* writer) { | |
| 2389 TRACE_WRITE_OFFSET(); | |
| 2390 writer->WriteTag(is_async_ ? kAsyncForInStatement : kForInStatement); | |
| 2391 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2392 variable_->WriteToImpl(writer); | |
| 2393 iterable_->WriteTo(writer); | |
| 2394 body_->WriteTo(writer); | |
| 2395 } | |
| 2396 | |
| 2397 | |
| 2398 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { | 1471 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { |
| 2399 TRACE_READ_OFFSET(); | 1472 TRACE_READ_OFFSET(); |
| 2400 SwitchCaseScope<ReaderHelper> scope(reader->helper()); | 1473 SwitchCaseScope<ReaderHelper> scope(reader->helper()); |
| 2401 SwitchStatement* stmt = new SwitchStatement(); | 1474 SwitchStatement* stmt = new SwitchStatement(); |
| 2402 stmt->condition_ = Expression::ReadFrom(reader); | 1475 stmt->condition_ = Expression::ReadFrom(reader); |
| 2403 // We need to explicitly create empty [SwitchCase]s first in order to add them | 1476 // We need to explicitly create empty [SwitchCase]s first in order to add them |
| 2404 // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch | 1477 // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch |
| 2405 // case can refer to one defined later on. | 1478 // case can refer to one defined later on. |
| 2406 int count = reader->ReadUInt(); | 1479 int count = reader->ReadUInt(); |
| 2407 for (int i = 0; i < count; i++) { | 1480 for (int i = 0; i < count; i++) { |
| 2408 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); | 1481 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); |
| 2409 reader->helper()->switch_cases().Push(sc); | 1482 reader->helper()->switch_cases().Push(sc); |
| 2410 } | 1483 } |
| 2411 for (int i = 0; i < count; i++) { | 1484 for (int i = 0; i < count; i++) { |
| 2412 SwitchCase* sc = stmt->cases_[i]; | 1485 SwitchCase* sc = stmt->cases_[i]; |
| 2413 sc->ReadFrom(reader); | 1486 sc->ReadFrom(reader); |
| 2414 } | 1487 } |
| 2415 return stmt; | 1488 return stmt; |
| 2416 } | 1489 } |
| 2417 | 1490 |
| 2418 | 1491 |
| 2419 void SwitchStatement::WriteTo(Writer* writer) { | |
| 2420 TRACE_WRITE_OFFSET(); | |
| 2421 SwitchCaseScope<WriterHelper> scope(writer->helper()); | |
| 2422 writer->WriteTag(kSwitchStatement); | |
| 2423 condition_->WriteTo(writer); | |
| 2424 for (int i = 0; i < cases_.length(); i++) { | |
| 2425 writer->helper()->switch_cases().Push(cases_[i]); | |
| 2426 } | |
| 2427 cases_.WriteTo(writer); | |
| 2428 } | |
| 2429 | |
| 2430 | |
| 2431 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { | 1492 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { |
| 2432 TRACE_READ_OFFSET(); | 1493 TRACE_READ_OFFSET(); |
| 2433 expressions_.ReadFromStatic<Expression>(reader); | 1494 expressions_.ReadFromStatic<Expression>(reader); |
| 2434 is_default_ = reader->ReadBool(); | 1495 is_default_ = reader->ReadBool(); |
| 2435 body_ = Statement::ReadFrom(reader); | 1496 body_ = Statement::ReadFrom(reader); |
| 2436 return this; | 1497 return this; |
| 2437 } | 1498 } |
| 2438 | 1499 |
| 2439 | 1500 |
| 2440 void SwitchCase::WriteTo(Writer* writer) { | |
| 2441 TRACE_WRITE_OFFSET(); | |
| 2442 expressions_.WriteTo(writer); | |
| 2443 writer->WriteBool(is_default_); | |
| 2444 body_->WriteTo(writer); | |
| 2445 } | |
| 2446 | |
| 2447 | |
| 2448 ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { | 1501 ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { |
| 2449 TRACE_READ_OFFSET(); | 1502 TRACE_READ_OFFSET(); |
| 2450 ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); | 1503 ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); |
| 2451 stmt->target_ = reader->helper()->switch_cases().Lookup(reader->ReadUInt()); | 1504 stmt->target_ = reader->helper()->switch_cases().Lookup(reader->ReadUInt()); |
| 2452 return stmt; | 1505 return stmt; |
| 2453 } | 1506 } |
| 2454 | 1507 |
| 2455 | 1508 |
| 2456 void ContinueSwitchStatement::WriteTo(Writer* writer) { | |
| 2457 TRACE_WRITE_OFFSET(); | |
| 2458 writer->WriteTag(kContinueSwitchStatement); | |
| 2459 writer->WriteUInt(writer->helper()->switch_cases().Lookup(target_)); | |
| 2460 } | |
| 2461 | |
| 2462 | |
| 2463 IfStatement* IfStatement::ReadFrom(Reader* reader) { | 1509 IfStatement* IfStatement::ReadFrom(Reader* reader) { |
| 2464 TRACE_READ_OFFSET(); | 1510 TRACE_READ_OFFSET(); |
| 2465 IfStatement* ifstmt = new IfStatement(); | 1511 IfStatement* ifstmt = new IfStatement(); |
| 2466 ifstmt->condition_ = Expression::ReadFrom(reader); | 1512 ifstmt->condition_ = Expression::ReadFrom(reader); |
| 2467 ifstmt->then_ = Statement::ReadFrom(reader); | 1513 ifstmt->then_ = Statement::ReadFrom(reader); |
| 2468 ifstmt->otherwise_ = Statement::ReadFrom(reader); | 1514 ifstmt->otherwise_ = Statement::ReadFrom(reader); |
| 2469 return ifstmt; | 1515 return ifstmt; |
| 2470 } | 1516 } |
| 2471 | 1517 |
| 2472 | 1518 |
| 2473 void IfStatement::WriteTo(Writer* writer) { | |
| 2474 TRACE_WRITE_OFFSET(); | |
| 2475 writer->WriteTag(kIfStatement); | |
| 2476 condition_->WriteTo(writer); | |
| 2477 then_->WriteTo(writer); | |
| 2478 otherwise_->WriteTo(writer); | |
| 2479 } | |
| 2480 | |
| 2481 | |
| 2482 ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { | 1519 ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { |
| 2483 TRACE_READ_OFFSET(); | 1520 TRACE_READ_OFFSET(); |
| 2484 ReturnStatement* ret = new ReturnStatement(); | 1521 ReturnStatement* ret = new ReturnStatement(); |
| 2485 ret->position_ = reader->ReadPosition(); | 1522 ret->position_ = reader->ReadPosition(); |
| 2486 ret->expression_ = reader->ReadOptional<Expression>(); | 1523 ret->expression_ = reader->ReadOptional<Expression>(); |
| 2487 return ret; | 1524 return ret; |
| 2488 } | 1525 } |
| 2489 | 1526 |
| 2490 | 1527 |
| 2491 void ReturnStatement::WriteTo(Writer* writer) { | |
| 2492 TRACE_WRITE_OFFSET(); | |
| 2493 writer->WriteTag(kReturnStatement); | |
| 2494 writer->WritePosition(position_); | |
| 2495 writer->WriteOptional<Expression>(expression_); | |
| 2496 } | |
| 2497 | |
| 2498 | |
| 2499 TryCatch* TryCatch::ReadFrom(Reader* reader) { | 1528 TryCatch* TryCatch::ReadFrom(Reader* reader) { |
| 2500 TRACE_READ_OFFSET(); | 1529 TRACE_READ_OFFSET(); |
| 2501 TryCatch* tc = new TryCatch(); | 1530 TryCatch* tc = new TryCatch(); |
| 2502 tc->body_ = Statement::ReadFrom(reader); | 1531 tc->body_ = Statement::ReadFrom(reader); |
| 2503 tc->catches_.ReadFromStatic<Catch>(reader); | 1532 tc->catches_.ReadFromStatic<Catch>(reader); |
| 2504 return tc; | 1533 return tc; |
| 2505 } | 1534 } |
| 2506 | 1535 |
| 2507 | 1536 |
| 2508 void TryCatch::WriteTo(Writer* writer) { | |
| 2509 TRACE_WRITE_OFFSET(); | |
| 2510 writer->WriteTag(kTryCatch); | |
| 2511 body_->WriteTo(writer); | |
| 2512 catches_.WriteTo(writer); | |
| 2513 } | |
| 2514 | |
| 2515 | |
| 2516 Catch* Catch::ReadFrom(Reader* reader) { | 1537 Catch* Catch::ReadFrom(Reader* reader) { |
| 2517 TRACE_READ_OFFSET(); | 1538 TRACE_READ_OFFSET(); |
| 2518 VariableScope<ReaderHelper> vars(reader->helper()); | 1539 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2519 Catch* c = new Catch(); | 1540 Catch* c = new Catch(); |
| 2520 c->guard_ = DartType::ReadFrom(reader); | 1541 c->guard_ = DartType::ReadFrom(reader); |
| 2521 c->exception_ = | 1542 c->exception_ = |
| 2522 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); | 1543 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); |
| 2523 c->stack_trace_ = | 1544 c->stack_trace_ = |
| 2524 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); | 1545 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); |
| 2525 c->body_ = Statement::ReadFrom(reader); | 1546 c->body_ = Statement::ReadFrom(reader); |
| 2526 return c; | 1547 return c; |
| 2527 } | 1548 } |
| 2528 | 1549 |
| 2529 | 1550 |
| 2530 void Catch::WriteTo(Writer* writer) { | |
| 2531 TRACE_WRITE_OFFSET(); | |
| 2532 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2533 guard_->WriteTo(writer); | |
| 2534 writer->WriteOptionalStatic<VariableDeclaration, VariableDeclarationImpl>( | |
| 2535 exception_); | |
| 2536 writer->WriteOptionalStatic<VariableDeclaration, VariableDeclarationImpl>( | |
| 2537 stack_trace_); | |
| 2538 body_->WriteTo(writer); | |
| 2539 } | |
| 2540 | |
| 2541 | |
| 2542 TryFinally* TryFinally::ReadFrom(Reader* reader) { | 1551 TryFinally* TryFinally::ReadFrom(Reader* reader) { |
| 2543 TRACE_READ_OFFSET(); | 1552 TRACE_READ_OFFSET(); |
| 2544 TryFinally* tf = new TryFinally(); | 1553 TryFinally* tf = new TryFinally(); |
| 2545 tf->body_ = Statement::ReadFrom(reader); | 1554 tf->body_ = Statement::ReadFrom(reader); |
| 2546 tf->finalizer_ = Statement::ReadFrom(reader); | 1555 tf->finalizer_ = Statement::ReadFrom(reader); |
| 2547 return tf; | 1556 return tf; |
| 2548 } | 1557 } |
| 2549 | 1558 |
| 2550 | 1559 |
| 2551 void TryFinally::WriteTo(Writer* writer) { | |
| 2552 TRACE_WRITE_OFFSET(); | |
| 2553 writer->WriteTag(kTryFinally); | |
| 2554 body_->WriteTo(writer); | |
| 2555 finalizer_->WriteTo(writer); | |
| 2556 } | |
| 2557 | |
| 2558 | |
| 2559 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { | 1560 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { |
| 2560 TRACE_READ_OFFSET(); | 1561 TRACE_READ_OFFSET(); |
| 2561 YieldStatement* stmt = new YieldStatement(); | 1562 YieldStatement* stmt = new YieldStatement(); |
| 2562 stmt->position_ = reader->ReadPosition(); | 1563 stmt->position_ = reader->ReadPosition(); |
| 2563 stmt->flags_ = reader->ReadByte(); | 1564 stmt->flags_ = reader->ReadByte(); |
| 2564 stmt->expression_ = Expression::ReadFrom(reader); | 1565 stmt->expression_ = Expression::ReadFrom(reader); |
| 2565 return stmt; | 1566 return stmt; |
| 2566 } | 1567 } |
| 2567 | 1568 |
| 2568 | 1569 |
| 2569 void YieldStatement::WriteTo(Writer* writer) { | |
| 2570 TRACE_WRITE_OFFSET(); | |
| 2571 writer->WriteTag(kYieldStatement); | |
| 2572 writer->WritePosition(position_); | |
| 2573 writer->WriteByte(flags_); | |
| 2574 expression_->WriteTo(writer); | |
| 2575 } | |
| 2576 | |
| 2577 | |
| 2578 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { | 1570 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { |
| 2579 TRACE_READ_OFFSET(); | 1571 TRACE_READ_OFFSET(); |
| 2580 Tag tag = reader->ReadTag(); | 1572 Tag tag = reader->ReadTag(); |
| 2581 ASSERT(tag == kVariableDeclaration); | 1573 ASSERT(tag == kVariableDeclaration); |
| 2582 return VariableDeclaration::ReadFromImpl(reader); | 1574 return VariableDeclaration::ReadFromImpl(reader); |
| 2583 } | 1575 } |
| 2584 | 1576 |
| 2585 | 1577 |
| 2586 VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader) { | 1578 VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader) { |
| 2587 TRACE_READ_OFFSET(); | 1579 TRACE_READ_OFFSET(); |
| 2588 VariableDeclaration* decl = new VariableDeclaration(); | 1580 VariableDeclaration* decl = new VariableDeclaration(); |
| 2589 decl->position_ = reader->ReadPosition(); | 1581 decl->position_ = reader->ReadPosition(); |
| 2590 decl->flags_ = reader->ReadFlags(); | 1582 decl->flags_ = reader->ReadFlags(); |
| 2591 decl->name_ = Reference::ReadStringFrom(reader); | 1583 decl->name_ = Reference::ReadStringFrom(reader); |
| 2592 decl->type_ = DartType::ReadFrom(reader); | 1584 decl->type_ = DartType::ReadFrom(reader); |
| 2593 decl->inferred_value_ = reader->ReadOptional<InferredValue>(); | 1585 decl->inferred_value_ = reader->ReadOptional<InferredValue>(); |
| 2594 decl->initializer_ = reader->ReadOptional<Expression>(); | 1586 decl->initializer_ = reader->ReadOptional<Expression>(); |
| 2595 reader->helper()->variables().Push(decl); | 1587 reader->helper()->variables().Push(decl); |
| 2596 return decl; | 1588 return decl; |
| 2597 } | 1589 } |
| 2598 | 1590 |
| 2599 | 1591 |
| 2600 void VariableDeclaration::WriteTo(Writer* writer) { | |
| 2601 TRACE_WRITE_OFFSET(); | |
| 2602 writer->WriteTag(kVariableDeclaration); | |
| 2603 WriteToImpl(writer); | |
| 2604 } | |
| 2605 | |
| 2606 | |
| 2607 void VariableDeclaration::WriteToImpl(Writer* writer) { | |
| 2608 TRACE_WRITE_OFFSET(); | |
| 2609 writer->WritePosition(position_); | |
| 2610 writer->WriteFlags(flags_); | |
| 2611 name_->WriteTo(writer); | |
| 2612 type_->WriteTo(writer); | |
| 2613 writer->WriteOptional<InferredValue>(inferred_value_); | |
| 2614 writer->WriteOptional<Expression>(initializer_); | |
| 2615 writer->helper()->variables().Push(this); | |
| 2616 } | |
| 2617 | |
| 2618 | |
| 2619 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { | 1592 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { |
| 2620 TRACE_READ_OFFSET(); | 1593 TRACE_READ_OFFSET(); |
| 2621 FunctionDeclaration* decl = new FunctionDeclaration(); | 1594 FunctionDeclaration* decl = new FunctionDeclaration(); |
| 2622 decl->position_ = reader->ReadPosition(); | 1595 decl->position_ = reader->ReadPosition(); |
| 2623 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); | 1596 decl->variable_ = VariableDeclaration::ReadFromImpl(reader); |
| 2624 VariableScope<ReaderHelper> parameters(reader->helper()); | 1597 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 2625 decl->function_ = FunctionNode::ReadFrom(reader); | 1598 decl->function_ = FunctionNode::ReadFrom(reader); |
| 2626 return decl; | 1599 return decl; |
| 2627 } | 1600 } |
| 2628 | 1601 |
| 2629 | 1602 |
| 2630 void FunctionDeclaration::WriteTo(Writer* writer) { | |
| 2631 TRACE_WRITE_OFFSET(); | |
| 2632 writer->WriteTag(kFunctionDeclaration); | |
| 2633 writer->WritePosition(position_); | |
| 2634 variable_->WriteToImpl(writer); | |
| 2635 VariableScope<WriterHelper> parameters(writer->helper()); | |
| 2636 function_->WriteTo(writer); | |
| 2637 } | |
| 2638 | |
| 2639 | |
| 2640 Name* Name::ReadFrom(Reader* reader) { | 1603 Name* Name::ReadFrom(Reader* reader) { |
| 2641 String* string = Reference::ReadStringFrom(reader); | 1604 String* string = Reference::ReadStringFrom(reader); |
| 2642 if (string->size() >= 1 && string->buffer()[0] == '_') { | 1605 if (string->size() >= 1 && string->buffer()[0] == '_') { |
| 2643 int lib_index = reader->ReadUInt(); | 1606 int lib_index = reader->ReadUInt(); |
| 2644 Library* library = | 1607 Library* library = |
| 2645 reader->helper()->program()->libraries().GetOrCreate<Library>( | 1608 reader->helper()->program()->libraries().GetOrCreate<Library>( |
| 2646 lib_index); | 1609 lib_index); |
| 2647 return new Name(string, library); | 1610 return new Name(string, library); |
| 2648 } else { | 1611 } else { |
| 2649 return new Name(string, NULL); | 1612 return new Name(string, NULL); |
| 2650 } | 1613 } |
| 2651 } | 1614 } |
| 2652 | 1615 |
| 2653 | 1616 |
| 2654 void Name::WriteTo(Writer* writer) { | |
| 2655 TRACE_WRITE_OFFSET(); | |
| 2656 string_->WriteTo(writer); | |
| 2657 Library* library = library_; | |
| 2658 bool is_private = library != NULL; | |
| 2659 if (is_private) { | |
| 2660 writer->WriteUInt(writer->helper()->libraries().Lookup(library_)); | |
| 2661 } | |
| 2662 } | |
| 2663 | |
| 2664 | |
| 2665 InferredValue* InferredValue::ReadFrom(Reader* reader) { | 1617 InferredValue* InferredValue::ReadFrom(Reader* reader) { |
| 2666 InferredValue* type = new InferredValue(); | 1618 InferredValue* type = new InferredValue(); |
| 2667 type->klass_ = Reference::ReadClassFrom(reader, true); | 1619 type->klass_ = Reference::ReadClassFrom(reader, true); |
| 2668 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); | 1620 type->kind_ = static_cast<BaseClassKind>(reader->ReadByte()); |
| 2669 type->value_bits_ = reader->ReadByte(); | 1621 type->value_bits_ = reader->ReadByte(); |
| 2670 return type; | 1622 return type; |
| 2671 } | 1623 } |
| 2672 | 1624 |
| 2673 | 1625 |
| 2674 void InferredValue::WriteTo(Writer* writer) { | |
| 2675 Reference::WriteClassTo(writer, klass_, true); | |
| 2676 writer->WriteByte(static_cast<uint8_t>(kind_)); | |
| 2677 writer->WriteByte(value_bits_); | |
| 2678 } | |
| 2679 | |
| 2680 | |
| 2681 DartType* DartType::ReadFrom(Reader* reader) { | 1626 DartType* DartType::ReadFrom(Reader* reader) { |
| 2682 TRACE_READ_OFFSET(); | 1627 TRACE_READ_OFFSET(); |
| 2683 Tag tag = reader->ReadTag(); | 1628 Tag tag = reader->ReadTag(); |
| 2684 switch (tag) { | 1629 switch (tag) { |
| 2685 case kInvalidType: | 1630 case kInvalidType: |
| 2686 return InvalidType::ReadFrom(reader); | 1631 return InvalidType::ReadFrom(reader); |
| 2687 case kDynamicType: | 1632 case kDynamicType: |
| 2688 return DynamicType::ReadFrom(reader); | 1633 return DynamicType::ReadFrom(reader); |
| 2689 case kVoidType: | 1634 case kVoidType: |
| 2690 return VoidType::ReadFrom(reader); | 1635 return VoidType::ReadFrom(reader); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2705 return NULL; | 1650 return NULL; |
| 2706 } | 1651 } |
| 2707 | 1652 |
| 2708 | 1653 |
| 2709 InvalidType* InvalidType::ReadFrom(Reader* reader) { | 1654 InvalidType* InvalidType::ReadFrom(Reader* reader) { |
| 2710 TRACE_READ_OFFSET(); | 1655 TRACE_READ_OFFSET(); |
| 2711 return new InvalidType(); | 1656 return new InvalidType(); |
| 2712 } | 1657 } |
| 2713 | 1658 |
| 2714 | 1659 |
| 2715 void InvalidType::WriteTo(Writer* writer) { | |
| 2716 TRACE_WRITE_OFFSET(); | |
| 2717 writer->WriteTag(kInvalidType); | |
| 2718 } | |
| 2719 | |
| 2720 | |
| 2721 DynamicType* DynamicType::ReadFrom(Reader* reader) { | 1660 DynamicType* DynamicType::ReadFrom(Reader* reader) { |
| 2722 TRACE_READ_OFFSET(); | 1661 TRACE_READ_OFFSET(); |
| 2723 return new DynamicType(); | 1662 return new DynamicType(); |
| 2724 } | 1663 } |
| 2725 | 1664 |
| 2726 | 1665 |
| 2727 void DynamicType::WriteTo(Writer* writer) { | |
| 2728 TRACE_WRITE_OFFSET(); | |
| 2729 writer->WriteTag(kDynamicType); | |
| 2730 } | |
| 2731 | |
| 2732 | |
| 2733 VoidType* VoidType::ReadFrom(Reader* reader) { | 1666 VoidType* VoidType::ReadFrom(Reader* reader) { |
| 2734 TRACE_READ_OFFSET(); | 1667 TRACE_READ_OFFSET(); |
| 2735 return new VoidType(); | 1668 return new VoidType(); |
| 2736 } | 1669 } |
| 2737 | 1670 |
| 2738 | 1671 |
| 2739 void VoidType::WriteTo(Writer* writer) { | |
| 2740 TRACE_WRITE_OFFSET(); | |
| 2741 writer->WriteTag(kVoidType); | |
| 2742 } | |
| 2743 | |
| 2744 | |
| 2745 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { | 1672 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
| 2746 TRACE_READ_OFFSET(); | 1673 TRACE_READ_OFFSET(); |
| 2747 Class* klass = Reference::ReadClassFrom(reader); | 1674 Class* klass = Reference::ReadClassFrom(reader); |
| 2748 InterfaceType* type = new InterfaceType(klass); | 1675 InterfaceType* type = new InterfaceType(klass); |
| 2749 type->type_arguments().ReadFromStatic<DartType>(reader); | 1676 type->type_arguments().ReadFromStatic<DartType>(reader); |
| 2750 return type; | 1677 return type; |
| 2751 } | 1678 } |
| 2752 | 1679 |
| 2753 | 1680 |
| 2754 InterfaceType* InterfaceType::ReadFrom(Reader* reader, | 1681 InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
| 2755 bool _without_type_arguments_) { | 1682 bool _without_type_arguments_) { |
| 2756 TRACE_READ_OFFSET(); | 1683 TRACE_READ_OFFSET(); |
| 2757 Class* klass = Reference::ReadClassFrom(reader); | 1684 Class* klass = Reference::ReadClassFrom(reader); |
| 2758 InterfaceType* type = new InterfaceType(klass); | 1685 InterfaceType* type = new InterfaceType(klass); |
| 2759 ASSERT(_without_type_arguments_); | 1686 ASSERT(_without_type_arguments_); |
| 2760 return type; | 1687 return type; |
| 2761 } | 1688 } |
| 2762 | 1689 |
| 2763 | 1690 |
| 2764 void InterfaceType::WriteTo(Writer* writer) { | |
| 2765 TRACE_WRITE_OFFSET(); | |
| 2766 if (type_arguments_.length() == 0) { | |
| 2767 writer->WriteTag(kSimpleInterfaceType); | |
| 2768 Reference::WriteClassTo(writer, klass_); | |
| 2769 } else { | |
| 2770 writer->WriteTag(kInterfaceType); | |
| 2771 Reference::WriteClassTo(writer, klass_); | |
| 2772 type_arguments_.WriteTo(writer); | |
| 2773 } | |
| 2774 } | |
| 2775 | |
| 2776 | |
| 2777 FunctionType* FunctionType::ReadFrom(Reader* reader) { | 1691 FunctionType* FunctionType::ReadFrom(Reader* reader) { |
| 2778 TRACE_READ_OFFSET(); | 1692 TRACE_READ_OFFSET(); |
| 2779 FunctionType* type = new FunctionType(); | 1693 FunctionType* type = new FunctionType(); |
| 2780 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1694 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 2781 type->type_parameters().ReadFrom(reader); | 1695 type->type_parameters().ReadFrom(reader); |
| 2782 type->required_parameter_count_ = reader->ReadUInt(); | 1696 type->required_parameter_count_ = reader->ReadUInt(); |
| 2783 type->positional_parameters().ReadFromStatic<DartType>(reader); | 1697 type->positional_parameters().ReadFromStatic<DartType>(reader); |
| 2784 type->named_parameters().ReadFromStatic<Tuple<String, DartType> >(reader); | 1698 type->named_parameters().ReadFromStatic<Tuple<String, DartType> >(reader); |
| 2785 type->return_type_ = DartType::ReadFrom(reader); | 1699 type->return_type_ = DartType::ReadFrom(reader); |
| 2786 return type; | 1700 return type; |
| 2787 } | 1701 } |
| 2788 | 1702 |
| 2789 | 1703 |
| 2790 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { | 1704 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { |
| 2791 TRACE_READ_OFFSET(); | 1705 TRACE_READ_OFFSET(); |
| 2792 FunctionType* type = new FunctionType(); | 1706 FunctionType* type = new FunctionType(); |
| 2793 ASSERT(_is_simple_); | 1707 ASSERT(_is_simple_); |
| 2794 type->positional_parameters().ReadFromStatic<DartType>(reader); | 1708 type->positional_parameters().ReadFromStatic<DartType>(reader); |
| 2795 type->required_parameter_count_ = type->positional_parameters().length(); | 1709 type->required_parameter_count_ = type->positional_parameters().length(); |
| 2796 type->return_type_ = DartType::ReadFrom(reader); | 1710 type->return_type_ = DartType::ReadFrom(reader); |
| 2797 return type; | 1711 return type; |
| 2798 } | 1712 } |
| 2799 | 1713 |
| 2800 | 1714 |
| 2801 void FunctionType::WriteTo(Writer* writer) { | |
| 2802 TRACE_WRITE_OFFSET(); | |
| 2803 | |
| 2804 bool is_simple = | |
| 2805 positional_parameters_.length() == required_parameter_count_ && | |
| 2806 type_parameters_.length() == 0 && named_parameters_.length() == 0; | |
| 2807 if (is_simple) { | |
| 2808 writer->WriteTag(kSimpleFunctionType); | |
| 2809 positional_parameters_.WriteTo(writer); | |
| 2810 return_type_->WriteTo(writer); | |
| 2811 } else { | |
| 2812 TypeParameterScope<WriterHelper> scope(writer->helper()); | |
| 2813 writer->WriteTag(kFunctionType); | |
| 2814 type_parameters_.WriteTo(writer); | |
| 2815 writer->WriteUInt(required_parameter_count_); | |
| 2816 positional_parameters_.WriteTo(writer); | |
| 2817 named_parameters_.WriteTo(writer); | |
| 2818 return_type_->WriteTo(writer); | |
| 2819 } | |
| 2820 } | |
| 2821 | |
| 2822 | |
| 2823 TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { | 1715 TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { |
| 2824 TRACE_READ_OFFSET(); | 1716 TRACE_READ_OFFSET(); |
| 2825 TypeParameterType* type = new TypeParameterType(); | 1717 TypeParameterType* type = new TypeParameterType(); |
| 2826 type->parameter_ = | 1718 type->parameter_ = |
| 2827 reader->helper()->type_parameters().Lookup(reader->ReadUInt()); | 1719 reader->helper()->type_parameters().Lookup(reader->ReadUInt()); |
| 2828 return type; | 1720 return type; |
| 2829 } | 1721 } |
| 2830 | 1722 |
| 2831 | 1723 |
| 2832 void TypeParameterType::WriteTo(Writer* writer) { | |
| 2833 TRACE_WRITE_OFFSET(); | |
| 2834 writer->WriteTag(kTypeParameterType); | |
| 2835 writer->WriteUInt(writer->helper()->type_parameters().Lookup(parameter_)); | |
| 2836 } | |
| 2837 | |
| 2838 | |
| 2839 Program* Program::ReadFrom(Reader* reader) { | 1724 Program* Program::ReadFrom(Reader* reader) { |
| 2840 TRACE_READ_OFFSET(); | 1725 TRACE_READ_OFFSET(); |
| 2841 uint32_t magic = reader->ReadUInt32(); | 1726 uint32_t magic = reader->ReadUInt32(); |
| 2842 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); | 1727 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
| 2843 | 1728 |
| 2844 Program* program = new Program(); | 1729 Program* program = new Program(); |
| 2845 reader->helper()->set_program(program); | 1730 reader->helper()->set_program(program); |
| 2846 | 1731 |
| 2847 program->string_table_.ReadFrom(reader); | 1732 program->string_table_.ReadFrom(reader); |
| 2848 program->source_uri_table_.ReadFrom(reader); | 1733 program->source_uri_table_.ReadFrom(reader); |
| 2849 program->source_table_.ReadFrom(reader); | 1734 program->source_table_.ReadFrom(reader); |
| 2850 | 1735 |
| 2851 int libraries = reader->ReadUInt(); | 1736 int libraries = reader->ReadUInt(); |
| 2852 program->libraries().EnsureInitialized(libraries); | 1737 program->libraries().EnsureInitialized(libraries); |
| 2853 for (int i = 0; i < libraries; i++) { | 1738 for (int i = 0; i < libraries; i++) { |
| 2854 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | 1739 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
| 2855 } | 1740 } |
| 2856 | 1741 |
| 2857 program->main_method_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); | 1742 program->main_method_ = Procedure::Cast(Reference::ReadMemberFrom(reader)); |
| 2858 | 1743 |
| 2859 return program; | 1744 return program; |
| 2860 } | 1745 } |
| 2861 | 1746 |
| 2862 | 1747 |
| 2863 void Program::WriteTo(Writer* writer) { | |
| 2864 TRACE_WRITE_OFFSET(); | |
| 2865 | |
| 2866 writer->helper()->SetProgram(this); | |
| 2867 | |
| 2868 writer->WriteUInt32(kMagicProgramFile); | |
| 2869 | |
| 2870 // NOTE: Currently we don't GC strings and we require that all referenced | |
| 2871 // strings in nodes are present in [string_table_]. | |
| 2872 string_table_.WriteTo(writer); | |
| 2873 source_uri_table_.WriteTo(writer); | |
| 2874 source_table_.WriteTo(writer); | |
| 2875 | |
| 2876 libraries_.WriteTo(writer); | |
| 2877 Reference::WriteMemberTo(writer, main_method_); | |
| 2878 } | |
| 2879 | |
| 2880 | |
| 2881 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { | 1748 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
| 2882 TRACE_READ_OFFSET(); | 1749 TRACE_READ_OFFSET(); |
| 2883 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1750 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| 2884 | 1751 |
| 2885 FunctionNode* function = new FunctionNode(); | 1752 FunctionNode* function = new FunctionNode(); |
| 2886 function->position_ = reader->ReadPosition(); | 1753 function->position_ = reader->ReadPosition(); |
| 2887 function->end_position_ = reader->ReadPosition(); | 1754 function->end_position_ = reader->ReadPosition(); |
| 2888 function->async_marker_ = | 1755 function->async_marker_ = |
| 2889 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); | 1756 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); |
| 2890 function->debuggable_ = reader->ReadByte() == 1 ? true : false; | 1757 function->debuggable_ = reader->ReadByte() == 1 ? true : false; |
| 2891 function->type_parameters().ReadFrom(reader); | 1758 function->type_parameters().ReadFrom(reader); |
| 2892 function->required_parameter_count_ = reader->ReadUInt(); | 1759 function->required_parameter_count_ = reader->ReadUInt(); |
| 2893 function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>( | 1760 function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>( |
| 2894 reader); | 1761 reader); |
| 2895 function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader); | 1762 function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader); |
| 2896 function->return_type_ = DartType::ReadFrom(reader); | 1763 function->return_type_ = DartType::ReadFrom(reader); |
| 2897 function->inferred_return_value_ = reader->ReadOptional<InferredValue>(); | 1764 function->inferred_return_value_ = reader->ReadOptional<InferredValue>(); |
| 2898 | 1765 |
| 2899 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( | 1766 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( |
| 2900 reader->helper()); | 1767 reader->helper()); |
| 2901 VariableScope<ReaderHelper> vars(reader->helper()); | 1768 VariableScope<ReaderHelper> vars(reader->helper()); |
| 2902 function->body_ = reader->ReadOptional<Statement>(); | 1769 function->body_ = reader->ReadOptional<Statement>(); |
| 2903 return function; | 1770 return function; |
| 2904 } | 1771 } |
| 2905 | 1772 |
| 2906 | 1773 |
| 2907 void FunctionNode::WriteTo(Writer* writer) { | |
| 2908 TRACE_WRITE_OFFSET(); | |
| 2909 TypeParameterScope<WriterHelper> scope(writer->helper()); | |
| 2910 | |
| 2911 writer->WritePosition(position_); | |
| 2912 writer->WritePosition(end_position_); | |
| 2913 writer->WriteByte(static_cast<uint8_t>(async_marker_)); | |
| 2914 writer->WriteByte(debuggable_ ? 1 : 0); | |
| 2915 type_parameters().WriteTo(writer); | |
| 2916 writer->WriteUInt(required_parameter_count()); | |
| 2917 positional_parameters().WriteToStatic<VariableDeclarationImpl>(writer); | |
| 2918 named_parameters().WriteToStatic<VariableDeclarationImpl>(writer); | |
| 2919 return_type_->WriteTo(writer); | |
| 2920 writer->WriteOptional<InferredValue>(inferred_return_value_); | |
| 2921 | |
| 2922 LabelScope<WriterHelper, BlockMap<LabeledStatement> > labels( | |
| 2923 writer->helper()); | |
| 2924 VariableScope<WriterHelper> vars(writer->helper()); | |
| 2925 writer->WriteOptional<Statement>(body_); | |
| 2926 } | |
| 2927 | |
| 2928 | |
| 2929 TypeParameter* TypeParameter::ReadFrom(Reader* reader) { | 1774 TypeParameter* TypeParameter::ReadFrom(Reader* reader) { |
| 2930 TRACE_READ_OFFSET(); | 1775 TRACE_READ_OFFSET(); |
| 2931 name_ = Reference::ReadStringFrom(reader); | 1776 name_ = Reference::ReadStringFrom(reader); |
| 2932 bound_ = DartType::ReadFrom(reader); | 1777 bound_ = DartType::ReadFrom(reader); |
| 2933 return this; | 1778 return this; |
| 2934 } | 1779 } |
| 2935 | 1780 |
| 2936 | 1781 |
| 2937 void TypeParameter::WriteTo(Writer* writer) { | |
| 2938 TRACE_WRITE_OFFSET(); | |
| 2939 name_->WriteTo(writer); | |
| 2940 bound_->WriteTo(writer); | |
| 2941 } | |
| 2942 | |
| 2943 | |
| 2944 } // namespace kernel | 1782 } // namespace kernel |
| 2945 | 1783 |
| 2946 | 1784 |
| 2947 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1785 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
| 2948 intptr_t buffer_length) { | 1786 intptr_t buffer_length) { |
| 2949 kernel::Reader reader(buffer, buffer_length); | 1787 kernel::Reader reader(buffer, buffer_length); |
| 2950 return kernel::Program::ReadFrom(&reader); | 1788 return kernel::Program::ReadFrom(&reader); |
| 2951 } | 1789 } |
| 2952 | 1790 |
| 2953 | 1791 |
| 2954 void WritePrecompiledKernel(ByteWriter* byte_writer, kernel::Program* program) { | |
| 2955 ASSERT(byte_writer != NULL); | |
| 2956 | |
| 2957 kernel::Writer writer(byte_writer); | |
| 2958 program->WriteTo(&writer); | |
| 2959 } | |
| 2960 | |
| 2961 | |
| 2962 } // namespace dart | 1792 } // namespace dart |
| 2963 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1793 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |