Index: vm/snapshot.h |
=================================================================== |
--- vm/snapshot.h (revision 8515) |
+++ vm/snapshot.h (working copy) |
@@ -18,11 +18,13 @@ |
// Forward declarations. |
class AbstractType; |
class AbstractTypeArguments; |
+class Array; |
class Class; |
class Heap; |
class Library; |
class Object; |
class ObjectStore; |
+class RawAbstractTypeArguments; |
class RawArray; |
class RawBigint; |
class RawClass; |
@@ -84,6 +86,18 @@ |
}; |
+enum DeserializeState { |
+ kIsDeserialized = 0, |
+ kIsNotDeserialized = 1, |
+}; |
+ |
+ |
+enum SerializeState { |
+ kIsSerialized = 0, |
+ kIsNotSerialized = 1, |
+}; |
+ |
+ |
// Structure capturing the raw snapshot. |
class Snapshot { |
public: |
@@ -355,11 +369,12 @@ |
// Reads an object. |
RawObject* ReadObject(); |
- RawClass* ReadClassId(intptr_t object_id); |
- |
// Add object to backward references. |
- void AddBackwardReference(intptr_t id, Object* obj); |
+ void AddBackRef(intptr_t id, Object* obj, DeserializeState state); |
+ // Get an object from the backward references list. |
+ Object* GetBackRef(intptr_t id); |
+ |
// Read a full snap shot. |
void ReadFullSnapshot(); |
@@ -390,11 +405,28 @@ |
RawGrowableObjectArray* NewGrowableObjectArray(); |
private: |
+ class BackRefNode : public ZoneAllocated { |
+ public: |
+ BackRefNode(Object* reference, DeserializeState state) |
+ : reference_(reference), state_(state) {} |
+ Object* reference() const { return reference_; } |
+ bool is_deserialized() const { return state_ == kIsDeserialized; } |
+ void set_state(DeserializeState state) { state_ = state; } |
+ |
+ private: |
+ Object* reference_; |
+ DeserializeState state_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BackRefNode); |
+ }; |
+ |
// Allocate uninitialized objects, this is used when reading a full snapshot. |
RawObject* AllocateUninitialized(const Class& cls, intptr_t size); |
- // Internal implementation of ReadObject once the header value is read. |
+ RawClass* ReadClassId(intptr_t object_id); |
+ RawObject* ReadObjectImpl(); |
RawObject* ReadObjectImpl(intptr_t header); |
+ RawObject* ReadObjectRef(); |
// Read an object that was serialized as an Id (singleton, object store, |
// or an object that was already serialized before). |
@@ -406,6 +438,8 @@ |
// Based on header field check to see if it is an internal VM class. |
RawClass* LookupInternalClass(intptr_t class_header); |
+ void ArrayReadFrom(const Array& result, intptr_t len, intptr_t tags); |
+ |
Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message). |
Isolate* isolate_; // Current isolate. |
Class& cls_; // Temporary Class handle. |
@@ -414,8 +448,27 @@ |
Library& library_; // Temporary library handle. |
AbstractType& type_; // Temporary type handle. |
AbstractTypeArguments& type_arguments_; // Temporary type argument handle. |
- GrowableArray<Object*> backward_references_; |
+ GrowableArray<BackRefNode*> backward_references_; |
+ friend class Array; |
+ friend class Class; |
+ friend class Context; |
+ friend class ContextScope; |
+ friend class Field; |
+ friend class Function; |
+ friend class GrowableObjectArray; |
+ friend class ImmutableArray; |
+ friend class InstantiatedTypeArguments; |
+ friend class JSRegExp; |
+ friend class Library; |
+ friend class LibraryPrefix; |
+ friend class LiteralToken; |
+ friend class Script; |
+ friend class TokenStream; |
+ friend class Type; |
+ friend class TypeArguments; |
+ friend class TypeParameter; |
+ friend class UnresolvedClass; |
DISALLOW_COPY_AND_ASSIGN(SnapshotReader); |
}; |
@@ -508,11 +561,6 @@ |
// Serialize an object into the buffer. |
void WriteObject(RawObject* raw); |
- void WriteClassId(RawClass* cls); |
- |
- // Unmark all objects that were marked as forwarded for serializing. |
- void UnmarkAll(); |
- |
// Writes a full snapshot of the Isolate. |
void WriteFullSnapshot(); |
@@ -521,22 +569,37 @@ |
private: |
class ForwardObjectNode : public ZoneAllocated { |
public: |
- ForwardObjectNode(RawObject* raw, uword tags) : raw_(raw), tags_(tags) {} |
+ ForwardObjectNode(RawObject* raw, uword tags, SerializeState state) |
+ : raw_(raw), tags_(tags), state_(state) {} |
RawObject* raw() const { return raw_; } |
uword tags() const { return tags_; } |
+ bool is_serialized() const { return state_ == kIsSerialized; } |
+ void set_state(SerializeState value) { state_ = value; } |
private: |
RawObject* raw_; |
uword tags_; |
+ SerializeState state_; |
DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode); |
}; |
- intptr_t MarkObject(RawObject* raw); |
+ intptr_t MarkObject(RawObject* raw, SerializeState state); |
+ void UnmarkAll(); |
bool CheckAndWritePredefinedObject(RawObject* raw); |
+ void WriteObjectRef(RawObject* raw); |
+ void WriteClassId(RawClass* cls); |
+ void WriteObjectImpl(RawObject* raw); |
void WriteInlinedObject(RawObject* raw); |
+ void WriteForwardedObjects(); |
+ void ArrayWriteTo(intptr_t object_id, |
+ intptr_t array_kind, |
+ intptr_t tags, |
+ RawSmi* length, |
+ RawAbstractTypeArguments* type_arguments, |
+ RawObject* data[]); |
ObjectStore* object_store() const { return object_store_; } |
@@ -545,6 +608,17 @@ |
ClassTable* class_table_; // Class table for the class index to class lookup. |
GrowableArray<ForwardObjectNode*> forward_list_; |
+ friend class RawArray; |
+ friend class RawClass; |
+ friend class RawGrowableObjectArray; |
+ friend class RawImmutableArray; |
+ friend class RawJSRegExp; |
+ friend class RawLibrary; |
+ friend class RawLiteralToken; |
+ friend class RawScript; |
+ friend class RawTokenStream; |
+ friend class RawTypeArguments; |
+ friend class SnapshotWriterVisitor; |
DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); |
}; |
@@ -571,12 +645,20 @@ |
class SnapshotWriterVisitor : public ObjectPointerVisitor { |
public: |
explicit SnapshotWriterVisitor(SnapshotWriter* writer) |
- : ObjectPointerVisitor(Isolate::Current()), writer_(writer) {} |
+ : ObjectPointerVisitor(Isolate::Current()), |
+ writer_(writer), |
+ as_references_(true) {} |
+ SnapshotWriterVisitor(SnapshotWriter* writer, bool as_references) |
+ : ObjectPointerVisitor(Isolate::Current()), |
+ writer_(writer), |
+ as_references_(as_references) {} |
+ |
virtual void VisitPointers(RawObject** first, RawObject** last); |
private: |
SnapshotWriter* writer_; |
+ bool as_references_; |
DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
}; |