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

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

Issue 2902313004: CoreJIT snapshots without training. (Closed)
Patch Set: . Created 3 years, 7 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/benchmark_test.cc ('k') | runtime/vm/dart.cc » ('j') | 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 4
5 #include "vm/clustered_snapshot.h" 5 #include "vm/clustered_snapshot.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/bootstrap.h" 8 #include "vm/bootstrap.h"
9 #include "vm/class_finalizer.h" 9 #include "vm/class_finalizer.h"
10 #include "vm/dart.h" 10 #include "vm/dart.h"
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 510
511 void Trace(Serializer* s, RawObject* object) { 511 void Trace(Serializer* s, RawObject* object) {
512 RawFunction* func = Function::RawCast(object); 512 RawFunction* func = Function::RawCast(object);
513 objects_.Add(func); 513 objects_.Add(func);
514 514
515 RawObject** from = func->from(); 515 RawObject** from = func->from();
516 RawObject** to = func->to_snapshot(); 516 RawObject** to = func->to_snapshot();
517 for (RawObject** p = from; p <= to; p++) { 517 for (RawObject** p = from; p <= to; p++) {
518 s->Push(*p); 518 s->Push(*p);
519 } 519 }
520 if (s->kind() == Snapshot::kAppAOT) { 520 if (s->kind() == Snapshot::kFullAOT) {
521 s->Push(func->ptr()->code_); 521 s->Push(func->ptr()->code_);
522 } else if (s->kind() == Snapshot::kAppJIT) { 522 } else if (s->kind() == Snapshot::kFullJIT) {
523 NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_)); 523 NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_));
524 s->Push(func->ptr()->code_); 524 s->Push(func->ptr()->code_);
525 s->Push(func->ptr()->ic_data_array_); 525 s->Push(func->ptr()->ic_data_array_);
526 } 526 }
527 } 527 }
528 528
529 void WriteAlloc(Serializer* s) { 529 void WriteAlloc(Serializer* s) {
530 s->WriteCid(kFunctionCid); 530 s->WriteCid(kFunctionCid);
531 intptr_t count = objects_.length(); 531 intptr_t count = objects_.length();
532 s->Write<int32_t>(count); 532 s->Write<int32_t>(count);
533 for (intptr_t i = 0; i < count; i++) { 533 for (intptr_t i = 0; i < count; i++) {
534 RawFunction* func = objects_[i]; 534 RawFunction* func = objects_[i];
535 s->AssignRef(func); 535 s->AssignRef(func);
536 } 536 }
537 } 537 }
538 538
539 void WriteFill(Serializer* s) { 539 void WriteFill(Serializer* s) {
540 Snapshot::Kind kind = s->kind(); 540 Snapshot::Kind kind = s->kind();
541 intptr_t count = objects_.length(); 541 intptr_t count = objects_.length();
542 for (intptr_t i = 0; i < count; i++) { 542 for (intptr_t i = 0; i < count; i++) {
543 RawFunction* func = objects_[i]; 543 RawFunction* func = objects_[i];
544 RawObject** from = func->from(); 544 RawObject** from = func->from();
545 RawObject** to = func->to_snapshot(); 545 RawObject** to = func->to_snapshot();
546 for (RawObject** p = from; p <= to; p++) { 546 for (RawObject** p = from; p <= to; p++) {
547 s->WriteRef(*p); 547 s->WriteRef(*p);
548 } 548 }
549 if (kind == Snapshot::kAppAOT) { 549 if (kind == Snapshot::kFullAOT) {
550 s->WriteRef(func->ptr()->code_); 550 s->WriteRef(func->ptr()->code_);
551 } else if (s->kind() == Snapshot::kAppJIT) { 551 } else if (s->kind() == Snapshot::kFullJIT) {
552 NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_)); 552 NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_));
553 s->WriteRef(func->ptr()->code_); 553 s->WriteRef(func->ptr()->code_);
554 s->WriteRef(func->ptr()->ic_data_array_); 554 s->WriteRef(func->ptr()->ic_data_array_);
555 } 555 }
556 556
557 #if !defined(DART_PRECOMPILED_RUNTIME) 557 #if !defined(DART_PRECOMPILED_RUNTIME)
558 if (kind != Snapshot::kAppAOT) { 558 if (kind != Snapshot::kFullAOT) {
559 s->WriteTokenPosition(func->ptr()->token_pos_); 559 s->WriteTokenPosition(func->ptr()->token_pos_);
560 s->WriteTokenPosition(func->ptr()->end_token_pos_); 560 s->WriteTokenPosition(func->ptr()->end_token_pos_);
561 } 561 }
562 #endif 562 #endif
563 s->Write<int16_t>(func->ptr()->num_fixed_parameters_); 563 s->Write<int16_t>(func->ptr()->num_fixed_parameters_);
564 s->Write<int16_t>(func->ptr()->num_optional_parameters_); 564 s->Write<int16_t>(func->ptr()->num_optional_parameters_);
565 s->Write<uint32_t>(func->ptr()->kind_tag_); 565 s->Write<uint32_t>(func->ptr()->kind_tag_);
566 if (kind == Snapshot::kAppAOT) { 566 if (kind == Snapshot::kFullAOT) {
567 // Omit fields used to support de/reoptimization. 567 // Omit fields used to support de/reoptimization.
568 } else if (!Snapshot::IncludesCode(kind)) { 568 } else if (!Snapshot::IncludesCode(kind)) {
569 #if !defined(DART_PRECOMPILED_RUNTIME) 569 #if !defined(DART_PRECOMPILED_RUNTIME)
570 bool is_optimized = Code::IsOptimized(func->ptr()->code_); 570 bool is_optimized = Code::IsOptimized(func->ptr()->code_);
571 if (is_optimized) { 571 if (is_optimized) {
572 s->Write<int32_t>(FLAG_optimization_counter_threshold); 572 s->Write<int32_t>(FLAG_optimization_counter_threshold);
573 } else { 573 } else {
574 s->Write<int32_t>(0); 574 s->Write<int32_t>(0);
575 } 575 }
576 #endif 576 #endif
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 Function::InstanceSize(), is_vm_object); 609 Function::InstanceSize(), is_vm_object);
610 RawObject** from = func->from(); 610 RawObject** from = func->from();
611 RawObject** to_snapshot = func->to_snapshot(); 611 RawObject** to_snapshot = func->to_snapshot();
612 RawObject** to = func->to(); 612 RawObject** to = func->to();
613 for (RawObject** p = from; p <= to_snapshot; p++) { 613 for (RawObject** p = from; p <= to_snapshot; p++) {
614 *p = d->ReadRef(); 614 *p = d->ReadRef();
615 } 615 }
616 for (RawObject** p = to_snapshot + 1; p <= to; p++) { 616 for (RawObject** p = to_snapshot + 1; p <= to; p++) {
617 *p = Object::null(); 617 *p = Object::null();
618 } 618 }
619 if (kind == Snapshot::kAppAOT) { 619 if (kind == Snapshot::kFullAOT) {
620 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); 620 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
621 } else if (kind == Snapshot::kAppJIT) { 621 } else if (kind == Snapshot::kFullJIT) {
622 NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ = 622 NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
623 reinterpret_cast<RawCode*>(d->ReadRef())); 623 reinterpret_cast<RawCode*>(d->ReadRef()));
624 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef()); 624 func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
625 func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef()); 625 func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef());
626 } 626 }
627 627
628 #if defined(DEBUG) 628 #if defined(DEBUG)
629 func->ptr()->entry_point_ = 0; 629 func->ptr()->entry_point_ = 0;
630 #endif 630 #endif
631 631
632 #if !defined(DART_PRECOMPILED_RUNTIME) 632 #if !defined(DART_PRECOMPILED_RUNTIME)
633 if (kind != Snapshot::kAppAOT) { 633 if (kind != Snapshot::kFullAOT) {
634 func->ptr()->token_pos_ = d->ReadTokenPosition(); 634 func->ptr()->token_pos_ = d->ReadTokenPosition();
635 func->ptr()->end_token_pos_ = d->ReadTokenPosition(); 635 func->ptr()->end_token_pos_ = d->ReadTokenPosition();
636 } 636 }
637 #endif 637 #endif
638 func->ptr()->num_fixed_parameters_ = d->Read<int16_t>(); 638 func->ptr()->num_fixed_parameters_ = d->Read<int16_t>();
639 func->ptr()->num_optional_parameters_ = d->Read<int16_t>(); 639 func->ptr()->num_optional_parameters_ = d->Read<int16_t>();
640 func->ptr()->kind_tag_ = d->Read<uint32_t>(); 640 func->ptr()->kind_tag_ = d->Read<uint32_t>();
641 if (kind == Snapshot::kAppAOT) { 641 if (kind == Snapshot::kFullAOT) {
642 // Omit fields used to support de/reoptimization. 642 // Omit fields used to support de/reoptimization.
643 } else { 643 } else {
644 #if !defined(DART_PRECOMPILED_RUNTIME) 644 #if !defined(DART_PRECOMPILED_RUNTIME)
645 if (Snapshot::IncludesCode(kind)) { 645 if (Snapshot::IncludesCode(kind)) {
646 func->ptr()->usage_counter_ = 0; 646 func->ptr()->usage_counter_ = 0;
647 } else { 647 } else {
648 func->ptr()->usage_counter_ = d->Read<int32_t>(); 648 func->ptr()->usage_counter_ = d->Read<int32_t>();
649 } 649 }
650 func->ptr()->deoptimization_counter_ = 0; 650 func->ptr()->deoptimization_counter_ = 0;
651 func->ptr()->optimized_instruction_count_ = 0; 651 func->ptr()->optimized_instruction_count_ = 0;
652 func->ptr()->optimized_call_site_count_ = 0; 652 func->ptr()->optimized_call_site_count_ = 0;
653 #endif 653 #endif
654 } 654 }
655 } 655 }
656 } 656 }
657 657
658 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { 658 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
659 NOT_IN_PRODUCT(TimelineDurationScope tds( 659 NOT_IN_PRODUCT(TimelineDurationScope tds(
660 Thread::Current(), Timeline::GetIsolateStream(), "PostLoadFunction")); 660 Thread::Current(), Timeline::GetIsolateStream(), "PostLoadFunction"));
661 661
662 if (kind == Snapshot::kAppAOT) { 662 if (kind == Snapshot::kFullAOT) {
663 Function& func = Function::Handle(zone); 663 Function& func = Function::Handle(zone);
664 for (intptr_t i = start_index_; i < stop_index_; i++) { 664 for (intptr_t i = start_index_; i < stop_index_; i++) {
665 func ^= refs.At(i); 665 func ^= refs.At(i);
666 ASSERT(func.raw()->ptr()->code_->IsCode()); 666 ASSERT(func.raw()->ptr()->code_->IsCode());
667 uword entry_point = func.raw()->ptr()->code_->ptr()->entry_point_; 667 uword entry_point = func.raw()->ptr()->code_->ptr()->entry_point_;
668 ASSERT(entry_point != 0); 668 ASSERT(entry_point != 0);
669 func.raw()->ptr()->entry_point_ = entry_point; 669 func.raw()->ptr()->entry_point_ = entry_point;
670 } 670 }
671 } else if (kind == Snapshot::kAppJIT) { 671 } else if (kind == Snapshot::kFullJIT) {
672 Function& func = Function::Handle(zone); 672 Function& func = Function::Handle(zone);
673 Code& code = Code::Handle(zone); 673 Code& code = Code::Handle(zone);
674 for (intptr_t i = start_index_; i < stop_index_; i++) { 674 for (intptr_t i = start_index_; i < stop_index_; i++) {
675 func ^= refs.At(i); 675 func ^= refs.At(i);
676 code ^= func.CurrentCode(); 676 code ^= func.CurrentCode();
677 if (func.HasCode() && !code.IsDisabled()) { 677 if (func.HasCode() && !code.IsDisabled()) {
678 func.SetInstructions(code); 678 func.SetInstructions(code);
679 func.set_was_compiled(true); 679 func.set_was_compiled(true);
680 } else { 680 } else {
681 func.ClearCode(); 681 func.ClearCode();
(...skipping 16 matching lines...) Expand all
698 #if !defined(DART_PRECOMPILED_RUNTIME) 698 #if !defined(DART_PRECOMPILED_RUNTIME)
699 class ClosureDataSerializationCluster : public SerializationCluster { 699 class ClosureDataSerializationCluster : public SerializationCluster {
700 public: 700 public:
701 ClosureDataSerializationCluster() {} 701 ClosureDataSerializationCluster() {}
702 virtual ~ClosureDataSerializationCluster() {} 702 virtual ~ClosureDataSerializationCluster() {}
703 703
704 void Trace(Serializer* s, RawObject* object) { 704 void Trace(Serializer* s, RawObject* object) {
705 RawClosureData* data = ClosureData::RawCast(object); 705 RawClosureData* data = ClosureData::RawCast(object);
706 objects_.Add(data); 706 objects_.Add(data);
707 707
708 if (s->kind() != Snapshot::kAppAOT) { 708 if (s->kind() != Snapshot::kFullAOT) {
709 s->Push(data->ptr()->context_scope_); 709 s->Push(data->ptr()->context_scope_);
710 } 710 }
711 s->Push(data->ptr()->parent_function_); 711 s->Push(data->ptr()->parent_function_);
712 s->Push(data->ptr()->signature_type_); 712 s->Push(data->ptr()->signature_type_);
713 s->Push(data->ptr()->closure_); 713 s->Push(data->ptr()->closure_);
714 } 714 }
715 715
716 void WriteAlloc(Serializer* s) { 716 void WriteAlloc(Serializer* s) {
717 s->WriteCid(kClosureDataCid); 717 s->WriteCid(kClosureDataCid);
718 intptr_t count = objects_.length(); 718 intptr_t count = objects_.length();
719 s->Write<int32_t>(count); 719 s->Write<int32_t>(count);
720 for (intptr_t i = 0; i < count; i++) { 720 for (intptr_t i = 0; i < count; i++) {
721 RawClosureData* data = objects_[i]; 721 RawClosureData* data = objects_[i];
722 s->AssignRef(data); 722 s->AssignRef(data);
723 } 723 }
724 } 724 }
725 725
726 void WriteFill(Serializer* s) { 726 void WriteFill(Serializer* s) {
727 intptr_t count = objects_.length(); 727 intptr_t count = objects_.length();
728 for (intptr_t i = 0; i < count; i++) { 728 for (intptr_t i = 0; i < count; i++) {
729 RawClosureData* data = objects_[i]; 729 RawClosureData* data = objects_[i];
730 if (s->kind() != Snapshot::kAppAOT) { 730 if (s->kind() != Snapshot::kFullAOT) {
731 s->WriteRef(data->ptr()->context_scope_); 731 s->WriteRef(data->ptr()->context_scope_);
732 } 732 }
733 s->WriteRef(data->ptr()->parent_function_); 733 s->WriteRef(data->ptr()->parent_function_);
734 s->WriteRef(data->ptr()->signature_type_); 734 s->WriteRef(data->ptr()->signature_type_);
735 s->WriteRef(data->ptr()->closure_); 735 s->WriteRef(data->ptr()->closure_);
736 } 736 }
737 } 737 }
738 738
739 private: 739 private:
740 GrowableArray<RawClosureData*> objects_; 740 GrowableArray<RawClosureData*> objects_;
(...skipping 17 matching lines...) Expand all
758 stop_index_ = d->next_index(); 758 stop_index_ = d->next_index();
759 } 759 }
760 760
761 void ReadFill(Deserializer* d) { 761 void ReadFill(Deserializer* d) {
762 bool is_vm_object = d->isolate() == Dart::vm_isolate(); 762 bool is_vm_object = d->isolate() == Dart::vm_isolate();
763 763
764 for (intptr_t id = start_index_; id < stop_index_; id++) { 764 for (intptr_t id = start_index_; id < stop_index_; id++) {
765 RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id)); 765 RawClosureData* data = reinterpret_cast<RawClosureData*>(d->Ref(id));
766 Deserializer::InitializeHeader(data, kClosureDataCid, 766 Deserializer::InitializeHeader(data, kClosureDataCid,
767 ClosureData::InstanceSize(), is_vm_object); 767 ClosureData::InstanceSize(), is_vm_object);
768 if (d->kind() == Snapshot::kAppAOT) { 768 if (d->kind() == Snapshot::kFullAOT) {
769 data->ptr()->context_scope_ = ContextScope::null(); 769 data->ptr()->context_scope_ = ContextScope::null();
770 } else { 770 } else {
771 data->ptr()->context_scope_ = 771 data->ptr()->context_scope_ =
772 static_cast<RawContextScope*>(d->ReadRef()); 772 static_cast<RawContextScope*>(d->ReadRef());
773 } 773 }
774 data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef()); 774 data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef());
775 data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef()); 775 data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef());
776 data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef()); 776 data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef());
777 data->ptr()->hash_ = Object::null(); 777 data->ptr()->hash_ = Object::null();
778 } 778 }
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 RawField* field = Field::RawCast(object); 948 RawField* field = Field::RawCast(object);
949 objects_.Add(field); 949 objects_.Add(field);
950 950
951 Snapshot::Kind kind = s->kind(); 951 Snapshot::Kind kind = s->kind();
952 952
953 s->Push(field->ptr()->name_); 953 s->Push(field->ptr()->name_);
954 s->Push(field->ptr()->owner_); 954 s->Push(field->ptr()->owner_);
955 s->Push(field->ptr()->type_); 955 s->Push(field->ptr()->type_);
956 // Write out the initial static value or field offset. 956 // Write out the initial static value or field offset.
957 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { 957 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) {
958 if (kind == Snapshot::kAppAOT) { 958 if (kind == Snapshot::kFullAOT) {
959 // For precompiled static fields, the value was already reset and 959 // For precompiled static fields, the value was already reset and
960 // initializer_ now contains a Function. 960 // initializer_ now contains a Function.
961 s->Push(field->ptr()->value_.static_value_); 961 s->Push(field->ptr()->value_.static_value_);
962 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { 962 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) {
963 // Do not reset const fields. 963 // Do not reset const fields.
964 s->Push(field->ptr()->value_.static_value_); 964 s->Push(field->ptr()->value_.static_value_);
965 } else { 965 } else {
966 // Otherwise, for static fields we write out the initial static value. 966 // Otherwise, for static fields we write out the initial static value.
967 s->Push(field->ptr()->initializer_.saved_value_); 967 s->Push(field->ptr()->initializer_.saved_value_);
968 } 968 }
969 } else { 969 } else {
970 s->Push(field->ptr()->value_.offset_); 970 s->Push(field->ptr()->value_.offset_);
971 } 971 }
972 // Write out the initializer function or saved initial value. 972 // Write out the initializer function or saved initial value.
973 if (kind == Snapshot::kAppAOT) { 973 if (kind == Snapshot::kFullAOT) {
974 s->Push(field->ptr()->initializer_.precompiled_); 974 s->Push(field->ptr()->initializer_.precompiled_);
975 } else { 975 } else {
976 s->Push(field->ptr()->initializer_.saved_value_); 976 s->Push(field->ptr()->initializer_.saved_value_);
977 } 977 }
978 if (kind != Snapshot::kAppAOT) { 978 if (kind != Snapshot::kFullAOT) {
979 // Write out the guarded list length. 979 // Write out the guarded list length.
980 s->Push(field->ptr()->guarded_list_length_); 980 s->Push(field->ptr()->guarded_list_length_);
981 } 981 }
982 if (kind == Snapshot::kAppJIT) { 982 if (kind == Snapshot::kFullJIT) {
983 s->Push(field->ptr()->dependent_code_); 983 s->Push(field->ptr()->dependent_code_);
984 } 984 }
985 } 985 }
986 986
987 void WriteAlloc(Serializer* s) { 987 void WriteAlloc(Serializer* s) {
988 s->WriteCid(kFieldCid); 988 s->WriteCid(kFieldCid);
989 intptr_t count = objects_.length(); 989 intptr_t count = objects_.length();
990 s->Write<int32_t>(count); 990 s->Write<int32_t>(count);
991 for (intptr_t i = 0; i < count; i++) { 991 for (intptr_t i = 0; i < count; i++) {
992 RawField* field = objects_[i]; 992 RawField* field = objects_[i];
993 s->AssignRef(field); 993 s->AssignRef(field);
994 } 994 }
995 } 995 }
996 996
997 void WriteFill(Serializer* s) { 997 void WriteFill(Serializer* s) {
998 Snapshot::Kind kind = s->kind(); 998 Snapshot::Kind kind = s->kind();
999 intptr_t count = objects_.length(); 999 intptr_t count = objects_.length();
1000 for (intptr_t i = 0; i < count; i++) { 1000 for (intptr_t i = 0; i < count; i++) {
1001 RawField* field = objects_[i]; 1001 RawField* field = objects_[i];
1002 1002
1003 s->WriteRef(field->ptr()->name_); 1003 s->WriteRef(field->ptr()->name_);
1004 s->WriteRef(field->ptr()->owner_); 1004 s->WriteRef(field->ptr()->owner_);
1005 s->WriteRef(field->ptr()->type_); 1005 s->WriteRef(field->ptr()->type_);
1006 // Write out the initial static value or field offset. 1006 // Write out the initial static value or field offset.
1007 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) { 1007 if (Field::StaticBit::decode(field->ptr()->kind_bits_)) {
1008 if (kind == Snapshot::kAppAOT) { 1008 if (kind == Snapshot::kFullAOT) {
1009 // For precompiled static fields, the value was already reset and 1009 // For precompiled static fields, the value was already reset and
1010 // initializer_ now contains a Function. 1010 // initializer_ now contains a Function.
1011 s->WriteRef(field->ptr()->value_.static_value_); 1011 s->WriteRef(field->ptr()->value_.static_value_);
1012 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) { 1012 } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) {
1013 // Do not reset const fields. 1013 // Do not reset const fields.
1014 s->WriteRef(field->ptr()->value_.static_value_); 1014 s->WriteRef(field->ptr()->value_.static_value_);
1015 } else { 1015 } else {
1016 // Otherwise, for static fields we write out the initial static value. 1016 // Otherwise, for static fields we write out the initial static value.
1017 s->WriteRef(field->ptr()->initializer_.saved_value_); 1017 s->WriteRef(field->ptr()->initializer_.saved_value_);
1018 } 1018 }
1019 } else { 1019 } else {
1020 s->WriteRef(field->ptr()->value_.offset_); 1020 s->WriteRef(field->ptr()->value_.offset_);
1021 } 1021 }
1022 // Write out the initializer function or saved initial value. 1022 // Write out the initializer function or saved initial value.
1023 if (kind == Snapshot::kAppAOT) { 1023 if (kind == Snapshot::kFullAOT) {
1024 s->WriteRef(field->ptr()->initializer_.precompiled_); 1024 s->WriteRef(field->ptr()->initializer_.precompiled_);
1025 } else { 1025 } else {
1026 s->WriteRef(field->ptr()->initializer_.saved_value_); 1026 s->WriteRef(field->ptr()->initializer_.saved_value_);
1027 } 1027 }
1028 if (kind != Snapshot::kAppAOT) { 1028 if (kind != Snapshot::kFullAOT) {
1029 // Write out the guarded list length. 1029 // Write out the guarded list length.
1030 s->WriteRef(field->ptr()->guarded_list_length_); 1030 s->WriteRef(field->ptr()->guarded_list_length_);
1031 } 1031 }
1032 if (kind == Snapshot::kAppJIT) { 1032 if (kind == Snapshot::kFullJIT) {
1033 s->WriteRef(field->ptr()->dependent_code_); 1033 s->WriteRef(field->ptr()->dependent_code_);
1034 } 1034 }
1035 1035
1036 if (kind != Snapshot::kAppAOT) { 1036 if (kind != Snapshot::kFullAOT) {
1037 s->WriteTokenPosition(field->ptr()->token_pos_); 1037 s->WriteTokenPosition(field->ptr()->token_pos_);
1038 s->WriteCid(field->ptr()->guarded_cid_); 1038 s->WriteCid(field->ptr()->guarded_cid_);
1039 s->WriteCid(field->ptr()->is_nullable_); 1039 s->WriteCid(field->ptr()->is_nullable_);
1040 } 1040 }
1041 s->Write<uint8_t>(field->ptr()->kind_bits_); 1041 s->Write<uint8_t>(field->ptr()->kind_bits_);
1042 } 1042 }
1043 } 1043 }
1044 1044
1045 private: 1045 private:
1046 GrowableArray<RawField*> objects_; 1046 GrowableArray<RawField*> objects_;
(...skipping 27 matching lines...) Expand all
1074 RawObject** from = field->from(); 1074 RawObject** from = field->from();
1075 RawObject** to_snapshot = field->to_snapshot(kind); 1075 RawObject** to_snapshot = field->to_snapshot(kind);
1076 RawObject** to = field->to(); 1076 RawObject** to = field->to();
1077 for (RawObject** p = from; p <= to_snapshot; p++) { 1077 for (RawObject** p = from; p <= to_snapshot; p++) {
1078 *p = d->ReadRef(); 1078 *p = d->ReadRef();
1079 } 1079 }
1080 for (RawObject** p = to_snapshot + 1; p <= to; p++) { 1080 for (RawObject** p = to_snapshot + 1; p <= to; p++) {
1081 *p = Object::null(); 1081 *p = Object::null();
1082 } 1082 }
1083 1083
1084 if (kind != Snapshot::kAppAOT) { 1084 if (kind != Snapshot::kFullAOT) {
1085 field->ptr()->token_pos_ = d->ReadTokenPosition(); 1085 field->ptr()->token_pos_ = d->ReadTokenPosition();
1086 field->ptr()->guarded_cid_ = d->ReadCid(); 1086 field->ptr()->guarded_cid_ = d->ReadCid();
1087 field->ptr()->is_nullable_ = d->ReadCid(); 1087 field->ptr()->is_nullable_ = d->ReadCid();
1088 } 1088 }
1089 field->ptr()->kind_bits_ = d->Read<uint8_t>(); 1089 field->ptr()->kind_bits_ = d->Read<uint8_t>();
1090 } 1090 }
1091 } 1091 }
1092 1092
1093 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) { 1093 void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
1094 NOT_IN_PRODUCT(TimelineDurationScope tds( 1094 NOT_IN_PRODUCT(TimelineDurationScope tds(
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 }; 1539 };
1540 1540
1541 1541
1542 #if !defined(DART_PRECOMPILED_RUNTIME) 1542 #if !defined(DART_PRECOMPILED_RUNTIME)
1543 class CodeSerializationCluster : public SerializationCluster { 1543 class CodeSerializationCluster : public SerializationCluster {
1544 public: 1544 public:
1545 CodeSerializationCluster() {} 1545 CodeSerializationCluster() {}
1546 virtual ~CodeSerializationCluster() {} 1546 virtual ~CodeSerializationCluster() {}
1547 1547
1548 void Trace(Serializer* s, RawObject* object) { 1548 void Trace(Serializer* s, RawObject* object) {
1549 OS::Print("C");
zra 2017/05/31 17:10:31 leftover debug print?
rmacnak 2017/05/31 19:53:01 Removed.
1549 RawCode* code = Code::RawCast(object); 1550 RawCode* code = Code::RawCast(object);
1550 objects_.Add(code); 1551 objects_.Add(code);
1551 1552
1552 s->Push(code->ptr()->object_pool_); 1553 s->Push(code->ptr()->object_pool_);
1553 s->Push(code->ptr()->owner_); 1554 s->Push(code->ptr()->owner_);
1554 s->Push(code->ptr()->exception_handlers_); 1555 s->Push(code->ptr()->exception_handlers_);
1555 s->Push(code->ptr()->pc_descriptors_); 1556 s->Push(code->ptr()->pc_descriptors_);
1556 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER) 1557 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
1557 s->Push(code->ptr()->catch_entry_.catch_entry_state_maps_); 1558 s->Push(code->ptr()->catch_entry_.catch_entry_state_maps_);
1558 #else 1559 #else
1559 s->Push(code->ptr()->catch_entry_.variables_); 1560 s->Push(code->ptr()->catch_entry_.variables_);
1560 #endif 1561 #endif
1561 s->Push(code->ptr()->stackmaps_); 1562 s->Push(code->ptr()->stackmaps_);
1562 if (!FLAG_dwarf_stack_traces) { 1563 if (!FLAG_dwarf_stack_traces) {
1563 s->Push(code->ptr()->inlined_id_to_function_); 1564 s->Push(code->ptr()->inlined_id_to_function_);
1564 s->Push(code->ptr()->code_source_map_); 1565 s->Push(code->ptr()->code_source_map_);
1565 } 1566 }
1566 if (s->kind() != Snapshot::kAppAOT) { 1567 if (s->kind() != Snapshot::kFullAOT) {
1567 s->Push(code->ptr()->await_token_positions_); 1568 s->Push(code->ptr()->await_token_positions_);
1568 } 1569 }
1569 1570
1570 if (s->kind() == Snapshot::kAppJIT) { 1571 if (s->kind() == Snapshot::kFullJIT) {
1571 s->Push(code->ptr()->deopt_info_array_); 1572 s->Push(code->ptr()->deopt_info_array_);
1572 s->Push(code->ptr()->static_calls_target_table_); 1573 s->Push(code->ptr()->static_calls_target_table_);
1573 NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_)); 1574 NOT_IN_PRODUCT(s->Push(code->ptr()->return_address_metadata_));
1574 } 1575 }
1575 } 1576 }
1576 1577
1577 void WriteAlloc(Serializer* s) { 1578 void WriteAlloc(Serializer* s) {
1578 s->WriteCid(kCodeCid); 1579 s->WriteCid(kCodeCid);
1579 intptr_t count = objects_.length(); 1580 intptr_t count = objects_.length();
1580 s->Write<int32_t>(count); 1581 s->Write<int32_t>(count);
1581 for (intptr_t i = 0; i < count; i++) { 1582 for (intptr_t i = 0; i < count; i++) {
1582 RawCode* code = objects_[i]; 1583 RawCode* code = objects_[i];
1583 s->AssignRef(code); 1584 s->AssignRef(code);
1584 } 1585 }
1585 } 1586 }
1586 1587
1587 void WriteFill(Serializer* s) { 1588 void WriteFill(Serializer* s) {
1588 Snapshot::Kind kind = s->kind(); 1589 Snapshot::Kind kind = s->kind();
1589 intptr_t count = objects_.length(); 1590 intptr_t count = objects_.length();
1590 for (intptr_t i = 0; i < count; i++) { 1591 for (intptr_t i = 0; i < count; i++) {
1591 RawCode* code = objects_[i]; 1592 RawCode* code = objects_[i];
1592 1593
1593 intptr_t pointer_offsets_length = 1594 intptr_t pointer_offsets_length =
1594 Code::PtrOffBits::decode(code->ptr()->state_bits_); 1595 Code::PtrOffBits::decode(code->ptr()->state_bits_);
1595 if (pointer_offsets_length != 0) { 1596 if (pointer_offsets_length != 0) {
1596 FATAL("Cannot serialize code with embedded pointers"); 1597 FATAL("Cannot serialize code with embedded pointers");
1597 } 1598 }
1598 if (kind == Snapshot::kAppAOT) { 1599 if (kind == Snapshot::kFullAOT) {
1599 // No disabled code in precompilation. 1600 // No disabled code in precompilation.
1600 NOT_IN_PRECOMPILED(ASSERT(code->ptr()->instructions_ == 1601 NOT_IN_PRECOMPILED(ASSERT(code->ptr()->instructions_ ==
1601 code->ptr()->active_instructions_)); 1602 code->ptr()->active_instructions_));
1602 } 1603 }
1603 1604
1604 RawInstructions* instr = code->ptr()->instructions_; 1605 RawInstructions* instr = code->ptr()->instructions_;
1605 int32_t text_offset = s->GetTextOffset(instr, code); 1606 int32_t text_offset = s->GetTextOffset(instr, code);
1606 s->Write<int32_t>(text_offset); 1607 s->Write<int32_t>(text_offset);
1607 if (s->kind() == Snapshot::kAppJIT) { 1608 if (s->kind() == Snapshot::kFullJIT) {
1608 // TODO(rmacnak): Fix references to disabled code before serializing. 1609 // TODO(rmacnak): Fix references to disabled code before serializing.
1609 if (code->ptr()->active_instructions_ != code->ptr()->instructions_) { 1610 if (code->ptr()->active_instructions_ != code->ptr()->instructions_) {
1610 instr = code->ptr()->active_instructions_; 1611 instr = code->ptr()->active_instructions_;
1611 text_offset = s->GetTextOffset(instr, code); 1612 text_offset = s->GetTextOffset(instr, code);
1612 } 1613 }
1613 s->Write<int32_t>(text_offset); 1614 s->Write<int32_t>(text_offset);
1614 } 1615 }
1615 1616
1616 s->WriteRef(code->ptr()->object_pool_); 1617 s->WriteRef(code->ptr()->object_pool_);
1617 s->WriteRef(code->ptr()->owner_); 1618 s->WriteRef(code->ptr()->owner_);
1618 s->WriteRef(code->ptr()->exception_handlers_); 1619 s->WriteRef(code->ptr()->exception_handlers_);
1619 s->WriteRef(code->ptr()->pc_descriptors_); 1620 s->WriteRef(code->ptr()->pc_descriptors_);
1620 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER) 1621 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
1621 s->WriteRef(code->ptr()->catch_entry_.catch_entry_state_maps_); 1622 s->WriteRef(code->ptr()->catch_entry_.catch_entry_state_maps_);
1622 #else 1623 #else
1623 s->WriteRef(code->ptr()->catch_entry_.variables_); 1624 s->WriteRef(code->ptr()->catch_entry_.variables_);
1624 #endif 1625 #endif
1625 s->WriteRef(code->ptr()->stackmaps_); 1626 s->WriteRef(code->ptr()->stackmaps_);
1626 if (FLAG_dwarf_stack_traces) { 1627 if (FLAG_dwarf_stack_traces) {
1627 s->WriteRef(Array::null()); 1628 s->WriteRef(Array::null());
1628 s->WriteRef(CodeSourceMap::null()); 1629 s->WriteRef(CodeSourceMap::null());
1629 } else { 1630 } else {
1630 s->WriteRef(code->ptr()->inlined_id_to_function_); 1631 s->WriteRef(code->ptr()->inlined_id_to_function_);
1631 s->WriteRef(code->ptr()->code_source_map_); 1632 s->WriteRef(code->ptr()->code_source_map_);
1632 } 1633 }
1633 if (s->kind() != Snapshot::kAppAOT) { 1634 if (s->kind() != Snapshot::kFullAOT) {
1634 s->WriteRef(code->ptr()->await_token_positions_); 1635 s->WriteRef(code->ptr()->await_token_positions_);
1635 } 1636 }
1636 if (s->kind() == Snapshot::kAppJIT) { 1637 if (s->kind() == Snapshot::kFullJIT) {
1637 s->WriteRef(code->ptr()->deopt_info_array_); 1638 s->WriteRef(code->ptr()->deopt_info_array_);
1638 s->WriteRef(code->ptr()->static_calls_target_table_); 1639 s->WriteRef(code->ptr()->static_calls_target_table_);
1639 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_)); 1640 NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_));
1640 } 1641 }
1641 1642
1642 s->Write<int32_t>(code->ptr()->state_bits_); 1643 s->Write<int32_t>(code->ptr()->state_bits_);
1643 } 1644 }
1644 } 1645 }
1645 1646
1646 private: 1647 private:
(...skipping 28 matching lines...) Expand all
1675 int32_t text_offset = d->Read<int32_t>(); 1676 int32_t text_offset = d->Read<int32_t>();
1676 RawInstructions* instr = d->GetInstructionsAt(text_offset); 1677 RawInstructions* instr = d->GetInstructionsAt(text_offset);
1677 1678
1678 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); 1679 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr);
1679 code->ptr()->checked_entry_point_ = 1680 code->ptr()->checked_entry_point_ =
1680 Instructions::CheckedEntryPoint(instr); 1681 Instructions::CheckedEntryPoint(instr);
1681 NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr); 1682 NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr);
1682 code->ptr()->instructions_ = instr; 1683 code->ptr()->instructions_ = instr;
1683 1684
1684 #if !defined(DART_PRECOMPILED_RUNTIME) 1685 #if !defined(DART_PRECOMPILED_RUNTIME)
1685 if (d->kind() == Snapshot::kAppJIT) { 1686 if (d->kind() == Snapshot::kFullJIT) {
1686 int32_t text_offset = d->Read<int32_t>(); 1687 int32_t text_offset = d->Read<int32_t>();
1687 RawInstructions* instr = d->GetInstructionsAt(text_offset); 1688 RawInstructions* instr = d->GetInstructionsAt(text_offset);
1688 code->ptr()->active_instructions_ = instr; 1689 code->ptr()->active_instructions_ = instr;
1689 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr); 1690 code->ptr()->entry_point_ = Instructions::UncheckedEntryPoint(instr);
1690 code->ptr()->checked_entry_point_ = 1691 code->ptr()->checked_entry_point_ =
1691 Instructions::CheckedEntryPoint(instr); 1692 Instructions::CheckedEntryPoint(instr);
1692 } 1693 }
1693 #endif // !DART_PRECOMPILED_RUNTIME 1694 #endif // !DART_PRECOMPILED_RUNTIME
1694 1695
1695 code->ptr()->object_pool_ = 1696 code->ptr()->object_pool_ =
(...skipping 13 matching lines...) Expand all
1709 code->ptr()->stackmaps_ = reinterpret_cast<RawArray*>(d->ReadRef()); 1710 code->ptr()->stackmaps_ = reinterpret_cast<RawArray*>(d->ReadRef());
1710 code->ptr()->inlined_id_to_function_ = 1711 code->ptr()->inlined_id_to_function_ =
1711 reinterpret_cast<RawArray*>(d->ReadRef()); 1712 reinterpret_cast<RawArray*>(d->ReadRef());
1712 code->ptr()->code_source_map_ = 1713 code->ptr()->code_source_map_ =
1713 reinterpret_cast<RawCodeSourceMap*>(d->ReadRef()); 1714 reinterpret_cast<RawCodeSourceMap*>(d->ReadRef());
1714 1715
1715 #if !defined(DART_PRECOMPILED_RUNTIME) 1716 #if !defined(DART_PRECOMPILED_RUNTIME)
1716 code->ptr()->await_token_positions_ = 1717 code->ptr()->await_token_positions_ =
1717 reinterpret_cast<RawArray*>(d->ReadRef()); 1718 reinterpret_cast<RawArray*>(d->ReadRef());
1718 1719
1719 if (d->kind() == Snapshot::kAppJIT) { 1720 if (d->kind() == Snapshot::kFullJIT) {
1720 code->ptr()->deopt_info_array_ = 1721 code->ptr()->deopt_info_array_ =
1721 reinterpret_cast<RawArray*>(d->ReadRef()); 1722 reinterpret_cast<RawArray*>(d->ReadRef());
1722 code->ptr()->static_calls_target_table_ = 1723 code->ptr()->static_calls_target_table_ =
1723 reinterpret_cast<RawArray*>(d->ReadRef()); 1724 reinterpret_cast<RawArray*>(d->ReadRef());
1724 #if defined(PRODUCT) 1725 #if defined(PRODUCT)
1725 code->ptr()->return_address_metadata_ = Object::null(); 1726 code->ptr()->return_address_metadata_ = Object::null();
1726 #else 1727 #else
1727 code->ptr()->return_address_metadata_ = d->ReadRef(); 1728 code->ptr()->return_address_metadata_ = d->ReadRef();
1728 #endif 1729 #endif
1729 } else { 1730 } else {
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
2335 void WriteFill(Serializer* s) { 2336 void WriteFill(Serializer* s) {
2336 Snapshot::Kind kind = s->kind(); 2337 Snapshot::Kind kind = s->kind();
2337 intptr_t count = objects_.length(); 2338 intptr_t count = objects_.length();
2338 for (intptr_t i = 0; i < count; i++) { 2339 for (intptr_t i = 0; i < count; i++) {
2339 RawICData* ic = objects_[i]; 2340 RawICData* ic = objects_[i];
2340 RawObject** from = ic->from(); 2341 RawObject** from = ic->from();
2341 RawObject** to = ic->to_snapshot(kind); 2342 RawObject** to = ic->to_snapshot(kind);
2342 for (RawObject** p = from; p <= to; p++) { 2343 for (RawObject** p = from; p <= to; p++) {
2343 s->WriteRef(*p); 2344 s->WriteRef(*p);
2344 } 2345 }
2345 if (kind != Snapshot::kAppAOT) { 2346 if (kind != Snapshot::kFullAOT) {
2346 NOT_IN_PRECOMPILED(s->Write<int32_t>(ic->ptr()->deopt_id_)); 2347 NOT_IN_PRECOMPILED(s->Write<int32_t>(ic->ptr()->deopt_id_));
2347 } 2348 }
2348 s->Write<uint32_t>(ic->ptr()->state_bits_); 2349 s->Write<uint32_t>(ic->ptr()->state_bits_);
2349 #if defined(TAG_IC_DATA) 2350 #if defined(TAG_IC_DATA)
2350 s->Write<int32_t>(ic->ptr()->tag_); 2351 s->Write<int32_t>(ic->ptr()->tag_);
2351 #endif 2352 #endif
2352 } 2353 }
2353 } 2354 }
2354 2355
2355 private: 2356 private:
(...skipping 2285 matching lines...) Expand 10 before | Expand all | Expand 10 after
4641 if (Snapshot::IncludesCode(kind_)) { 4642 if (Snapshot::IncludesCode(kind_)) {
4642 return new (Z) RODataSerializationCluster(kTwoByteStringCid); 4643 return new (Z) RODataSerializationCluster(kTwoByteStringCid);
4643 } else { 4644 } else {
4644 return new (Z) TwoByteStringSerializationCluster(); 4645 return new (Z) TwoByteStringSerializationCluster();
4645 } 4646 }
4646 } 4647 }
4647 default: 4648 default:
4648 break; 4649 break;
4649 } 4650 }
4650 4651
4651 FATAL1("No cluster defined for cid %" Pd, cid); 4652 FATAL2("No cluster defined for cid %" Pd ", kind %s", cid,
4653 Snapshot::KindToCString(kind_));
4652 return NULL; 4654 return NULL;
4653 #endif // !DART_PRECOMPILED_RUNTIME 4655 #endif // !DART_PRECOMPILED_RUNTIME
4654 } 4656 }
4655 4657
4656 4658
4657 void Serializer::Push(RawObject* object) { 4659 void Serializer::Push(RawObject* object) {
4658 if (!object->IsHeapObject()) { 4660 if (!object->IsHeapObject()) {
4659 RawSmi* smi = Smi::RawCast(object); 4661 RawSmi* smi = Smi::RawCast(object);
4660 if (smi_ids_.Lookup(smi) == NULL) { 4662 if (smi_ids_.Lookup(smi) == NULL) {
4661 SmiObjectIdPair pair; 4663 SmiObjectIdPair pair;
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after
5432 isolate()->ValidateClassTable(); 5434 isolate()->ValidateClassTable();
5433 #endif 5435 #endif
5434 // Can't have any mutation happening while we're serializing. 5436 // Can't have any mutation happening while we're serializing.
5435 ASSERT(isolate()->background_compiler() == NULL); 5437 ASSERT(isolate()->background_compiler() == NULL);
5436 5438
5437 // TODO(rmacnak): The special case for AOT causes us to always generate the 5439 // TODO(rmacnak): The special case for AOT causes us to always generate the
5438 // same VM isolate snapshot for every app. AOT snapshots should be cleaned up 5440 // same VM isolate snapshot for every app. AOT snapshots should be cleaned up
5439 // so the VM isolate snapshot is generated separately and each app is 5441 // so the VM isolate snapshot is generated separately and each app is
5440 // generated from a VM that has loaded this snapshots, much like app-jit 5442 // generated from a VM that has loaded this snapshots, much like app-jit
5441 // snapshots. 5443 // snapshots.
5442 if ((vm_snapshot_data_buffer != NULL) && (kind != Snapshot::kAppAOT)) { 5444 if ((vm_snapshot_data_buffer != NULL) && (kind != Snapshot::kFullAOT)) {
5443 NOT_IN_PRODUCT(TimelineDurationScope tds( 5445 NOT_IN_PRODUCT(TimelineDurationScope tds(
5444 thread(), Timeline::GetIsolateStream(), "PrepareNewVMIsolate")); 5446 thread(), Timeline::GetIsolateStream(), "PrepareNewVMIsolate"));
5445 5447
5446 // Collect all the token stream objects into an array so that we can write 5448 // Collect all the token stream objects into an array so that we can write
5447 // it out as part of the VM isolate snapshot. We first count the number of 5449 // it out as part of the VM isolate snapshot. We first count the number of
5448 // token streams, allocate an array and then fill it up with the token 5450 // token streams, allocate an array and then fill it up with the token
5449 // streams. 5451 // streams.
5450 SnapshotTokenStreamVisitor token_streams_counter(thread()); 5452 SnapshotTokenStreamVisitor token_streams_counter(thread());
5451 heap()->IterateOldObjects(&token_streams_counter); 5453 heap()->IterateOldObjects(&token_streams_counter);
5452 Dart::vm_isolate()->heap()->IterateOldObjects(&token_streams_counter); 5454 Dart::vm_isolate()->heap()->IterateOldObjects(&token_streams_counter);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
5581 5583
5582 FullSnapshotReader::FullSnapshotReader(const Snapshot* snapshot, 5584 FullSnapshotReader::FullSnapshotReader(const Snapshot* snapshot,
5583 const uint8_t* instructions_buffer, 5585 const uint8_t* instructions_buffer,
5584 Thread* thread) 5586 Thread* thread)
5585 : kind_(snapshot->kind()), 5587 : kind_(snapshot->kind()),
5586 thread_(thread), 5588 thread_(thread),
5587 buffer_(snapshot->content()), 5589 buffer_(snapshot->content()),
5588 size_(snapshot->length()), 5590 size_(snapshot->length()),
5589 instructions_buffer_(instructions_buffer), 5591 instructions_buffer_(instructions_buffer),
5590 data_buffer_(DataBuffer(snapshot)) { 5592 data_buffer_(DataBuffer(snapshot)) {
5591 thread->isolate()->set_compilation_allowed(kind_ != Snapshot::kAppAOT); 5593 thread->isolate()->set_compilation_allowed(kind_ != Snapshot::kFullAOT);
5592 } 5594 }
5593 5595
5594 5596
5595 RawApiError* FullSnapshotReader::ReadVMSnapshot() { 5597 RawApiError* FullSnapshotReader::ReadVMSnapshot() {
5596 Deserializer deserializer(thread_, kind_, buffer_, size_, 5598 Deserializer deserializer(thread_, kind_, buffer_, size_,
5597 instructions_buffer_, data_buffer_); 5599 instructions_buffer_, data_buffer_);
5598 5600
5599 RawApiError* error = deserializer.VerifyVersionAndFeatures(/*isolate=*/NULL); 5601 RawApiError* error = deserializer.VerifyVersionAndFeatures(/*isolate=*/NULL);
5600 if (error != ApiError::null()) { 5602 if (error != ApiError::null()) {
5601 return error; 5603 return error;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5634 thread_->isolate()->SetupImagePage(data_buffer_, 5636 thread_->isolate()->SetupImagePage(data_buffer_,
5635 /* is_executable */ false); 5637 /* is_executable */ false);
5636 } 5638 }
5637 5639
5638 deserializer.ReadIsolateSnapshot(thread_->isolate()->object_store()); 5640 deserializer.ReadIsolateSnapshot(thread_->isolate()->object_store());
5639 5641
5640 return ApiError::null(); 5642 return ApiError::null();
5641 } 5643 }
5642 5644
5643 } // namespace dart 5645 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/benchmark_test.cc ('k') | runtime/vm/dart.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698