Index: runtime/vm/clustered_snapshot.cc |
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc |
index 629f3b01b4444b065d47f64490ac3e256b78078b..7fce179d5d8377dc5f19fd7cd106730a76161feb 100644 |
--- a/runtime/vm/clustered_snapshot.cc |
+++ b/runtime/vm/clustered_snapshot.cc |
@@ -2089,6 +2089,86 @@ class ContextScopeDeserializationCluster : public DeserializationCluster { |
#if !defined(DART_PRECOMPILED_RUNTIME) |
+class UnlinkedCallSerializationCluster : public SerializationCluster { |
+ public: |
+ UnlinkedCallSerializationCluster() { } |
+ virtual ~UnlinkedCallSerializationCluster() { } |
+ |
+ void Trace(Serializer* s, RawObject* object) { |
+ RawUnlinkedCall* unlinked = UnlinkedCall::RawCast(object); |
+ objects_.Add(unlinked); |
+ |
+ RawObject** from = unlinked->from(); |
+ RawObject** to = unlinked->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ s->Push(*p); |
+ } |
+ } |
+ |
+ void WriteAlloc(Serializer* s) { |
+ s->WriteCid(kUnlinkedCallCid); |
+ intptr_t count = objects_.length(); |
+ s->Write<int32_t>(count); |
+ for (intptr_t i = 0; i < count; i++) { |
+ RawUnlinkedCall* unlinked = objects_[i]; |
+ s->AssignRef(unlinked); |
+ } |
+ } |
+ |
+ void WriteFill(Serializer* s) { |
+ intptr_t count = objects_.length(); |
+ for (intptr_t i = 0; i < count; i++) { |
+ RawUnlinkedCall* unlinked = objects_[i]; |
+ RawObject** from = unlinked->from(); |
+ RawObject** to = unlinked->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ s->WriteRef(*p); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ GrowableArray<RawUnlinkedCall*> objects_; |
+}; |
+#endif // !DART_PRECOMPILED_RUNTIME |
+ |
+ |
+class UnlinkedCallDeserializationCluster : public DeserializationCluster { |
+ public: |
+ UnlinkedCallDeserializationCluster() { } |
+ virtual ~UnlinkedCallDeserializationCluster() { } |
+ |
+ void ReadAlloc(Deserializer* d) { |
+ start_index_ = d->next_index(); |
+ PageSpace* old_space = d->heap()->old_space(); |
+ intptr_t count = d->Read<int32_t>(); |
+ for (intptr_t i = 0; i < count; i++) { |
+ d->AssignRef(AllocateUninitialized(old_space, |
+ UnlinkedCall::InstanceSize())); |
+ } |
+ stop_index_ = d->next_index(); |
+ } |
+ |
+ void ReadFill(Deserializer* d) { |
+ bool is_vm_object = d->isolate() == Dart::vm_isolate(); |
+ |
+ for (intptr_t id = start_index_; id < stop_index_; id++) { |
+ RawUnlinkedCall* unlinked = |
+ reinterpret_cast<RawUnlinkedCall*>(d->Ref(id)); |
+ Deserializer::InitializeHeader(unlinked, kUnlinkedCallCid, |
+ UnlinkedCall::InstanceSize(), |
+ is_vm_object); |
+ RawObject** from = unlinked->from(); |
+ RawObject** to = unlinked->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ *p = d->ReadRef(); |
+ } |
+ } |
+ } |
+}; |
+ |
+ |
+#if !defined(DART_PRECOMPILED_RUNTIME) |
class ICDataSerializationCluster : public SerializationCluster { |
public: |
ICDataSerializationCluster() { } |
@@ -4271,6 +4351,7 @@ SerializationCluster* Serializer::NewClusterForClass(intptr_t cid) { |
return new (Z) ExceptionHandlersSerializationCluster(); |
case kContextCid: return new (Z) ContextSerializationCluster(); |
case kContextScopeCid: return new (Z) ContextScopeSerializationCluster(); |
+ case kUnlinkedCallCid: return new (Z) UnlinkedCallSerializationCluster(); |
case kICDataCid: return new (Z) ICDataSerializationCluster(); |
case kMegamorphicCacheCid: |
return new (Z) MegamorphicCacheSerializationCluster(); |
@@ -4436,7 +4517,7 @@ void Serializer::AddVMIsolateBaseObjects() { |
} |
ClassTable* table = isolate()->class_table(); |
- for (intptr_t cid = kClassCid; cid <= kUnwindErrorCid; cid++) { |
+ for (intptr_t cid = kClassCid; cid < kInstanceCid; cid++) { |
// Error has no class object. |
if (cid != kErrorCid) { |
ASSERT(table->HasValidClassAt(cid)); |
@@ -4593,6 +4674,7 @@ DeserializationCluster* Deserializer::ReadCluster() { |
return new (Z) ExceptionHandlersDeserializationCluster(); |
case kContextCid: return new (Z) ContextDeserializationCluster(); |
case kContextScopeCid: return new (Z) ContextScopeDeserializationCluster(); |
+ case kUnlinkedCallCid: return new (Z) UnlinkedCallDeserializationCluster(); |
case kICDataCid: return new (Z) ICDataDeserializationCluster(); |
case kMegamorphicCacheCid: |
return new (Z) MegamorphicCacheDeserializationCluster(); |