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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 // using ths unique ID assigned to them). | 81 // using ths unique ID assigned to them). |
82 // - Reference to object that has already been written: (object id | 0x3) | 82 // - Reference to object that has already been written: (object id | 0x3) |
83 // This valus is serialized as a positive number. | 83 // This valus is serialized as a positive number. |
84 // - Object that is seen for the first time (inlined in the stream): | 84 // - Object that is seen for the first time (inlined in the stream): |
85 // (a unique id for this object | 0x1) | 85 // (a unique id for this object | 0x1) |
86 enum SerializedHeaderType { | 86 enum SerializedHeaderType { |
87 kInlined = 0x1, | 87 kInlined = 0x1, |
88 kObjectId = 0x3, | 88 kObjectId = 0x3, |
89 }; | 89 }; |
90 static const int8_t kHeaderTagBits = 2; | 90 static const int8_t kHeaderTagBits = 2; |
91 static const int8_t kObjectIdBits = (kBitsPerWord - (kHeaderTagBits + 1)); | 91 static const int8_t kObjectIdBits = (kBitsPerInt32 - (kHeaderTagBits + 1)); |
92 static const intptr_t kMaxObjectId = (kUwordMax >> (kHeaderTagBits + 1)); | 92 static const intptr_t kMaxObjectId = (kMaxUint32 >> (kHeaderTagBits + 1)); |
93 | 93 |
94 | 94 |
95 class SerializedHeaderTag : public BitField<enum SerializedHeaderType, | 95 class SerializedHeaderTag : public BitField<enum SerializedHeaderType, |
96 0, | 96 0, |
97 kHeaderTagBits> { | 97 kHeaderTagBits> { |
98 }; | 98 }; |
99 | 99 |
100 | 100 |
101 class SerializedHeaderData : public BitField<intptr_t, | 101 class SerializedHeaderData : public BitField<intptr_t, |
102 kHeaderTagBits, | 102 kHeaderTagBits, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 class BaseReader { | 167 class BaseReader { |
168 public: | 168 public: |
169 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {} | 169 BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {} |
170 // Reads raw data (for basic types). | 170 // Reads raw data (for basic types). |
171 // sizeof(T) must be in {1,2,4,8}. | 171 // sizeof(T) must be in {1,2,4,8}. |
172 template <typename T> | 172 template <typename T> |
173 T Read() { | 173 T Read() { |
174 return ReadStream::Raw<sizeof(T), T>::Read(&stream_); | 174 return ReadStream::Raw<sizeof(T), T>::Read(&stream_); |
175 } | 175 } |
176 | 176 |
177 // Reads an intptr_t type value. | |
178 intptr_t ReadIntptrValue() { | |
179 int64_t value = Read<int64_t>(); | |
180 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); | |
181 return static_cast<intptr_t>(value); | |
182 } | |
183 | |
184 intptr_t ReadRawPointerValue() { | 177 intptr_t ReadRawPointerValue() { |
185 int64_t value = Read<int64_t>(); | 178 int64_t value = Read<int64_t>(); |
186 return static_cast<intptr_t>(value); | 179 return static_cast<intptr_t>(value); |
187 } | 180 } |
188 | 181 |
189 void ReadBytes(uint8_t* addr, intptr_t len) { | 182 void ReadBytes(uint8_t* addr, intptr_t len) { |
190 stream_.ReadBytes(addr, len); | 183 stream_.ReadBytes(addr, len); |
191 } | 184 } |
192 | 185 |
193 double ReadDouble() { | 186 double ReadDouble() { |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 // Size of the snapshot. | 393 // Size of the snapshot. |
401 intptr_t BytesWritten() const { return stream_.bytes_written(); } | 394 intptr_t BytesWritten() const { return stream_.bytes_written(); } |
402 | 395 |
403 // Writes raw data to the stream (basic type). | 396 // Writes raw data to the stream (basic type). |
404 // sizeof(T) must be in {1,2,4,8}. | 397 // sizeof(T) must be in {1,2,4,8}. |
405 template <typename T> | 398 template <typename T> |
406 void Write(T value) { | 399 void Write(T value) { |
407 WriteStream::Raw<sizeof(T), T>::Write(&stream_, value); | 400 WriteStream::Raw<sizeof(T), T>::Write(&stream_, value); |
408 } | 401 } |
409 | 402 |
410 // Writes an intptr_t type value out. | |
411 void WriteIntptrValue(intptr_t value) { | |
412 ASSERT((value >= kMinInt32) && (value <= kMaxInt32)); | |
413 Write<int64_t>(value); | |
414 } | |
415 | |
416 void WriteRawPointerValue(intptr_t value) { | 403 void WriteRawPointerValue(intptr_t value) { |
417 Write<int64_t>(value); | 404 Write<int64_t>(value); |
418 } | 405 } |
419 | 406 |
420 // Write an object that is serialized as an Id (singleton in object store, | 407 // Write an object that is serialized as an Id (singleton in object store, |
421 // or an object that was already serialized before). | 408 // or an object that was already serialized before). |
422 void WriteIndexedObject(intptr_t object_id) { | 409 void WriteIndexedObject(intptr_t object_id) { |
423 ASSERT(object_id <= kMaxObjectId); | 410 ASSERT(object_id <= kMaxObjectId); |
424 intptr_t value = 0; | 411 intptr_t value = 0; |
425 value = SerializedHeaderTag::update(kObjectId, value); | 412 value = SerializedHeaderTag::update(kObjectId, value); |
426 value = SerializedHeaderData::update(object_id, value); | 413 value = SerializedHeaderData::update(object_id, value); |
427 WriteIntptrValue(value); | 414 Write<int32_t>(value); |
428 } | 415 } |
429 | 416 |
430 // Write a VM Isolateobject that is serialized as an Id. | 417 // Write a VM Isolateobject that is serialized as an Id. |
431 void WriteVMIsolateObject(intptr_t object_id) { | 418 void WriteVMIsolateObject(intptr_t object_id) { |
432 ASSERT(object_id <= kMaxObjectId); | 419 ASSERT(object_id <= kMaxObjectId); |
433 intptr_t value = 0; | 420 intptr_t value = 0; |
434 value = SerializedHeaderTag::update(kObjectId, value); | 421 value = SerializedHeaderTag::update(kObjectId, value); |
435 value = SerializedHeaderData::update(object_id, value); | 422 value = SerializedHeaderData::update(object_id, value); |
436 WriteIntptrValue(-value); // Write as a negative value. | 423 Write<int32_t>(-value); // Write as a negative value. |
437 } | 424 } |
438 | 425 |
439 // Write serialization header information for an object. | 426 // Write serialization header information for an object. |
440 void WriteInlinedObjectHeader(intptr_t id) { | 427 void WriteInlinedObjectHeader(intptr_t id) { |
441 ASSERT(id <= kMaxObjectId); | 428 ASSERT(id <= kMaxObjectId); |
442 intptr_t value = 0; | 429 intptr_t value = 0; |
443 value = SerializedHeaderTag::update(kInlined, value); | 430 value = SerializedHeaderTag::update(kInlined, value); |
444 value = SerializedHeaderData::update(id, value); | 431 value = SerializedHeaderData::update(id, value); |
445 WriteIntptrValue(value); | 432 Write<int32_t>(value); |
446 } | 433 } |
447 | 434 |
448 void WriteTags(intptr_t tags) { | 435 void WriteTags(intptr_t tags) { |
449 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId); | 436 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId); |
450 const intptr_t flags = tags & 0xff; | 437 const intptr_t flags = tags & 0xff; |
451 Write<int8_t>(static_cast<int8_t>(flags)); | 438 Write<int8_t>(static_cast<int8_t>(flags)); |
452 } | 439 } |
453 | 440 |
454 // Write out a buffer of bytes. | 441 // Write out a buffer of bytes. |
455 void WriteBytes(const uint8_t* addr, intptr_t len) { | 442 void WriteBytes(const uint8_t* addr, intptr_t len) { |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 private: | 647 private: |
661 SnapshotWriter* writer_; | 648 SnapshotWriter* writer_; |
662 bool as_references_; | 649 bool as_references_; |
663 | 650 |
664 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); | 651 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
665 }; | 652 }; |
666 | 653 |
667 } // namespace dart | 654 } // namespace dart |
668 | 655 |
669 #endif // VM_SNAPSHOT_H_ | 656 #endif // VM_SNAPSHOT_H_ |
OLD | NEW |