| 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).
|
|
|