Index: runtime/vm/snapshot.h |
=================================================================== |
--- runtime/vm/snapshot.h (revision 11409) |
+++ runtime/vm/snapshot.h (working copy) |
@@ -101,6 +101,10 @@ |
// Structure capturing the raw snapshot. |
+// |
+// TODO(turnidge): Remove this class once the snapshot does not have a |
+// header anymore. This is pending on making the embedder pass in the |
+// length of their snapshot. |
class Snapshot { |
public: |
enum Kind { |
@@ -123,7 +127,6 @@ |
bool IsMessageSnapshot() const { return kind_ == kMessage; } |
bool IsScriptSnapshot() const { return kind_ == kScript; } |
bool IsFullSnapshot() const { return kind_ == kFull; } |
- int32_t Size() const { return length_ + sizeof(Snapshot); } |
uint8_t* Addr() { return reinterpret_cast<uint8_t*>(this); } |
static intptr_t length_offset() { return OFFSET_OF(Snapshot, length_); } |
@@ -183,7 +186,10 @@ |
// Reads a snapshot into objects. |
class SnapshotReader : public BaseReader { |
public: |
- SnapshotReader(const Snapshot* snapshot, Isolate* isolate); |
+ SnapshotReader(const uint8_t* buffer, |
+ intptr_t size, |
+ Snapshot::Kind kind, |
+ Isolate* isolate); |
~SnapshotReader() { } |
Isolate* isolate() const { return isolate_; } |
@@ -364,24 +370,24 @@ |
stream_.WriteBytes(addr, len); |
} |
- // Finalize the serialized buffer by filling in the header information |
- // which comprises of a flag(snaphot kind) and the length of |
- // serialzed bytes. |
- void FinalizeBuffer(Snapshot::Kind kind) { |
- int32_t* data = reinterpret_cast<int32_t*>(stream_.buffer()); |
- data[Snapshot::kLengthIndex] = stream_.bytes_written(); |
- data[Snapshot::kSnapshotFlagIndex] = kind; |
- } |
- |
protected: |
BaseWriter(uint8_t** buffer, ReAlloc alloc) : stream_(buffer, alloc) { |
ASSERT(buffer != NULL); |
ASSERT(alloc != NULL); |
- // Make room for recording snapshot buffer size. |
- stream_.set_current(*buffer + Snapshot::kHeaderSize); |
} |
~BaseWriter() { } |
+ void ReserveHeader() { |
+ // Make room for recording snapshot buffer size. |
+ stream_.set_current(stream_.buffer() + Snapshot::kHeaderSize); |
+ } |
+ |
+ void FillHeader(Snapshot::Kind kind) { |
+ int32_t* data = reinterpret_cast<int32_t*>(stream_.buffer()); |
+ data[Snapshot::kLengthIndex] = stream_.bytes_written(); |
+ data[Snapshot::kSnapshotFlagIndex] = kind; |
+ } |
+ |
private: |
WriteStream stream_; |
@@ -390,7 +396,7 @@ |
class SnapshotWriter : public BaseWriter { |
- public: |
+ protected: |
SnapshotWriter(Snapshot::Kind kind, uint8_t** buffer, ReAlloc alloc) |
: BaseWriter(buffer, alloc), |
kind_(kind), |
@@ -398,28 +404,17 @@ |
class_table_(Isolate::Current()->class_table()), |
forward_list_() { |
} |
- ~SnapshotWriter() { } |
+ public: |
// Snapshot kind. |
Snapshot::Kind kind() const { return kind_; } |
- // Finalize the serialized buffer by filling in the header information |
- // which comprises of a flag(full/partial snaphot) and the length of |
- // serialzed bytes. |
- void FinalizeBuffer() { |
- BaseWriter::FinalizeBuffer(kind_); |
- UnmarkAll(); |
- } |
- |
// Serialize an object into the buffer. |
void WriteObject(RawObject* raw); |
- // Writes a full snapshot of the Isolate. |
- void WriteFullSnapshot(); |
- |
uword GetObjectTags(RawObject* raw); |
- private: |
+ protected: |
class ForwardObjectNode : public ZoneAllocated { |
public: |
ForwardObjectNode(RawObject* raw, uword tags, SerializeState state) |
@@ -457,6 +452,7 @@ |
ObjectStore* object_store() const { return object_store_; } |
+ private: |
Snapshot::Kind kind_; |
ObjectStore* object_store_; // Object store for common classes. |
ClassTable* class_table_; // Class table for the class index to class lookup. |
@@ -477,6 +473,23 @@ |
}; |
+class FullSnapshotWriter : public SnapshotWriter { |
+ public: |
+ FullSnapshotWriter(uint8_t** buffer, ReAlloc alloc) |
+ : SnapshotWriter(Snapshot::kFull, buffer, alloc) { |
+ ASSERT(buffer != NULL); |
+ ASSERT(alloc != NULL); |
+ } |
+ ~FullSnapshotWriter() { } |
+ |
+ // Writes a full snapshot of the Isolate. |
+ void WriteFullSnapshot(); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); |
+}; |
+ |
+ |
class ScriptSnapshotWriter : public SnapshotWriter { |
public: |
ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) |
@@ -494,6 +507,22 @@ |
}; |
+class MessageWriter : public SnapshotWriter { |
+ public: |
+ MessageWriter(uint8_t** buffer, ReAlloc alloc) |
+ : SnapshotWriter(Snapshot::kMessage, buffer, alloc) { |
+ ASSERT(buffer != NULL); |
+ ASSERT(alloc != NULL); |
+ } |
+ ~MessageWriter() { } |
+ |
+ void WriteMessage(const Object& obj); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MessageWriter); |
+}; |
+ |
+ |
// An object pointer visitor implementation which writes out |
// objects to a snap shot. |
class SnapshotWriterVisitor : public ObjectPointerVisitor { |