Index: runtime/vm/snapshot.cc |
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc |
index d0317a1b3f0c862487559174bf2129029e38f9ec..6c47349e0dfe3a3238811bf0d14857bdf568ec05 100644 |
--- a/runtime/vm/snapshot.cc |
+++ b/runtime/vm/snapshot.cc |
@@ -725,6 +725,75 @@ void MessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { |
} |
+void MessageWriter::WriteSmi(int32_t value) { |
+ Write<RawObject*>(Smi::New(value)); |
+} |
+ |
+ |
+void MessageWriter::WriteCObject(Dart_CObject* object) { |
+ switch (object->type) { |
+ case Dart_CObject::kNull: |
+ WriteIndexedObject(Object::kNullObject); |
+ break; |
+ case Dart_CObject::kBool: |
+ if (object->value.as_bool) { |
+ WriteIndexedObject(ObjectStore::kTrueValue); |
+ } else { |
+ WriteIndexedObject(ObjectStore::kFalseValue); |
+ } |
+ break; |
+ case Dart_CObject::kInt32: { |
+ WriteSmi(object->value.as_int32); |
+ break; |
+ } |
+ case Dart_CObject::kDouble: |
+ // Write out the serialization header value for this object. |
+ WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id_); |
+ object_id_++; |
+ // Write out the class and tags information. |
+ WriteObjectHeader(ObjectStore::kDoubleClass, 0); |
+ Write<double>(object->value.as_double); |
+ break; |
+ case Dart_CObject::kString: { |
+ // Write out the serialization header value for this object. |
+ WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id_); |
+ object_id_++; |
+ char* str = object->value.as_string; |
+ intptr_t len = strlen(str); |
+ // Write out the class and tags information. |
+ WriteObjectHeader(ObjectStore::kOneByteStringClass, 0); |
+ WriteSmi(len); |
+ WriteSmi(0); // Hash - not written. |
+ for (intptr_t i = 0; i < len; i++) { |
+ Write<uint8_t>(str[i]); |
+ } |
+ break; |
+ } |
+ case Dart_CObject::kArray: |
+ // Write out the serialization header value for this object. |
+ WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id_); |
+ object_id_++; |
+ // Write out the class and tags information. |
+ WriteObjectHeader(ObjectStore::kArrayClass, 0); |
+ WriteSmi(object->value.as_array.length); |
+ // Write out the type arguments. |
+ WriteIndexedObject(Object::kNullObject); |
+ for (int i = 0; i < object->value.as_array.length; i++) { |
+ WriteCObject(object->value.as_array.values[i]); |
+ } |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+} |
+ |
+ |
+void MessageWriter::WriteCMessage(Dart_CObject* object) { |
+ WriteCObject(object); |
+ FinalizeBuffer(); |
+} |
+ |
+ |
void SnapshotWriter::WriteObject(RawObject* rawobj) { |
// An object is written in one of the following ways: |
// - Smi: the Smi value is written as is (last bit is not tagged). |