Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Unified Diff: runtime/vm/snapshot.cc

Issue 9303031: Add support for lists and backward references when decoding a message to a Dart_CObject object (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/snapshot_test.cc » ('j') | runtime/vm/snapshot_test.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698