Index: vm/dart_api_message.h |
=================================================================== |
--- vm/dart_api_message.h (revision 8515) |
+++ vm/dart_api_message.h (working copy) |
@@ -33,6 +33,22 @@ |
Dart_CObject* ReadMessage(); |
private: |
+ class BackRefNode { |
+ public: |
+ BackRefNode(Dart_CObject* reference, DeserializeState state) |
+ : reference_(reference), state_(state) {} |
+ Dart_CObject* reference() const { return reference_; } |
+ void set_reference(Dart_CObject* reference) { reference_ = reference; } |
+ bool is_deserialized() const { return state_ == kIsDeserialized; } |
+ void set_state(DeserializeState value) { state_ = value; } |
+ |
+ private: |
+ Dart_CObject* reference_; |
+ DeserializeState state_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BackRefNode); |
+ }; |
+ |
// Allocates a Dart_CObject object. |
Dart_CObject* AllocateDartCObject(); |
// Allocates a Dart_CObject object with the specified type. |
@@ -58,18 +74,25 @@ |
Dart_CObject* AllocateDartCObjectUint8Array(intptr_t length); |
// Allocates a C array of Dart_CObject objects. |
Dart_CObject* AllocateDartCObjectArray(intptr_t length); |
+ // Allocates a backwards reference node. |
+ BackRefNode* AllocateBackRefNode(Dart_CObject* ref, DeserializeState state); |
void Init(); |
intptr_t LookupInternalClass(intptr_t class_header); |
+ Dart_CObject* ReadInternalVMObject(intptr_t class_id, intptr_t object_id); |
Dart_CObject* ReadInlinedObject(intptr_t object_id); |
- Dart_CObject* ReadObjectImpl(intptr_t header); |
+ Dart_CObject* ReadObjectImpl(); |
Dart_CObject* ReadIndexedObject(intptr_t object_id); |
+ Dart_CObject* ReadObjectRef(); |
Dart_CObject* ReadObject(); |
// Add object to backward references. |
- void AddBackwardReference(intptr_t id, Dart_CObject* obj); |
+ void AddBackRef(intptr_t id, Dart_CObject* obj, DeserializeState state); |
+ // Get an object from the backward references list. |
+ Dart_CObject* GetBackRef(intptr_t id); |
+ |
Dart_CObject_Internal* AsInternal(Dart_CObject* object) { |
ASSERT(object->type >= Dart_CObject::kNumberOfTypes); |
return reinterpret_cast<Dart_CObject_Internal*>(object); |
@@ -79,7 +102,7 @@ |
// either in the supplied zone or using the supplied allocation |
// function. |
ReAlloc alloc_; |
- ApiGrowableArray<Dart_CObject*> backward_references_; |
+ ApiGrowableArray<BackRefNode*> backward_references_; |
Dart_CObject type_arguments_marker; |
Dart_CObject dynamic_type_marker; |
@@ -89,10 +112,13 @@ |
class ApiMessageWriter : public BaseWriter { |
public: |
ApiMessageWriter(uint8_t** buffer, ReAlloc alloc) |
- : BaseWriter(buffer, alloc), object_id_(0) { |
+ : BaseWriter(buffer, alloc), object_id_(0), |
+ forward_list_(NULL), forward_list_length_(0), forward_id_(0) { |
ASSERT(kDartCObjectTypeMask >= Dart_CObject::kNumberOfTypes - 1); |
} |
- ~ApiMessageWriter() { } |
+ ~ApiMessageWriter() { |
+ delete forward_list_; |
+ } |
// Writes a message of integers. |
void WriteMessage(intptr_t field_count, intptr_t *data); |
@@ -114,6 +140,7 @@ |
bool IsCObjectMarked(Dart_CObject* object); |
intptr_t GetMarkedCObjectMark(Dart_CObject* object); |
void UnmarkAllCObjects(Dart_CObject* object); |
+ void AddToForwardList(Dart_CObject* object); |
void WriteSmi(int64_t value); |
void WriteMint(Dart_CObject* object, int64_t value); |
@@ -121,8 +148,14 @@ |
void WriteInt64(Dart_CObject* object); |
void WriteInlinedHeader(Dart_CObject* object); |
void WriteCObject(Dart_CObject* object); |
+ void WriteCObjectRef(Dart_CObject* object); |
+ void WriteForwardedCObject(Dart_CObject* object); |
+ void WriteCObjectInlined(Dart_CObject* object, Dart_CObject::Type type); |
intptr_t object_id_; |
+ Dart_CObject** forward_list_; |
+ intptr_t forward_list_length_; |
+ intptr_t forward_id_; |
DISALLOW_COPY_AND_ASSIGN(ApiMessageWriter); |
}; |