Index: runtime/vm/snapshot.cc |
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc |
index 2278e4c2fe5928ab88dcdd957633ec7f34eff35a..d0317a1b3f0c862487559174bf2129029e38f9ec 100644 |
--- a/runtime/vm/snapshot.cc |
+++ b/runtime/vm/snapshot.cc |
@@ -437,12 +437,22 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) { |
} |
+static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
+ return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); |
+} |
+ |
+ |
CMessageReader::CMessageReader(const uint8_t* buffer, |
intptr_t length, |
ReAlloc alloc) |
: BaseReader(buffer, length), |
alloc_(alloc), |
- backward_references_(kNumInitialReferences) { |
+ backward_references_(kNumInitialReferences), |
+ allocated_(kNumInitialReferences * 2), |
+ original_message_(buffer), |
+ original_message_length_(length) { |
+ // Use default allocator if none specified. |
+ if (alloc_ == NULL) alloc_ = allocator; |
// Initialize marker objects used to handle Lists. |
// TODO(sjesse): Remove this when message serialization format is |
// updated. |
@@ -455,6 +465,26 @@ CMessageReader::CMessageReader(const uint8_t* buffer, |
} |
+Dart_CMessage* CMessageReader::ReadMessage() { |
+ // Read the object out of the message. |
+ Dart_CObject* object = ReadObject(); |
+ |
+ intptr_t size = |
+ sizeof(Dart_CMessage) + allocated_.length() * sizeof(Dart_CObject*); // NOLINT |
+ Dart_CMessage* message = |
+ reinterpret_cast<Dart_CMessage*>(alloc_(NULL, 0, size)); |
+ message->allocated = reinterpret_cast<Dart_CObject**>(message + 1); |
+ if (message == NULL) return NULL; |
siva
2012/02/01 01:48:36
The null check for message should happen before me
Søren Gjesse
2012/02/01 12:12:23
Done.
|
+ message->object = object; |
+ message->allocated_length = allocated_.length(); |
+ for (int i = 0; i < allocated_.length(); i++) { |
+ message->allocated[i] = allocated_[i]; |
+ } |
siva
2012/02/01 01:48:36
Not sure if we need to do this copying over here.
Søren Gjesse
2012/02/01 12:12:23
Only needed if pointing back into the message and
|
+ message->original_message = const_cast<uint8_t*>(original_message_); |
+ message->original_message_length = original_message_length_; |
+ return message; |
+} |
+ |
intptr_t CMessageReader::LookupInternalClass(intptr_t class_header) { |
SerializedHeaderType header_type = SerializedHeaderTag::decode(class_header); |
ASSERT(header_type == kObjectId); |
@@ -467,6 +497,7 @@ Dart_CObject* CMessageReader::AllocateDartCObject(Dart_CObject::Type type) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>( |
alloc_(NULL, 0, sizeof(Dart_CObject))); |
+ allocated_.Add(value); |
value->type = type; |
return value; |
} |
@@ -505,6 +536,7 @@ Dart_CObject* CMessageReader::AllocateDartCObjectString(intptr_t length) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>( |
alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1)); |
+ allocated_.Add(value); |
value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value); |
value->type = Dart_CObject::kString; |
return value; |
@@ -518,6 +550,7 @@ Dart_CObject* CMessageReader::AllocateDartCObjectArray(intptr_t length) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>( |
alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value))); |
+ allocated_.Add(value); |
value->type = Dart_CObject::kArray; |
value->value.as_array.length = length; |
if (length > 0) { |