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

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

Issue 1584443002: VM: Precompiled rodata snapshot. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: compute string hash if necessary Created 4 years, 10 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/native_entry.h" 5 #include "vm/native_entry.h"
6 #include "vm/object.h" 6 #include "vm/object.h"
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/snapshot.h" 8 #include "vm/snapshot.h"
9 #include "vm/stub_code.h" 9 #include "vm/stub_code.h"
10 #include "vm/symbols.h" 10 #include "vm/symbols.h"
(...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 1470
1471 1471
1472 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, 1472 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
1473 intptr_t object_id, 1473 intptr_t object_id,
1474 intptr_t tags, 1474 intptr_t tags,
1475 Snapshot::Kind kind, 1475 Snapshot::Kind kind,
1476 bool as_reference) { 1476 bool as_reference) {
1477 ASSERT(reader->snapshot_code()); 1477 ASSERT(reader->snapshot_code());
1478 ASSERT(kind == Snapshot::kFull); 1478 ASSERT(kind == Snapshot::kFull);
1479 1479
1480 #ifdef DEBUG
1480 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>()); 1481 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>());
1482 #else
1483 intptr_t full_tags = 0; // unused in release mode
1484 #endif
1481 intptr_t offset = reader->Read<int32_t>(); 1485 intptr_t offset = reader->Read<int32_t>();
1482 Instructions& result = 1486 Instructions& result =
1483 Instructions::ZoneHandle(reader->zone(), 1487 Instructions::ZoneHandle(reader->zone(),
1484 reader->GetInstructionsAt(offset, full_tags)); 1488 reader->GetInstructionsAt(offset, full_tags));
1485 reader->AddBackRef(object_id, &result, kIsDeserialized); 1489 reader->AddBackRef(object_id, &result, kIsDeserialized);
1486 1490
1487 return result.raw(); 1491 return result.raw();
1488 } 1492 }
1489 1493
1490 1494
1491 void RawInstructions::WriteTo(SnapshotWriter* writer, 1495 void RawInstructions::WriteTo(SnapshotWriter* writer,
1492 intptr_t object_id, 1496 intptr_t object_id,
1493 Snapshot::Kind kind, 1497 Snapshot::Kind kind,
1494 bool as_reference) { 1498 bool as_reference) {
1495 ASSERT(writer->snapshot_code()); 1499 ASSERT(writer->snapshot_code());
1496 ASSERT(kind == Snapshot::kFull); 1500 ASSERT(kind == Snapshot::kFull);
1497 1501
1498 writer->WriteInlinedObjectHeader(object_id); 1502 writer->WriteInlinedObjectHeader(object_id);
1499 writer->WriteVMIsolateObject(kInstructionsCid); 1503 writer->WriteVMIsolateObject(kInstructionsCid);
1500 writer->WriteTags(writer->GetObjectTags(this)); 1504 writer->WriteTags(writer->GetObjectTags(this));
1501 1505
1506 #ifdef DEBUG
1502 // Instructions will be written pre-marked and in the VM heap. Write out 1507 // Instructions will be written pre-marked and in the VM heap. Write out
1503 // the tags we expect to find when reading the snapshot for a sanity check 1508 // the tags we expect to find when reading the snapshot for a sanity check
1504 // that our offsets/alignment didn't get out of sync. 1509 // that our offsets/alignment didn't get out of sync.
1505 uword written_tags = writer->GetObjectTags(this); 1510 uword written_tags = writer->GetObjectTags(this);
1506 written_tags = RawObject::VMHeapObjectTag::update(true, written_tags); 1511 written_tags = RawObject::VMHeapObjectTag::update(true, written_tags);
1507 written_tags = RawObject::MarkBit::update(true, written_tags); 1512 written_tags = RawObject::MarkBit::update(true, written_tags);
1508 writer->Write<intptr_t>(written_tags); 1513 writer->Write<intptr_t>(written_tags);
1514 #endif
1509 1515
1510 writer->Write<int32_t>(writer->GetInstructionsId(this)); 1516 writer->Write<int32_t>(writer->GetInstructionsId(this));
1511 } 1517 }
1512 1518
1513 1519
1514 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, 1520 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader,
1515 intptr_t object_id, 1521 intptr_t object_id,
1516 intptr_t tags, 1522 intptr_t tags,
1517 Snapshot::Kind kind, 1523 Snapshot::Kind kind,
1518 bool as_reference) { 1524 bool as_reference) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1636 1642
1637 1643
1638 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, 1644 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
1639 intptr_t object_id, 1645 intptr_t object_id,
1640 intptr_t tags, 1646 intptr_t tags,
1641 Snapshot::Kind kind, 1647 Snapshot::Kind kind,
1642 bool as_reference) { 1648 bool as_reference) {
1643 ASSERT(reader->snapshot_code()); 1649 ASSERT(reader->snapshot_code());
1644 ASSERT(kind == Snapshot::kFull); 1650 ASSERT(kind == Snapshot::kFull);
1645 1651
1646 const int32_t length = reader->Read<int32_t>(); 1652 intptr_t offset = reader->Read<int32_t>();
1647 PcDescriptors& result = 1653 PcDescriptors& result = PcDescriptors::ZoneHandle(reader->zone());
1648 PcDescriptors::ZoneHandle(reader->zone(), 1654 result ^= reader->GetObjectAt(offset);
1649 NEW_OBJECT_WITH_LEN(PcDescriptors, length));
1650 reader->AddBackRef(object_id, &result, kIsDeserialized); 1655 reader->AddBackRef(object_id, &result, kIsDeserialized);
1651 1656
1652 if (result.Length() > 0) {
1653 NoSafepointScope no_safepoint;
1654 intptr_t len = result.Length();
1655 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1656 reader->ReadBytes(data, len);
1657 }
1658
1659 return result.raw(); 1657 return result.raw();
1660 } 1658 }
1661 1659
1662 1660
1663 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, 1661 void RawPcDescriptors::WriteTo(SnapshotWriter* writer,
1664 intptr_t object_id, 1662 intptr_t object_id,
1665 Snapshot::Kind kind, 1663 Snapshot::Kind kind,
1666 bool as_reference) { 1664 bool as_reference) {
1667 ASSERT(writer->snapshot_code()); 1665 ASSERT(writer->snapshot_code());
1668 ASSERT(kind == Snapshot::kFull); 1666 ASSERT(kind == Snapshot::kFull);
1669 1667
1670 // Write out the serialization header value for this object. 1668 // Write out the serialization header value for this object.
1671 writer->WriteInlinedObjectHeader(object_id); 1669 writer->WriteInlinedObjectHeader(object_id);
1672 writer->WriteIndexedObject(kPcDescriptorsCid); 1670 writer->WriteIndexedObject(kPcDescriptorsCid);
1673 writer->WriteTags(writer->GetObjectTags(this)); 1671 writer->WriteTags(writer->GetObjectTags(this));
1674 writer->Write<int32_t>(ptr()->length_); 1672
1675 if (ptr()->length_ > 0) { 1673 writer->Write<int32_t>(writer->GetObjectId(this));
1676 intptr_t len = ptr()->length_;
1677 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1678 writer->WriteBytes(data, len);
1679 }
1680 } 1674 }
1681 1675
1682 1676
1683 RawCodeSourceMap* CodeSourceMap::ReadFrom(SnapshotReader* reader, 1677 RawCodeSourceMap* CodeSourceMap::ReadFrom(SnapshotReader* reader,
1684 intptr_t object_id, 1678 intptr_t object_id,
1685 intptr_t tags, 1679 intptr_t tags,
1686 Snapshot::Kind kind, 1680 Snapshot::Kind kind,
1687 bool as_reference) { 1681 bool as_reference) {
1688 ASSERT(reader->snapshot_code()); 1682 ASSERT(reader->snapshot_code());
1689 ASSERT(kind == Snapshot::kFull); 1683 ASSERT(kind == Snapshot::kFull);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 1720
1727 1721
1728 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, 1722 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader,
1729 intptr_t object_id, 1723 intptr_t object_id,
1730 intptr_t tags, 1724 intptr_t tags,
1731 Snapshot::Kind kind, 1725 Snapshot::Kind kind,
1732 bool as_reference) { 1726 bool as_reference) {
1733 ASSERT(reader->snapshot_code()); 1727 ASSERT(reader->snapshot_code());
1734 ASSERT(kind == Snapshot::kFull); 1728 ASSERT(kind == Snapshot::kFull);
1735 1729
1736 const int32_t length = reader->Read<int32_t>(); 1730 intptr_t offset = reader->Read<int32_t>();
1737 Stackmap& result = 1731 Stackmap& result = Stackmap::ZoneHandle(reader->zone());
1738 Stackmap::ZoneHandle(reader->zone(), 1732 result ^= reader->GetObjectAt(offset);
1739 reader->NewStackmap(length));
1740 reader->AddBackRef(object_id, &result, kIsDeserialized); 1733 reader->AddBackRef(object_id, &result, kIsDeserialized);
1741 1734
1742 result.SetRegisterBitCount(reader->Read<int32_t>());
1743 result.SetPcOffset(reader->Read<uint32_t>());
1744
1745 if (length > 0) {
1746 NoSafepointScope no_safepoint;
1747 intptr_t len = (result.Length() + 7) / 8;
1748 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1749 reader->ReadBytes(data, len);
1750 }
1751
1752 return result.raw(); 1735 return result.raw();
1753 } 1736 }
1754 1737
1755 1738
1756 void RawStackmap::WriteTo(SnapshotWriter* writer, 1739 void RawStackmap::WriteTo(SnapshotWriter* writer,
1757 intptr_t object_id, 1740 intptr_t object_id,
1758 Snapshot::Kind kind, 1741 Snapshot::Kind kind,
1759 bool as_reference) { 1742 bool as_reference) {
1760 ASSERT(writer->snapshot_code()); 1743 ASSERT(writer->snapshot_code());
1761 ASSERT(kind == Snapshot::kFull); 1744 ASSERT(kind == Snapshot::kFull);
1762 1745
1763 // Write out the serialization header value for this object. 1746 // Write out the serialization header value for this object.
1764 writer->WriteInlinedObjectHeader(object_id); 1747 writer->WriteInlinedObjectHeader(object_id);
1765 writer->WriteIndexedObject(kStackmapCid); 1748 writer->WriteIndexedObject(kStackmapCid);
1766 writer->WriteTags(writer->GetObjectTags(this)); 1749 writer->WriteTags(writer->GetObjectTags(this));
1767 1750
1768 writer->Write<int32_t>(ptr()->length_); 1751 writer->Write<int32_t>(writer->GetObjectId(this));
1769 writer->Write<int32_t>(ptr()->register_bit_count_);
1770 writer->Write<uint32_t>(ptr()->pc_offset_);
1771 if (ptr()->length_ > 0) {
1772 intptr_t len = (ptr()->length_ + 7) / 8;
1773 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1774 writer->WriteBytes(data, len);
1775 }
1776 } 1752 }
1777 1753
1778 1754
1779 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, 1755 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
1780 intptr_t object_id, 1756 intptr_t object_id,
1781 intptr_t tags, 1757 intptr_t tags,
1782 Snapshot::Kind kind, 1758 Snapshot::Kind kind,
1783 bool as_reference) { 1759 bool as_reference) {
1784 ASSERT(reader->snapshot_code()); 1760 ASSERT(reader->snapshot_code());
1785 ASSERT(kind == Snapshot::kFull); 1761 ASSERT(kind == Snapshot::kFull);
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
2565 } 2541 }
2566 } 2542 }
2567 } 2543 }
2568 2544
2569 2545
2570 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, 2546 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader,
2571 intptr_t object_id, 2547 intptr_t object_id,
2572 intptr_t tags, 2548 intptr_t tags,
2573 Snapshot::Kind kind, 2549 Snapshot::Kind kind,
2574 bool as_reference) { 2550 bool as_reference) {
2551 if (reader->snapshot_code()) {
2552 ASSERT(kind == Snapshot::kFull);
2553 intptr_t offset = reader->Read<int32_t>();
2554 String& result = String::ZoneHandle(reader->zone());
2555 result ^= reader->GetObjectAt(offset);
2556 reader->AddBackRef(object_id, &result, kIsDeserialized);
2557 return raw(result);
2558 }
2575 // Read the length so that we can determine instance size to allocate. 2559 // Read the length so that we can determine instance size to allocate.
2576 ASSERT(reader != NULL); 2560 ASSERT(reader != NULL);
2577 intptr_t len = reader->ReadSmiValue(); 2561 intptr_t len = reader->ReadSmiValue();
2578 intptr_t hash = reader->ReadSmiValue(); 2562 intptr_t hash = reader->ReadSmiValue();
2579 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); 2563 String& str_obj = String::ZoneHandle(reader->zone(), String::null());
2580 2564
2581 if (kind == Snapshot::kFull) { 2565 if (kind == Snapshot::kFull) {
2582 // We currently only expect the Dart mutator to read snapshots. 2566 // We currently only expect the Dart mutator to read snapshots.
2583 reader->isolate()->AssertCurrentThreadIsMutator(); 2567 reader->isolate()->AssertCurrentThreadIsMutator();
2584 ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0); 2568 ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 } 2656 }
2673 } 2657 }
2674 } 2658 }
2675 } 2659 }
2676 2660
2677 2661
2678 void RawOneByteString::WriteTo(SnapshotWriter* writer, 2662 void RawOneByteString::WriteTo(SnapshotWriter* writer,
2679 intptr_t object_id, 2663 intptr_t object_id,
2680 Snapshot::Kind kind, 2664 Snapshot::Kind kind,
2681 bool as_reference) { 2665 bool as_reference) {
2666 if (writer->snapshot_code()) {
2667 ASSERT(writer->snapshot_code());
2668 ASSERT(kind == Snapshot::kFull);
2669 // Assert that hash is computed.
2670 if (ptr()->hash_ == NULL) {
2671 ptr()->hash_ = Smi::New(String::Hash(ptr()->data(),
2672 Smi::Value(ptr()->length_)));
2673 }
2674 ASSERT(ptr()->hash_ != NULL);
2675 // Write out the serialization header value for this object.
2676 writer->WriteInlinedObjectHeader(object_id);
2677 writer->WriteIndexedObject(kOneByteStringCid);
2678 writer->WriteTags(writer->GetObjectTags(this));
2679 writer->Write<int32_t>(writer->GetObjectId(this));
2680 return;
2681 }
2682 StringWriteTo(writer, 2682 StringWriteTo(writer,
2683 object_id, 2683 object_id,
2684 kind, 2684 kind,
2685 kOneByteStringCid, 2685 kOneByteStringCid,
2686 writer->GetObjectTags(this), 2686 writer->GetObjectTags(this),
2687 ptr()->length_, 2687 ptr()->length_,
2688 ptr()->hash_, 2688 ptr()->hash_,
2689 ptr()->data()); 2689 ptr()->data());
2690 } 2690 }
2691 2691
(...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after
3692 // We do not allow objects with native fields in an isolate message. 3692 // We do not allow objects with native fields in an isolate message.
3693 writer->SetWriteException(Exceptions::kArgument, 3693 writer->SetWriteException(Exceptions::kArgument,
3694 "Illegal argument in isolate message" 3694 "Illegal argument in isolate message"
3695 " : (object is a UserTag)"); 3695 " : (object is a UserTag)");
3696 } else { 3696 } else {
3697 UNREACHABLE(); 3697 UNREACHABLE();
3698 } 3698 }
3699 } 3699 }
3700 3700
3701 } // namespace dart 3701 } // 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