OLD | NEW |
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 #ifndef VM_SNAPSHOT_H_ | 5 #ifndef VM_SNAPSHOT_H_ |
6 #define VM_SNAPSHOT_H_ | 6 #define VM_SNAPSHOT_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
10 #include "vm/bitfield.h" | 10 #include "vm/bitfield.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 // using ths unique ID assigned to them). | 86 // using ths unique ID assigned to them). |
87 // - Reference to object that has already been written: (object id | 0x3) | 87 // - Reference to object that has already been written: (object id | 0x3) |
88 // This valus is serialized as a positive number. | 88 // This valus is serialized as a positive number. |
89 // - Object that is seen for the first time (inlined in the stream): | 89 // - Object that is seen for the first time (inlined in the stream): |
90 // (a unique id for this object | 0x1) | 90 // (a unique id for this object | 0x1) |
91 enum SerializedHeaderType { | 91 enum SerializedHeaderType { |
92 kInlined = 0x1, | 92 kInlined = 0x1, |
93 kObjectId = 0x3, | 93 kObjectId = 0x3, |
94 }; | 94 }; |
95 static const int8_t kHeaderTagBits = 2; | 95 static const int8_t kHeaderTagBits = 2; |
96 static const int8_t kObjectIdBits = (kBitsPerWord - (kHeaderTagBits + 1)); | 96 static const int8_t kObjectIdBits = (kBitsPerInt32 - (kHeaderTagBits + 1)); |
97 static const intptr_t kMaxObjectId = (kUwordMax >> (kHeaderTagBits + 1)); | 97 static const intptr_t kMaxObjectId = (kMaxUint32 >> (kHeaderTagBits + 1)); |
98 | 98 |
99 | 99 |
100 class SerializedHeaderTag : public BitField<enum SerializedHeaderType, | 100 class SerializedHeaderTag : public BitField<enum SerializedHeaderType, |
101 0, | 101 0, |
102 kHeaderTagBits> { | 102 kHeaderTagBits> { |
103 }; | 103 }; |
104 | 104 |
105 | 105 |
106 class SerializedHeaderData : public BitField<intptr_t, | 106 class SerializedHeaderData : public BitField<intptr_t, |
107 kHeaderTagBits, | 107 kHeaderTagBits, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 class BaseReader { | 180 class BaseReader { |
181 public: | 181 public: |
182 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {} | 182 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {} |
183 // Reads raw data (for basic types). | 183 // Reads raw data (for basic types). |
184 // sizeof(T) must be in {1,2,4,8}. | 184 // sizeof(T) must be in {1,2,4,8}. |
185 template <typename T> | 185 template <typename T> |
186 T Read() { | 186 T Read() { |
187 return ReadStream::Raw<sizeof(T), T>::Read(&stream_); | 187 return ReadStream::Raw<sizeof(T), T>::Read(&stream_); |
188 } | 188 } |
189 | 189 |
190 // Reads an intptr_t type value. | |
191 intptr_t ReadIntptrValue() { | |
192 int64_t value = Read<int64_t>(); | |
193 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); | |
194 return static_cast<intptr_t>(value); | |
195 } | |
196 | |
197 intptr_t ReadRawPointerValue() { | 190 intptr_t ReadRawPointerValue() { |
198 int64_t value = Read<int64_t>(); | 191 int64_t value = Read<int64_t>(); |
199 return static_cast<intptr_t>(value); | 192 return static_cast<intptr_t>(value); |
200 } | 193 } |
201 | 194 |
202 void ReadBytes(uint8_t* addr, intptr_t len) { | 195 void ReadBytes(uint8_t* addr, intptr_t len) { |
203 stream_.ReadBytes(addr, len); | 196 stream_.ReadBytes(addr, len); |
204 } | 197 } |
205 | 198 |
206 double ReadDouble() { | 199 double ReadDouble() { |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 // Size of the snapshot. | 426 // Size of the snapshot. |
434 intptr_t BytesWritten() const { return stream_.bytes_written(); } | 427 intptr_t BytesWritten() const { return stream_.bytes_written(); } |
435 | 428 |
436 // Writes raw data to the stream (basic type). | 429 // Writes raw data to the stream (basic type). |
437 // sizeof(T) must be in {1,2,4,8}. | 430 // sizeof(T) must be in {1,2,4,8}. |
438 template <typename T> | 431 template <typename T> |
439 void Write(T value) { | 432 void Write(T value) { |
440 WriteStream::Raw<sizeof(T), T>::Write(&stream_, value); | 433 WriteStream::Raw<sizeof(T), T>::Write(&stream_, value); |
441 } | 434 } |
442 | 435 |
443 // Writes an intptr_t type value out. | |
444 void WriteIntptrValue(intptr_t value) { | |
445 ASSERT((value >= kMinInt32) && (value <= kMaxInt32)); | |
446 Write<int64_t>(value); | |
447 } | |
448 | |
449 void WriteRawPointerValue(intptr_t value) { | 436 void WriteRawPointerValue(intptr_t value) { |
450 Write<int64_t>(value); | 437 Write<int64_t>(value); |
451 } | 438 } |
452 | 439 |
453 // Write an object that is serialized as an Id (singleton in object store, | 440 // Write an object that is serialized as an Id (singleton in object store, |
454 // or an object that was already serialized before). | 441 // or an object that was already serialized before). |
455 void WriteIndexedObject(intptr_t object_id) { | 442 void WriteIndexedObject(intptr_t object_id) { |
456 ASSERT(object_id <= kMaxObjectId); | 443 ASSERT(object_id <= kMaxObjectId); |
457 intptr_t value = 0; | 444 intptr_t value = 0; |
458 value = SerializedHeaderTag::update(kObjectId, value); | 445 value = SerializedHeaderTag::update(kObjectId, value); |
459 value = SerializedHeaderData::update(object_id, value); | 446 value = SerializedHeaderData::update(object_id, value); |
460 WriteIntptrValue(value); | 447 Write<int32_t>(value); |
461 } | 448 } |
462 | 449 |
463 // Write a VM Isolateobject that is serialized as an Id. | 450 // Write a VM Isolateobject that is serialized as an Id. |
464 void WriteVMIsolateObject(intptr_t object_id) { | 451 void WriteVMIsolateObject(intptr_t object_id) { |
465 ASSERT(object_id <= kMaxObjectId); | 452 ASSERT(object_id <= kMaxObjectId); |
466 intptr_t value = 0; | 453 intptr_t value = 0; |
467 value = SerializedHeaderTag::update(kObjectId, value); | 454 value = SerializedHeaderTag::update(kObjectId, value); |
468 value = SerializedHeaderData::update(object_id, value); | 455 value = SerializedHeaderData::update(object_id, value); |
469 WriteIntptrValue(-value); // Write as a negative value. | 456 Write<int32_t>(-value); // Write as a negative value. |
470 } | 457 } |
471 | 458 |
472 // Write serialization header information for an object. | 459 // Write serialization header information for an object. |
473 void WriteInlinedObjectHeader(intptr_t id) { | 460 void WriteInlinedObjectHeader(intptr_t id) { |
474 ASSERT(id <= kMaxObjectId); | 461 ASSERT(id <= kMaxObjectId); |
475 intptr_t value = 0; | 462 intptr_t value = 0; |
476 value = SerializedHeaderTag::update(kInlined, value); | 463 value = SerializedHeaderTag::update(kInlined, value); |
477 value = SerializedHeaderData::update(id, value); | 464 value = SerializedHeaderData::update(id, value); |
478 WriteIntptrValue(value); | 465 Write<int32_t>(value); |
479 } | 466 } |
480 | 467 |
481 void WriteTags(intptr_t tags) { | 468 void WriteTags(intptr_t tags) { |
482 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId); | 469 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId); |
483 const intptr_t flags = tags & 0xff; | 470 const intptr_t flags = tags & 0xff; |
484 Write<int8_t>(static_cast<int8_t>(flags)); | 471 Write<int8_t>(static_cast<int8_t>(flags)); |
485 } | 472 } |
486 | 473 |
487 // Write out a buffer of bytes. | 474 // Write out a buffer of bytes. |
488 void WriteBytes(const uint8_t* addr, intptr_t len) { | 475 void WriteBytes(const uint8_t* addr, intptr_t len) { |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 private: | 724 private: |
738 SnapshotWriter* writer_; | 725 SnapshotWriter* writer_; |
739 bool as_references_; | 726 bool as_references_; |
740 | 727 |
741 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); | 728 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
742 }; | 729 }; |
743 | 730 |
744 } // namespace dart | 731 } // namespace dart |
745 | 732 |
746 #endif // VM_SNAPSHOT_H_ | 733 #endif // VM_SNAPSHOT_H_ |
OLD | NEW |