Index: runtime/vm/snapshot.cc |
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc |
index d1d4055eda8cd5efa0b4548382cfce1ae64cec6b..2278e4c2fe5928ab88dcdd957633ec7f34eff35a 100644 |
--- a/runtime/vm/snapshot.cc |
+++ b/runtime/vm/snapshot.cc |
@@ -440,7 +440,9 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) { |
CMessageReader::CMessageReader(const uint8_t* buffer, |
intptr_t length, |
ReAlloc alloc) |
- : BaseReader(buffer, length), alloc_(alloc) { |
+ : BaseReader(buffer, length), |
+ alloc_(alloc), |
+ backward_references_(kNumInitialReferences) { |
// Initialize marker objects used to handle Lists. |
// TODO(sjesse): Remove this when message serialization format is |
// updated. |
@@ -548,6 +550,7 @@ Dart_CObject* CMessageReader::ReadInlinedObject(intptr_t object_id) { |
case Object::kTypeArgumentsClass: { |
// TODO(sjesse): Remove this when message serialization format is |
// updated (currently length is leaked). |
+ AddBackwardReference(object_id, NULL); |
Dart_CObject* length = ReadObject(); |
ASSERT(length->type == Dart_CObject::kInt32); |
for (int i = 0; i < length->value.as_int32; i++) { |
@@ -559,6 +562,8 @@ Dart_CObject* CMessageReader::ReadInlinedObject(intptr_t object_id) { |
} |
case ObjectStore::kArrayClass: { |
intptr_t len = ReadSmiValue(); |
+ Dart_CObject* value = AllocateDartCObjectArray(len); |
+ AddBackwardReference(object_id, value); |
// Skip type arguments. |
// TODO(sjesse): Remove this when message serialization format is |
// updated (currently type_arguments is leaked). |
@@ -567,7 +572,6 @@ Dart_CObject* CMessageReader::ReadInlinedObject(intptr_t object_id) { |
type_arguments->type != Dart_CObject::kNull) { |
return NULL; |
} |
- Dart_CObject* value = AllocateDartCObjectArray(len); |
for (int i = 0; i < len; i++) { |
value->value.as_array.values[i] = ReadObject(); |
} |
@@ -576,21 +580,24 @@ Dart_CObject* CMessageReader::ReadInlinedObject(intptr_t object_id) { |
} |
case ObjectStore::kDoubleClass: { |
// Read the double value for the object. |
- return AllocateDartCObjectDouble(Read<double>()); |
+ Dart_CObject* object = AllocateDartCObjectDouble(Read<double>()); |
+ AddBackwardReference(object_id, object); |
+ return object; |
break; |
} |
case ObjectStore::kOneByteStringClass: { |
intptr_t len = ReadSmiValue(); |
intptr_t hash = ReadSmiValue(); |
USE(hash); |
- Dart_CObject* value = AllocateDartCObjectString(len); |
- char* p = value->value.as_string; |
+ Dart_CObject* object = AllocateDartCObjectString(len); |
+ AddBackwardReference(object_id, object); |
+ char* p = object->value.as_string; |
for (intptr_t i = 0; i < len; i++) { |
*p = Read<uint8_t>(); |
p++; |
} |
*p = '\0'; |
- return value; |
+ return object; |
break; |
} |
case ObjectStore::kTwoByteStringClass: |
@@ -624,7 +631,10 @@ Dart_CObject* CMessageReader::ReadIndexedObject(intptr_t object_id) { |
return &dynamic_type_marker; |
} else { |
// TODO(sgjesse): Handle back-references. |
siva
2012/02/02 04:01:57
You are handling backward references now, the TODO
Søren Gjesse
2012/02/02 09:59:49
Done.
|
- printf("Indexed object %d\n", object_id); |
+ intptr_t index = object_id - kMaxPredefinedObjectIds; |
+ ASSERT(index < backward_references_.length()); |
+ ASSERT(backward_references_[index] != NULL); |
+ return backward_references_[index]; |
UNREACHABLE(); |
siva
2012/02/02 04:01:57
Is the UNREACHABLE needed?
Søren Gjesse
2012/02/02 09:59:49
No, removed.
|
} |
return NULL; |
@@ -654,6 +664,12 @@ Dart_CObject* CMessageReader::ReadObject() { |
} |
+void CMessageReader::AddBackwardReference(intptr_t id, Dart_CObject* obj) { |
+ ASSERT((id - kMaxPredefinedObjectIds) == backward_references_.length()); |
+ backward_references_.Add(obj); |
+} |
+ |
+ |
void MessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { |
// Write out the serialization header value for this object. |
WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds); |