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

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

Issue 1337083004: - Turn on writing of ic_data_array so that we have that information for script snapshots that would… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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/raw_object.h ('k') | runtime/vm/snapshot.h » ('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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/object.h" 5 #include "vm/object.h"
6 #include "vm/object_store.h" 6 #include "vm/object_store.h"
7 #include "vm/snapshot.h" 7 #include "vm/snapshot.h"
8 #include "vm/stub_code.h" 8 #include "vm/stub_code.h"
9 #include "vm/symbols.h" 9 #include "vm/symbols.h"
10 #include "vm/visitor.h" 10 #include "vm/visitor.h"
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 ASSERT(reader != NULL); 497 ASSERT(reader != NULL);
498 498
499 // Allocate function object. 499 // Allocate function object.
500 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), 500 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
501 NEW_OBJECT(PatchClass)); 501 NEW_OBJECT(PatchClass));
502 reader->AddBackRef(object_id, &cls, kIsDeserialized); 502 reader->AddBackRef(object_id, &cls, kIsDeserialized);
503 503
504 // Set all the object fields. 504 // Set all the object fields.
505 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); 505 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
506 506
507 ASSERT(((kind == Snapshot::kScript) && 507 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
508 !Class::IsInFullSnapshot(cls.source_class())) ||
509 (kind == Snapshot::kFull));
510
511 return cls.raw(); 508 return cls.raw();
512 } 509 }
513 510
514 511
515 void RawPatchClass::WriteTo(SnapshotWriter* writer, 512 void RawPatchClass::WriteTo(SnapshotWriter* writer,
516 intptr_t object_id, 513 intptr_t object_id,
517 Snapshot::Kind kind) { 514 Snapshot::Kind kind) {
518 ASSERT(writer != NULL); 515 ASSERT(writer != NULL);
519 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 516 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
520 517
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 } 621 }
625 622
626 623
627 RawFunction* Function::ReadFrom(SnapshotReader* reader, 624 RawFunction* Function::ReadFrom(SnapshotReader* reader,
628 intptr_t object_id, 625 intptr_t object_id,
629 intptr_t tags, 626 intptr_t tags,
630 Snapshot::Kind kind) { 627 Snapshot::Kind kind) {
631 ASSERT(reader != NULL); 628 ASSERT(reader != NULL);
632 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 629 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
633 630
634 // Allocate function object. 631 bool is_in_fullsnapshot = reader->Read<bool>();
635 Function& func = Function::ZoneHandle( 632 if ((kind == Snapshot::kFull) || !is_in_fullsnapshot) {
636 reader->zone(), NEW_OBJECT(Function)); 633 // Allocate function object.
637 reader->AddBackRef(object_id, &func, kIsDeserialized); 634 Function& func = Function::ZoneHandle(
635 reader->zone(), NEW_OBJECT(Function));
636 reader->AddBackRef(object_id, &func, kIsDeserialized);
638 637
639 // Set all the non object fields. 638 // Set all the non object fields.
640 func.set_token_pos(reader->Read<int32_t>()); 639 func.set_token_pos(reader->Read<int32_t>());
641 func.set_end_token_pos(reader->Read<int32_t>()); 640 func.set_end_token_pos(reader->Read<int32_t>());
642 func.set_usage_counter(reader->Read<int32_t>()); 641 func.set_usage_counter(reader->Read<int32_t>());
643 func.set_num_fixed_parameters(reader->Read<int16_t>()); 642 func.set_num_fixed_parameters(reader->Read<int16_t>());
644 func.set_num_optional_parameters(reader->Read<int16_t>()); 643 func.set_num_optional_parameters(reader->Read<int16_t>());
645 func.set_deoptimization_counter(reader->Read<int16_t>()); 644 func.set_deoptimization_counter(reader->Read<int16_t>());
646 func.set_kind_tag(reader->Read<uint32_t>()); 645 func.set_kind_tag(reader->Read<uint32_t>());
647 func.set_optimized_instruction_count(reader->Read<uint16_t>()); 646 func.set_optimized_instruction_count(reader->Read<uint16_t>());
648 func.set_optimized_call_site_count(reader->Read<uint16_t>()); 647 func.set_optimized_call_site_count(reader->Read<uint16_t>());
649 648
650 // Set all the object fields. 649 // Set all the object fields.
651 READ_OBJECT_FIELDS(func, 650 READ_OBJECT_FIELDS(func,
652 func.raw()->from(), 651 func.raw()->from(),
653 reader->snapshot_code() ? func.raw()->to() 652 reader->snapshot_code() ? func.raw()->to()
654 : func.raw()->to_snapshot(), 653 : func.raw()->to_snapshot(),
655 kAsReference); 654 kAsReference);
656 655
657 if (!reader->snapshot_code()) { 656 if (!reader->snapshot_code()) {
658 // Initialize all fields that are not part of the snapshot. 657 // Initialize all fields that are not part of the snapshot.
659 func.ClearICDataArray(); 658 if (func.usage_counter() == 0) {
rmacnak 2015/09/14 23:34:17 Might as well clear it on the write-side to make t
siva 2015/09/15 21:40:04 Done.
660 func.ClearCode(); 659 func.ClearICDataArray();
660 }
661 func.ClearCode();
662 } else {
663 // TODO(rmacnak): Fix entry_point_.
664 }
665 return func.raw();
661 } else { 666 } else {
662 // TODO(rmacnak): Fix entry_point_. 667 return reader->ReadFunctionId(object_id);
663 } 668 }
664 return func.raw();
665 } 669 }
666 670
667 671
668 void RawFunction::WriteTo(SnapshotWriter* writer, 672 void RawFunction::WriteTo(SnapshotWriter* writer,
669 intptr_t object_id, 673 intptr_t object_id,
670 Snapshot::Kind kind) { 674 Snapshot::Kind kind) {
671 ASSERT(writer != NULL); 675 ASSERT(writer != NULL);
672 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 676 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
677 bool is_in_fullsnapshot = false;
678 bool owner_is_class = false;
679 if (kind == Snapshot::kScript) {
680 intptr_t tags = writer->GetObjectTags(ptr()->owner_);
681 intptr_t cid = ClassIdTag::decode(tags);
682 owner_is_class = (cid == kClassCid);
683 is_in_fullsnapshot = owner_is_class ?
684 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) :
685 PatchClass::IsInFullSnapshot(
686 reinterpret_cast<RawPatchClass*>(ptr()->owner_));
687 }
673 688
674 // Write out the serialization header value for this object. 689 // Write out the serialization header value for this object.
675 writer->WriteInlinedObjectHeader(object_id); 690 writer->WriteInlinedObjectHeader(object_id);
676 691
677 // Write out the class and tags information. 692 // Write out the class and tags information.
678 writer->WriteVMIsolateObject(kFunctionCid); 693 writer->WriteVMIsolateObject(kFunctionCid);
679 writer->WriteTags(writer->GetObjectTags(this)); 694 writer->WriteTags(writer->GetObjectTags(this));
680 695
681 // Write out all the non object fields. 696 // Write out the boolean is_in_fullsnapshot first as this will
682 writer->Write<int32_t>(ptr()->token_pos_); 697 // help the reader decide how the rest of the information needs
683 writer->Write<int32_t>(ptr()->end_token_pos_); 698 // to be interpreted.
684 if (Code::IsOptimized(ptr()->instructions_->ptr()->code_)) { 699 writer->Write<bool>(is_in_fullsnapshot);
685 writer->Write<int32_t>(FLAG_optimization_counter_threshold); 700
701 if (kind == Snapshot::kFull || !is_in_fullsnapshot) {
702 // Write out all the non object fields.
703 writer->Write<int32_t>(ptr()->token_pos_);
704 writer->Write<int32_t>(ptr()->end_token_pos_);
705 if (Code::IsOptimized(ptr()->instructions_->ptr()->code_)) {
706 writer->Write<int32_t>(FLAG_optimization_counter_threshold);
707 } else {
708 writer->Write<int32_t>(0);
709 }
710 writer->Write<int16_t>(ptr()->num_fixed_parameters_);
711 writer->Write<int16_t>(ptr()->num_optional_parameters_);
712 writer->Write<int16_t>(ptr()->deoptimization_counter_);
713 writer->Write<uint32_t>(ptr()->kind_tag_);
714 writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
715 writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
716
717 // Write out all the object pointer fields.
718 SnapshotWriterVisitor visitor(writer);
719 visitor.VisitPointers(
720 from(), writer->snapshot_code() ? to() : to_snapshot());
686 } else { 721 } else {
687 writer->Write<int32_t>(0); 722 writer->WriteFunctionId(this, owner_is_class);
688 } 723 }
689 writer->Write<int16_t>(ptr()->num_fixed_parameters_);
690 writer->Write<int16_t>(ptr()->num_optional_parameters_);
691 writer->Write<int16_t>(ptr()->deoptimization_counter_);
692 writer->Write<uint32_t>(ptr()->kind_tag_);
693 writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
694 writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
695
696 // Write out all the object pointer fields.
697 SnapshotWriterVisitor visitor(writer);
698 visitor.VisitPointers(from(), writer->snapshot_code() ? to()
699 : to_snapshot());
700 } 724 }
701 725
702 726
703 RawField* Field::ReadFrom(SnapshotReader* reader, 727 RawField* Field::ReadFrom(SnapshotReader* reader,
704 intptr_t object_id, 728 intptr_t object_id,
705 intptr_t tags, 729 intptr_t tags,
706 Snapshot::Kind kind) { 730 Snapshot::Kind kind) {
707 ASSERT(reader != NULL); 731 ASSERT(reader != NULL);
708 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 732 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
709 733
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 return; 1682 return;
1659 } 1683 }
1660 UNREACHABLE(); 1684 UNREACHABLE();
1661 } 1685 }
1662 1686
1663 1687
1664 RawICData* ICData::ReadFrom(SnapshotReader* reader, 1688 RawICData* ICData::ReadFrom(SnapshotReader* reader,
1665 intptr_t object_id, 1689 intptr_t object_id,
1666 intptr_t tags, 1690 intptr_t tags,
1667 Snapshot::Kind kind) { 1691 Snapshot::Kind kind) {
1668 ASSERT(reader->snapshot_code()); 1692 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1669 ASSERT(kind == Snapshot::kFull);
1670 1693
1671 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); 1694 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
1672 reader->AddBackRef(object_id, &result, kIsDeserialized); 1695 reader->AddBackRef(object_id, &result, kIsDeserialized);
1673 1696
1674 result.set_deopt_id(reader->Read<int32_t>()); 1697 result.set_deopt_id(reader->Read<int32_t>());
1675 result.set_state_bits(reader->Read<uint32_t>()); 1698 result.set_state_bits(reader->Read<uint32_t>());
1676 1699
1677 // Set all the object fields. 1700 // Set all the object fields.
1678 READ_OBJECT_FIELDS(result, 1701 READ_OBJECT_FIELDS(result,
1679 result.raw()->from(), result.raw()->to(), 1702 result.raw()->from(), result.raw()->to(),
1680 kAsReference); 1703 kAsReference);
1681 1704
1682 return result.raw(); 1705 return result.raw();
1683 } 1706 }
1684 1707
1685 1708
1686 void RawICData::WriteTo(SnapshotWriter* writer, 1709 void RawICData::WriteTo(SnapshotWriter* writer,
1687 intptr_t object_id, 1710 intptr_t object_id,
1688 Snapshot::Kind kind) { 1711 Snapshot::Kind kind) {
1689 ASSERT(writer->snapshot_code()); 1712 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1690 ASSERT(kind == Snapshot::kFull);
1691 1713
1692 // Write out the serialization header value for this object. 1714 // Write out the serialization header value for this object.
1693 writer->WriteInlinedObjectHeader(object_id); 1715 writer->WriteInlinedObjectHeader(object_id);
1694 1716
1695 // Write out the class and tags information. 1717 // Write out the class and tags information.
1696 writer->WriteVMIsolateObject(kICDataCid); 1718 writer->WriteVMIsolateObject(kICDataCid);
1697 writer->WriteTags(writer->GetObjectTags(this)); 1719 writer->WriteTags(writer->GetObjectTags(this));
1698 1720
1699 // Write out all the non object fields. 1721 // Write out all the non object fields.
1700 writer->Write<int32_t>(ptr()->deopt_id_); 1722 writer->Write<int32_t>(ptr()->deopt_id_);
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after
3250 // We do not allow objects with native fields in an isolate message. 3272 // We do not allow objects with native fields in an isolate message.
3251 writer->SetWriteException(Exceptions::kArgument, 3273 writer->SetWriteException(Exceptions::kArgument,
3252 "Illegal argument in isolate message" 3274 "Illegal argument in isolate message"
3253 " : (object is a UserTag)"); 3275 " : (object is a UserTag)");
3254 } else { 3276 } else {
3255 UNREACHABLE(); 3277 UNREACHABLE();
3256 } 3278 }
3257 } 3279 }
3258 3280
3259 } // namespace dart 3281 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698