Index: vm/snapshot.h |
=================================================================== |
--- vm/snapshot.h (revision 10306) |
+++ vm/snapshot.h (working copy) |
@@ -56,18 +56,23 @@ |
// Serialized object header encoding is as follows: |
// - Smi: the Smi value is written as is (last bit is not tagged). |
-// - VM internal type (from VM isolate): (index of type in vm isolate | 0x3) |
-// - Object that has already been written: (negative id in stream | 0x3) |
+// - VM object (from VM isolate): (object id in vm isolate | 0x3) |
+// This valus is serialized as a negative number. |
+// (note VM objects are never serialized they are expected to be found |
+// using ths unique ID assigned to them). |
+// - Reference to object that has already been written: (object id | 0x3) |
+// This valus is serialized as a positive number. |
// - Object that is seen for the first time (inlined in the stream): |
// (a unique id for this object | 0x1) |
enum SerializedHeaderType { |
- kInlined = 0x1, |
+ kInlined = 0x1, |
kObjectId = 0x3, |
}; |
static const int8_t kHeaderTagBits = 2; |
-static const int8_t kObjectIdTagBits = (kBitsPerWord - kHeaderTagBits); |
-static const intptr_t kMaxObjectId = (kIntptrMax >> kHeaderTagBits); |
+static const int8_t kObjectIdBits = (kBitsPerWord - (kHeaderTagBits + 1)); |
+static const intptr_t kMaxObjectId = (kUwordMax >> (kHeaderTagBits + 1)); |
+ |
class SerializedHeaderTag : public BitField<enum SerializedHeaderType, |
0, |
kHeaderTagBits> { |
@@ -76,7 +81,7 @@ |
class SerializedHeaderData : public BitField<intptr_t, |
kHeaderTagBits, |
- kObjectIdTagBits> { |
+ kObjectIdBits> { |
}; |
@@ -158,6 +163,15 @@ |
RawSmi* ReadAsSmi(); |
intptr_t ReadSmiValue(); |
+ // Negative header value indicates VM isolate object id. |
+ bool IsVMIsolateObject(intptr_t header_value) { return (header_value < 0); } |
+ intptr_t GetVMIsolateObjectId(intptr_t header_val) { |
+ ASSERT(IsVMIsolateObject(header_val)); |
+ intptr_t value = -header_val; // Header is negative for VM isolate objects. |
+ ASSERT(SerializedHeaderTag::decode(value) == kObjectId); |
+ return SerializedHeaderData::decode(value); |
+ } |
+ |
private: |
ReadStream stream_; // input stream. |
}; |
@@ -241,7 +255,10 @@ |
RawObject* ReadObjectImpl(intptr_t header); |
RawObject* ReadObjectRef(); |
- // Read an object that was serialized as an Id (singleton, object store, |
+ // Read a VM isolate object that was serialized as an Id. |
+ RawObject* ReadVMIsolateObject(intptr_t object_id); |
+ |
+ // Read an object that was serialized as an Id (singleton in object store, |
// or an object that was already serialized before). |
RawObject* ReadIndexedObject(intptr_t object_id); |
@@ -304,25 +321,30 @@ |
Write<int64_t>(value); |
} |
- // Write an object that is serialized as an Id (singleton, object store, |
+ // Write an object that is serialized as an Id (singleton in object store, |
// or an object that was already serialized before). |
void WriteIndexedObject(intptr_t object_id) { |
- WriteSerializationMarker(kObjectId, object_id); |
+ ASSERT(object_id <= kMaxObjectId); |
+ intptr_t value = 0; |
+ value = SerializedHeaderTag::update(kObjectId, value); |
+ value = SerializedHeaderData::update(object_id, value); |
+ WriteIntptrValue(value); |
} |
- // Write out object header value. |
- void WriteObjectHeader(intptr_t class_id, intptr_t tags) { |
- // Write out the class information. |
- WriteIndexedObject(class_id); |
- // Write out the tags information. |
- WriteIntptrValue(tags); |
+ // Write a VM Isolateobject that is serialized as an Id. |
+ void WriteVMIsolateObject(intptr_t object_id) { |
+ ASSERT(object_id <= kMaxObjectId); |
+ intptr_t value = 0; |
+ value = SerializedHeaderTag::update(kObjectId, value); |
+ value = SerializedHeaderData::update(object_id, value); |
+ WriteIntptrValue(-value); // Write as a negative value. |
} |
// Write serialization header information for an object. |
- void WriteSerializationMarker(SerializedHeaderType type, intptr_t id) { |
+ void WriteInlinedObjectHeader(intptr_t id) { |
ASSERT(id <= kMaxObjectId); |
intptr_t value = 0; |
- value = SerializedHeaderTag::update(type, value); |
+ value = SerializedHeaderTag::update(kInlined, value); |
value = SerializedHeaderData::update(id, value); |
WriteIntptrValue(value); |
} |
@@ -409,6 +431,7 @@ |
void UnmarkAll(); |
bool CheckAndWritePredefinedObject(RawObject* raw); |
+ void HandleVMIsolateObject(RawObject* raw); |
void WriteObjectRef(RawObject* raw); |
void WriteClassId(RawClass* cls); |