| Index: runtime/vm/snapshot.cc | 
| diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc | 
| index e4c757dfe0b5c4a414046f6fb4ef5b288161a305..e83a129293f3ddd2bf87a5af33db70ea1943e3dc 100644 | 
| --- a/runtime/vm/snapshot.cc | 
| +++ b/runtime/vm/snapshot.cc | 
| @@ -500,7 +500,7 @@ RawObject* SnapshotReader::ReadObjectRef(intptr_t object_id, | 
| switch (class_id) { | 
| #define SNAPSHOT_READ(clazz)                                                   \ | 
| case clazz::kClassId: {                                                    \ | 
| -      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_);                   \ | 
| +      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_, true);             \ | 
| break;                                                                   \ | 
| } | 
| CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) | 
| @@ -510,7 +510,7 @@ RawObject* SnapshotReader::ReadObjectRef(intptr_t object_id, | 
|  | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| tags = RawObject::ClassIdTag::update(class_id, tags); | 
| -      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_); | 
| +      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_, true); | 
| break; | 
| } | 
| #undef SNAPSHOT_READ | 
| @@ -519,7 +519,7 @@ RawObject* SnapshotReader::ReadObjectRef(intptr_t object_id, | 
|  | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| tags = RawObject::ClassIdTag::update(class_id, tags); | 
| -      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 
| +      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_, true); | 
| break; | 
| } | 
| #undef SNAPSHOT_READ | 
| @@ -618,7 +618,7 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id, | 
| switch (class_id) { | 
| #define SNAPSHOT_READ(clazz)                                                   \ | 
| case clazz::kClassId: {                                                    \ | 
| -      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_);                   \ | 
| +      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_, false);            \ | 
| break;                                                                   \ | 
| } | 
| CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) | 
| @@ -628,7 +628,7 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id, | 
|  | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| tags = RawObject::ClassIdTag::update(class_id, tags); | 
| -      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_); | 
| +      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_, false); | 
| break; | 
| } | 
| #undef SNAPSHOT_READ | 
| @@ -637,7 +637,7 @@ RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id, | 
|  | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| tags = RawObject::ClassIdTag::update(class_id, tags); | 
| -      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 
| +      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_, false); | 
| break; | 
| } | 
| #undef SNAPSHOT_READ | 
| @@ -1710,7 +1710,7 @@ void SnapshotWriter::WriteObject(RawObject* rawobj) { | 
| case clazz::kClassId: {                                                      \ | 
| object_id = forward_list_->AddObject(rawobj, kIsSerialized);               \ | 
| Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(rawobj);               \ | 
| -    raw_obj->WriteTo(this, object_id, kind());                                 \ | 
| +        raw_obj->WriteTo(this, object_id, kind(), false);                      \ | 
| return true;                                                               \ | 
| }                                                                            \ | 
|  | 
| @@ -1794,7 +1794,7 @@ bool SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) { | 
| case kTypedDataUint32ArrayCid: { | 
| object_id = forward_list_->AddObject(rawobj, kIsSerialized); | 
| RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(rawobj); | 
| -          raw_obj->WriteTo(this, object_id, kind()); | 
| +          raw_obj->WriteTo(this, object_id, kind(), false); | 
| return true; | 
| } | 
| default: | 
| @@ -2068,6 +2068,13 @@ uword SnapshotWriter::GetObjectTags(RawObject* raw) { | 
| } | 
|  | 
|  | 
| +intptr_t SnapshotWriter::GetObjectId(RawObject* raw) { | 
| +  uword tags = raw->ptr()->tags_; | 
| +  ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); | 
| +  return SerializedHeaderData::decode(tags); | 
| +} | 
| + | 
| + | 
| ForwardList::ForwardList(intptr_t first_object_id) | 
| : first_object_id_(first_object_id), | 
| nodes_(), | 
| @@ -2145,6 +2152,14 @@ void ForwardList::UnmarkAll() const { | 
| } | 
|  | 
|  | 
| +void ForwardList::SetState(RawObject* raw, SerializeState state) { | 
| +  uword tags = raw->ptr()->tags_; | 
| +  ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); | 
| +  intptr_t id = SerializedHeaderData::decode(tags); | 
| +  NodeForObjectId(id)->set_state(state); | 
| +} | 
| + | 
| + | 
| bool SnapshotWriter::CheckAndWritePredefinedObject(RawObject* rawobj) { | 
| // Check if object can be written in one of the following ways: | 
| // - Smi: the Smi value is written as is (last bit is not tagged). | 
| @@ -2224,145 +2239,51 @@ void SnapshotWriter::WriteObjectImpl(RawObject* raw, bool as_reference) { | 
| return; | 
| } | 
|  | 
| -  // Objects are usually writen as references to avoid deep recursion, but in | 
| -  // some places we know we are dealing with leaf or shallow objects and write | 
| -  // them inline. | 
| -  if (!as_reference || raw->IsCanonical()) { | 
| -    // Object is being serialized, add it to the forward ref list and mark | 
| -    // it so that future references to this object in the snapshot will use | 
| -    // an object id, instead of trying to serialize it again. | 
| -    forward_list_->MarkAndAddObject(raw, kIsSerialized); | 
| +  // When we know that we are dealing with leaf or shallow objects we write | 
| +  // these objects inline even when 'as_reference' is true. | 
| +  bool write_as_reference = as_reference && !raw->IsCanonical(); | 
| +  intptr_t tags = raw->ptr()->tags_; | 
|  | 
| -    WriteInlinedObject(raw); | 
| +  // Add object to the forward ref list and mark it so that future references | 
| +  // to this object in the snapshot will use this object id. Mark the | 
| +  // serialization state so that we do the right thing when we go through | 
| +  // the forward list. | 
| +  intptr_t class_id = raw->GetClassId(); | 
| +  if (write_as_reference && IsSplitClassId(class_id)) { | 
| +    forward_list_->MarkAndAddObject(raw, kIsNotSerialized); | 
| +  } else { | 
| +    forward_list_->MarkAndAddObject(raw, kIsSerialized); | 
| +  } | 
| +  intptr_t object_id; | 
| +  if (write_as_reference || !IsSplitClassId(class_id)) { | 
| +    object_id = kOmittedObjectId; | 
| } else { | 
| -    WriteObjectRef(raw); | 
| +    ASSERT(SerializedHeaderTag::decode(raw->ptr()->tags_) == kObjectId); | 
| +    object_id = SerializedHeaderData::decode(raw->ptr()->tags_); | 
| } | 
| +  WriteMarkedObjectImpl(raw, tags, object_id, write_as_reference); | 
| } | 
|  | 
|  | 
| -void SnapshotWriter::WriteObjectRef(RawObject* raw) { | 
| +void SnapshotWriter::WriteMarkedObjectImpl(RawObject* raw, | 
| +                                           intptr_t tags, | 
| +                                           intptr_t object_id, | 
| +                                           bool as_reference) { | 
| NoSafepointScope no_safepoint; | 
| -  RawClass* cls = class_table_->At(raw->GetClassId()); | 
| +  RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); | 
| intptr_t class_id = cls->ptr()->id_; | 
| -  ASSERT(class_id == raw->GetClassId()); | 
| +  ASSERT(class_id == RawObject::ClassIdTag::decode(tags)); | 
| if (class_id >= kNumPredefinedCids || | 
| RawObject::IsImplicitFieldClassId(class_id)) { | 
| -    WriteInstanceRef(raw, cls); | 
| +    WriteInstance(raw, cls, tags, object_id, as_reference); | 
| return; | 
| } | 
| -  if (class_id == kArrayCid || class_id == kImmutableArrayCid) { | 
| -    intptr_t tags = GetObjectTags(raw); | 
| - | 
| -    // Object is being referenced, add it to the forward ref list and mark | 
| -    // it so that future references to this object in the snapshot will use | 
| -    // this object id. Mark it as not having been serialized yet so that we | 
| -    // will serialize the object when we go through the forward list. | 
| -    forward_list_->MarkAndAddObject(raw, kIsNotSerialized); | 
| - | 
| -    RawArray* rawarray = reinterpret_cast<RawArray*>(raw); | 
| - | 
| -    // Write out the serialization header value for this object. | 
| -    WriteInlinedObjectHeader(kOmittedObjectId); | 
| - | 
| -    // Write out the class information. | 
| -    WriteIndexedObject(class_id); | 
| -    WriteTags(tags); | 
| - | 
| -    // Write out the length field. | 
| -    Write<RawObject*>(rawarray->ptr()->length_); | 
| - | 
| -    return; | 
| -  } | 
| -  if (class_id == kObjectPoolCid) { | 
| -    intptr_t tags = GetObjectTags(raw); | 
| - | 
| -    // Object is being referenced, add it to the forward ref list and mark | 
| -    // it so that future references to this object in the snapshot will use | 
| -    // this object id. Mark it as not having been serialized yet so that we | 
| -    // will serialize the object when we go through the forward list. | 
| -    forward_list_->MarkAndAddObject(raw, kIsNotSerialized); | 
| - | 
| -    RawObjectPool* rawpool = reinterpret_cast<RawObjectPool*>(raw); | 
| - | 
| -    // Write out the serialization header value for this object. | 
| -    WriteInlinedObjectHeader(kOmittedObjectId); | 
| - | 
| -    // Write out the class information. | 
| -    WriteVMIsolateObject(kObjectPoolCid); | 
| -    WriteTags(tags); | 
| - | 
| -    // Write out the length field. | 
| -    Write<intptr_t>(rawpool->ptr()->length_); | 
| - | 
| -    return; | 
| -  } | 
| -  // Add object to the forward ref list and mark it so that future references | 
| -  // to this object in the snapshot will use this object id. Mark it as having | 
| -  // been serialized so that we do not serialize the object when we go through | 
| -  // the forward list. | 
| -  forward_list_->MarkAndAddObject(raw, kIsSerialized); | 
| -  switch (class_id) { | 
| -#define SNAPSHOT_WRITE(clazz)                                                  \ | 
| -    case clazz::kClassId: {                                                    \ | 
| -      Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                \ | 
| -      raw_obj->WriteTo(this, kOmittedObjectId, kind_);                         \ | 
| -      return;                                                                  \ | 
| -    }                                                                          \ | 
| - | 
| -    CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) | 
| -#undef SNAPSHOT_WRITE | 
| -#define SNAPSHOT_WRITE(clazz)                                                  \ | 
| -    case kTypedData##clazz##Cid:                                               \ | 
| - | 
| -    CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) { | 
| -      RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(raw); | 
| -      raw_obj->WriteTo(this, kOmittedObjectId, kind_); | 
| -      return; | 
| -    } | 
| -#undef SNAPSHOT_WRITE | 
| -#define SNAPSHOT_WRITE(clazz)                                                  \ | 
| -    case kExternalTypedData##clazz##Cid:                                       \ | 
| - | 
| -    CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) { | 
| -      RawExternalTypedData* raw_obj = | 
| -        reinterpret_cast<RawExternalTypedData*>(raw); | 
| -      raw_obj->WriteTo(this, kOmittedObjectId, kind_); | 
| -      return; | 
| -    } | 
| -#undef SNAPSHOT_WRITE | 
| -    default: break; | 
| -  } | 
| -  UNREACHABLE(); | 
| -} | 
| - | 
|  | 
| -void SnapshotWriter::WriteInlinedObject(RawObject* raw) { | 
| -  // Now write the object out inline in the stream as follows: | 
| -  // - Object is seen for the first time (inlined as follows): | 
| -  //    (object size in multiples of kObjectAlignment | 0x1) | 
| -  //    serialized fields of the object | 
| -  //    ...... | 
| -  NoSafepointScope no_safepoint; | 
| -  uword tags = raw->ptr()->tags_; | 
| -  ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); | 
| -  intptr_t object_id = SerializedHeaderData::decode(tags); | 
| -  tags = forward_list_->NodeForObjectId(object_id)->tags(); | 
| -  RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); | 
| -  intptr_t class_id = cls->ptr()->id_; | 
| - | 
| -  if (!IsSplitClassId(class_id)) { | 
| -    object_id = kOmittedObjectId; | 
| -  } | 
| - | 
| -  if (class_id >= kNumPredefinedCids) { | 
| -    WriteInstance(object_id, raw, cls, tags); | 
| -    return; | 
| -  } | 
| switch (class_id) { | 
| #define SNAPSHOT_WRITE(clazz)                                                  \ | 
| case clazz::kClassId: {                                                    \ | 
| Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                \ | 
| -      raw_obj->WriteTo(this, object_id, kind_);                                \ | 
| +          raw_obj->WriteTo(this, object_id, kind_, as_reference);              \ | 
| return;                                                                  \ | 
| }                                                                          \ | 
|  | 
| @@ -2373,7 +2294,7 @@ void SnapshotWriter::WriteInlinedObject(RawObject* raw) { | 
|  | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) { | 
| RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(raw); | 
| -      raw_obj->WriteTo(this, object_id, kind_); | 
| +      raw_obj->WriteTo(this, object_id, kind_, as_reference); | 
| return; | 
| } | 
| #undef SNAPSHOT_WRITE | 
| @@ -2383,16 +2304,7 @@ void SnapshotWriter::WriteInlinedObject(RawObject* raw) { | 
| CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) { | 
| RawExternalTypedData* raw_obj = | 
| reinterpret_cast<RawExternalTypedData*>(raw); | 
| -      raw_obj->WriteTo(this, object_id, kind_); | 
| -      return; | 
| -    } | 
| -#undef SNAPSHOT_WRITE | 
| -#define SNAPSHOT_WRITE(clazz)                                                  \ | 
| -    case kTypedData##clazz##ViewCid:                                           \ | 
| - | 
| -    CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) | 
| -    case kByteDataViewCid: { | 
| -      WriteInstance(object_id, raw, cls, tags); | 
| +      raw_obj->WriteTo(this, object_id, kind_, as_reference); | 
| return; | 
| } | 
| #undef SNAPSHOT_WRITE | 
| @@ -2400,7 +2312,7 @@ void SnapshotWriter::WriteInlinedObject(RawObject* raw) { | 
| } | 
|  | 
| const Object& obj = Object::Handle(raw); | 
| -  FATAL1("Unexpected inlined object: %s\n", obj.ToCString()); | 
| +  FATAL1("Unexpected object: %s\n", obj.ToCString()); | 
| } | 
|  | 
|  | 
| @@ -2410,7 +2322,9 @@ class WriteInlinedObjectVisitor : public ObjectVisitor { | 
| : ObjectVisitor(Isolate::Current()), writer_(writer) {} | 
|  | 
| virtual void VisitObject(RawObject* obj) { | 
| -    writer_->WriteInlinedObject(obj); | 
| +    intptr_t object_id = writer_->GetObjectId(obj); | 
| +    intptr_t tags = writer_->GetObjectTags(obj); | 
| +    writer_->WriteMarkedObjectImpl(obj, tags, object_id, kAsInlinedObject); | 
| } | 
|  | 
| private: | 
| @@ -2508,26 +2422,39 @@ void SnapshotWriter::ArrayWriteTo(intptr_t object_id, | 
| intptr_t tags, | 
| RawSmi* length, | 
| RawTypeArguments* type_arguments, | 
| -                                  RawObject* data[]) { | 
| -  intptr_t len = Smi::Value(length); | 
| +                                  RawObject* data[], | 
| +                                  bool as_reference) { | 
| +  if (as_reference) { | 
| +    // Write out the serialization header value for this object. | 
| +    WriteInlinedObjectHeader(kOmittedObjectId); | 
|  | 
| -  // Write out the serialization header value for this object. | 
| -  WriteInlinedObjectHeader(object_id); | 
| +    // Write out the class information. | 
| +    WriteIndexedObject(array_kind); | 
| +    WriteTags(tags); | 
|  | 
| -  // Write out the class and tags information. | 
| -  WriteIndexedObject(array_kind); | 
| -  WriteTags(tags); | 
| +    // Write out the length field. | 
| +    Write<RawObject*>(length); | 
| +  } else { | 
| +    intptr_t len = Smi::Value(length); | 
|  | 
| -  // Write out the length field. | 
| -  Write<RawObject*>(length); | 
| +    // Write out the serialization header value for this object. | 
| +    WriteInlinedObjectHeader(object_id); | 
|  | 
| -  // Write out the type arguments. | 
| -  WriteObjectImpl(type_arguments, kAsInlinedObject); | 
| +    // Write out the class and tags information. | 
| +    WriteIndexedObject(array_kind); | 
| +    WriteTags(tags); | 
|  | 
| -  // Write out the individual object ids. | 
| -  bool as_reference = RawObject::IsCanonical(tags) ? false : true; | 
| -  for (intptr_t i = 0; i < len; i++) { | 
| -    WriteObjectImpl(data[i], as_reference); | 
| +    // Write out the length field. | 
| +    Write<RawObject*>(length); | 
| + | 
| +    // Write out the type arguments. | 
| +    WriteObjectImpl(type_arguments, kAsInlinedObject); | 
| + | 
| +    // Write out the individual object ids. | 
| +    bool write_as_reference = RawObject::IsCanonical(tags) ? false : true; | 
| +    for (intptr_t i = 0; i < len; i++) { | 
| +      WriteObjectImpl(data[i], write_as_reference); | 
| +    } | 
| } | 
| } | 
|  | 
| @@ -2601,10 +2528,11 @@ void SnapshotWriter::SetWriteException(Exceptions::ExceptionType type, | 
| } | 
|  | 
|  | 
| -void SnapshotWriter::WriteInstance(intptr_t object_id, | 
| -                                   RawObject* raw, | 
| +void SnapshotWriter::WriteInstance(RawObject* raw, | 
| RawClass* cls, | 
| -                                   intptr_t tags) { | 
| +                                   intptr_t tags, | 
| +                                   intptr_t object_id, | 
| +                                   bool as_reference) { | 
| // Check if the instance has native fields and throw an exception if it does. | 
| CheckForNativeFields(cls); | 
|  | 
| @@ -2613,81 +2541,56 @@ void SnapshotWriter::WriteInstance(intptr_t object_id, | 
| // closure that is not serializable this will throw an exception. | 
| RawFunction* func = IsSerializableClosure(cls, raw); | 
| if (func != Function::null()) { | 
| +      forward_list_->SetState(raw, kIsSerialized); | 
| WriteStaticImplicitClosure(object_id, func, tags); | 
| return; | 
| } | 
| } | 
|  | 
| // Object is regular dart instance. | 
| -  intptr_t next_field_offset = Class::IsSignatureClass(cls) ? | 
| -      Closure::InstanceSize() : | 
| -      cls->ptr()->next_field_offset_in_words_ << kWordSizeLog2; | 
| -  ASSERT(next_field_offset > 0); | 
| +  if (as_reference) { | 
| +    // Write out the serialization header value for this object. | 
| +    WriteInlinedObjectHeader(kOmittedObjectId); | 
|  | 
| -  // Write out the serialization header value for this object. | 
| -  WriteInlinedObjectHeader(object_id); | 
| +    // Indicate this is an instance object. | 
| +    Write<int32_t>(SerializedHeaderData::encode(kInstanceObjectId)); | 
| +    WriteTags(tags); | 
|  | 
| -  // Indicate this is an instance object. | 
| -  Write<int32_t>(SerializedHeaderData::encode(kInstanceObjectId)); | 
| +    // Write out the class information for this object. | 
| +    WriteObjectImpl(cls, kAsInlinedObject); | 
| +  } else { | 
| +    ASSERT(SerializedHeaderTag::decode(raw->ptr()->tags_) == kObjectId); | 
| +    ASSERT(object_id == SerializedHeaderData::decode(raw->ptr()->tags_)); | 
| +    intptr_t next_field_offset = Class::IsSignatureClass(cls) ? | 
| +        Closure::InstanceSize() : | 
| +        cls->ptr()->next_field_offset_in_words_ << kWordSizeLog2; | 
| +    ASSERT(next_field_offset > 0); | 
|  | 
| -  // Write out the tags. | 
| -  WriteTags(tags); | 
| +    // Write out the serialization header value for this object. | 
| +    WriteInlinedObjectHeader(object_id); | 
|  | 
| -  // Write out the class information for this object. | 
| -  WriteObjectImpl(cls, kAsInlinedObject); | 
| +    // Indicate this is an instance object. | 
| +    Write<int32_t>(SerializedHeaderData::encode(kInstanceObjectId)); | 
|  | 
| -  // Write out all the fields for the object. | 
| -  // Instance::NextFieldOffset() returns the offset of the first field in | 
| -  // a Dart object. | 
| -  bool as_reference = RawObject::IsCanonical(tags) ? false : true; | 
| -  intptr_t offset = Instance::NextFieldOffset(); | 
| -  while (offset < next_field_offset) { | 
| -    RawObject* raw_obj = *reinterpret_cast<RawObject**>( | 
| -        reinterpret_cast<uword>(raw->ptr()) + offset); | 
| -    WriteObjectImpl(raw_obj, as_reference); | 
| -    offset += kWordSize; | 
| -  } | 
| -  return; | 
| -} | 
| +    // Write out the tags. | 
| +    WriteTags(tags); | 
|  | 
| +    // Write out the class information for this object. | 
| +    WriteObjectImpl(cls, kAsInlinedObject); | 
|  | 
| -void SnapshotWriter::WriteInstanceRef(RawObject* raw, RawClass* cls) { | 
| -  // Check if the instance has native fields and throw an exception if it does. | 
| -  CheckForNativeFields(cls); | 
| - | 
| -  // Check if object is a closure that is serializable, if the object is a | 
| -  // closure that is not serializable this will throw an exception. | 
| -  RawFunction* func = IsSerializableClosure(cls, raw); | 
| -  if (func != Function::null()) { | 
| -    // Add object to the forward ref list and mark it so that future references | 
| -    // to this object in the snapshot will use this object id. Mark it as having | 
| -    // been serialized so that we do not serialize the object when we go through | 
| -    // the forward list. | 
| -    forward_list_->MarkAndAddObject(raw, kIsSerialized); | 
| -    uword tags = raw->ptr()->tags_; | 
| -    ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); | 
| -    intptr_t object_id = SerializedHeaderData::decode(tags); | 
| -    tags = forward_list_->NodeForObjectId(object_id)->tags(); | 
| -    WriteStaticImplicitClosure(object_id, func, tags); | 
| -    return; | 
| +    // Write out all the fields for the object. | 
| +    // Instance::NextFieldOffset() returns the offset of the first field in | 
| +    // a Dart object. | 
| +    bool write_as_reference = RawObject::IsCanonical(tags) ? false : true; | 
| +    intptr_t offset = Instance::NextFieldOffset(); | 
| +    while (offset < next_field_offset) { | 
| +      RawObject* raw_obj = *reinterpret_cast<RawObject**>( | 
| +          reinterpret_cast<uword>(raw->ptr()) + offset); | 
| +      WriteObjectImpl(raw_obj, write_as_reference); | 
| +      offset += kWordSize; | 
| +    } | 
| } | 
| - | 
| -  // Object is being referenced, add it to the forward ref list and mark | 
| -  // it so that future references to this object in the snapshot will use | 
| -  // this object id. Mark it as not having been serialized yet so that we | 
| -  // will serialize the object when we go through the forward list. | 
| -  intptr_t tags = raw->ptr()->tags_; | 
| -  forward_list_->MarkAndAddObject(raw, kIsNotSerialized); | 
| - | 
| -  // Write out the serialization header value for this object. | 
| -  WriteInlinedObjectHeader(kOmittedObjectId); | 
| - | 
| -  // Indicate this is an instance object. | 
| -  Write<int32_t>(SerializedHeaderData::encode(kInstanceObjectId)); | 
| -  WriteTags(tags); | 
| - | 
| -  // Write out the class information for this object. | 
| -  WriteObjectImpl(cls, kAsInlinedObject); | 
| +  return; | 
| } | 
|  | 
|  | 
|  |