| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/assert.h" | 9 #include "vm/assert.h" |
| 10 #include "vm/bitfield.h" | 10 #include "vm/bitfield.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 }; | 52 }; |
| 53 | 53 |
| 54 | 54 |
| 55 // Structure capturing the raw snapshot. | 55 // Structure capturing the raw snapshot. |
| 56 class Snapshot { | 56 class Snapshot { |
| 57 public: | 57 public: |
| 58 static const int kHeaderSize = 2 * sizeof(int32_t); | 58 static const int kHeaderSize = 2 * sizeof(int32_t); |
| 59 static const int kLengthIndex = 0; | 59 static const int kLengthIndex = 0; |
| 60 static const int kSnapshotFlagIndex = 1; | 60 static const int kSnapshotFlagIndex = 1; |
| 61 | 61 |
| 62 static Snapshot* SetupFromBuffer(void* raw_memory); | 62 static const Snapshot* SetupFromBuffer(const void* raw_memory); |
| 63 | 63 |
| 64 // Getters. | 64 // Getters. |
| 65 uint8_t* content() { return content_; } | 65 const uint8_t* content() const { return content_; } |
| 66 int32_t length() const { return length_; } | 66 int32_t length() const { return length_; } |
| 67 | 67 |
| 68 bool IsPartialSnapshot() const { return full_snapshot_ == 0; } | 68 bool IsPartialSnapshot() const { return full_snapshot_ == 0; } |
| 69 bool IsFullSnapshot() const { return full_snapshot_ != 0; } | 69 bool IsFullSnapshot() const { return full_snapshot_ != 0; } |
| 70 int32_t Size() const { return length_ + sizeof(Snapshot); } | 70 int32_t Size() const { return length_ + sizeof(Snapshot); } |
| 71 uint8_t* Addr() { return reinterpret_cast<uint8_t*>(this); } | 71 uint8_t* Addr() { return reinterpret_cast<uint8_t*>(this); } |
| 72 | 72 |
| 73 static intptr_t length_offset() { return OFFSET_OF(Snapshot, length_); } | 73 static intptr_t length_offset() { return OFFSET_OF(Snapshot, length_); } |
| 74 static intptr_t full_snapshot_offset() { | 74 static intptr_t full_snapshot_offset() { |
| 75 return OFFSET_OF(Snapshot, full_snapshot_); | 75 return OFFSET_OF(Snapshot, full_snapshot_); |
| 76 } | 76 } |
| 77 | 77 |
| 78 private: | 78 private: |
| 79 Snapshot() : length_(0), full_snapshot_(0) {} | 79 Snapshot() : length_(0), full_snapshot_(0) {} |
| 80 | 80 |
| 81 int32_t length_; // Stream length. | 81 int32_t length_; // Stream length. |
| 82 int32_t full_snapshot_; // Classes are serialized too. | 82 int32_t full_snapshot_; // Classes are serialized too. |
| 83 uint8_t content_[]; // Stream content. | 83 uint8_t content_[]; // Stream content. |
| 84 | 84 |
| 85 DISALLOW_COPY_AND_ASSIGN(Snapshot); | 85 DISALLOW_COPY_AND_ASSIGN(Snapshot); |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 | 88 |
| 89 // Stream for reading various types from a buffer. | 89 // Stream for reading various types from a buffer. |
| 90 class ReadStream : public ValueObject { | 90 class ReadStream : public ValueObject { |
| 91 public: | 91 public: |
| 92 ReadStream(uint8_t* buffer, intptr_t size) : buffer_(buffer), | 92 ReadStream(const uint8_t* buffer, intptr_t size) : buffer_(buffer), |
| 93 current_(buffer), | 93 current_(buffer), |
| 94 end_(buffer + size) {} | 94 end_(buffer + size) {} |
| 95 | 95 |
| 96 private: | 96 private: |
| 97 template<typename T> | 97 template<typename T> |
| 98 T Read() { | 98 T Read() { |
| 99 uint8_t b = ReadByte(); | 99 uint8_t b = ReadByte(); |
| 100 if (b > kMaxSerializedUnsignedValuePerByte) { | 100 if (b > kMaxSerializedUnsignedValuePerByte) { |
| 101 return static_cast<T>(b) - kEndByteMarker; | 101 return static_cast<T>(b) - kEndByteMarker; |
| 102 } | 102 } |
| 103 T r = 0; | 103 T r = 0; |
| 104 uint8_t s = 0; | 104 uint8_t s = 0; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 return bit_cast<T>(st->Read<int64_t>()); | 144 return bit_cast<T>(st->Read<int64_t>()); |
| 145 } | 145 } |
| 146 }; | 146 }; |
| 147 | 147 |
| 148 uint8_t ReadByte() { | 148 uint8_t ReadByte() { |
| 149 ASSERT(current_ < end_); | 149 ASSERT(current_ < end_); |
| 150 return *current_++; | 150 return *current_++; |
| 151 } | 151 } |
| 152 | 152 |
| 153 private: | 153 private: |
| 154 uint8_t* buffer_; | 154 const uint8_t* buffer_; |
| 155 uint8_t* current_; | 155 const uint8_t* current_; |
| 156 uint8_t* end_; | 156 const uint8_t* end_; |
| 157 | 157 |
| 158 // SnapshotReader needs access to the private Raw classes. | 158 // SnapshotReader needs access to the private Raw classes. |
| 159 friend class SnapshotReader; | 159 friend class SnapshotReader; |
| 160 DISALLOW_COPY_AND_ASSIGN(ReadStream); | 160 DISALLOW_COPY_AND_ASSIGN(ReadStream); |
| 161 }; | 161 }; |
| 162 | 162 |
| 163 | 163 |
| 164 // Stream for writing various types into a buffer. | 164 // Stream for writing various types into a buffer. |
| 165 class WriteStream : public ValueObject { | 165 class WriteStream : public ValueObject { |
| 166 public: | 166 public: |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 // classes. | 259 // classes. |
| 260 friend class MessageWriter; | 260 friend class MessageWriter; |
| 261 friend class SnapshotWriter; | 261 friend class SnapshotWriter; |
| 262 DISALLOW_COPY_AND_ASSIGN(WriteStream); | 262 DISALLOW_COPY_AND_ASSIGN(WriteStream); |
| 263 }; | 263 }; |
| 264 | 264 |
| 265 | 265 |
| 266 // Reads a snapshot into objects. | 266 // Reads a snapshot into objects. |
| 267 class SnapshotReader { | 267 class SnapshotReader { |
| 268 public: | 268 public: |
| 269 SnapshotReader(Snapshot* snapshot, Heap* heap, ObjectStore* object_store) | 269 SnapshotReader(const Snapshot* snapshot, |
| 270 Heap* heap, |
| 271 ObjectStore* object_store) |
| 270 : stream_(snapshot->content(), snapshot->length()), | 272 : stream_(snapshot->content(), snapshot->length()), |
| 271 classes_serialized_(snapshot->IsFullSnapshot()), | 273 classes_serialized_(snapshot->IsFullSnapshot()), |
| 272 heap_(heap), | 274 heap_(heap), |
| 273 object_store_(object_store), | 275 object_store_(object_store), |
| 274 backward_references_() { } | 276 backward_references_() { } |
| 275 ~SnapshotReader() { } | 277 ~SnapshotReader() { } |
| 276 | 278 |
| 277 // Reads raw data (for basic types). | 279 // Reads raw data (for basic types). |
| 278 // sizeof(T) must be in {1,2,4,8}. | 280 // sizeof(T) must be in {1,2,4,8}. |
| 279 template <typename T> | 281 template <typename T> |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 | 448 |
| 447 private: | 449 private: |
| 448 SnapshotWriter* writer_; | 450 SnapshotWriter* writer_; |
| 449 | 451 |
| 450 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); | 452 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
| 451 }; | 453 }; |
| 452 | 454 |
| 453 } // namespace dart | 455 } // namespace dart |
| 454 | 456 |
| 455 #endif // VM_SNAPSHOT_H_ | 457 #endif // VM_SNAPSHOT_H_ |
| OLD | NEW |