Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: runtime/vm/kernel_binary.cc

Issue 2629123002: Remove (semi-unmaintained) kernel write code (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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)
OLDNEW
« no previous file with comments | « runtime/vm/kernel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698