Index: runtime/vm/clustered_snapshot.cc |
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc |
index 6f958fd5cb3693e34ccef21399d6f54f3788b0c4..6a6bd11634061b1e453aad7ef8d2983a13ae5cfe 100644 |
--- a/runtime/vm/clustered_snapshot.cc |
+++ b/runtime/vm/clustered_snapshot.cc |
@@ -3278,6 +3278,84 @@ class BigintDeserializationCluster : public DeserializationCluster { |
}; |
+class FractionSerializationCluster : public SerializationCluster { |
+ public: |
+ FractionSerializationCluster() { } |
+ virtual ~FractionSerializationCluster() { } |
+ |
+ void Trace(Serializer* s, RawObject* object) { |
+ RawFraction* fraction = Fraction::RawCast(object); |
+ objects_.Add(fraction); |
+ |
+ RawObject** from = fraction->from(); |
+ RawObject** to = fraction->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ s->Push(*p); |
+ } |
+ } |
+ |
+ void WriteAlloc(Serializer* s) { |
+ s->WriteCid(kFractionCid); |
+ intptr_t count = objects_.length(); |
+ s->Write<intptr_t>(count); |
+ for (intptr_t i = 0; i < count; i++) { |
+ RawFraction* fraction = objects_[i]; |
+ s->AssignRef(fraction); |
+ } |
+ } |
+ |
+ void WriteFill(Serializer* s) { |
+ intptr_t count = objects_.length(); |
+ for (intptr_t i = 0; i < count; i++) { |
+ RawFraction* fraction = objects_[i]; |
+ s->Write<bool>(fraction->IsCanonical()); |
+ RawObject** from = fraction->from(); |
+ RawObject** to = fraction->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ s->WriteRef(*p); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ GrowableArray<RawFraction*> objects_; |
+}; |
+ |
+ |
+class FractionDeserializationCluster : public DeserializationCluster { |
+ public: |
+ FractionDeserializationCluster() { } |
+ virtual ~FractionDeserializationCluster() { } |
+ |
+ void ReadAlloc(Deserializer* d) { |
+ start_index_ = d->next_index(); |
+ PageSpace* old_space = d->heap()->old_space(); |
+ intptr_t count = d->Read<intptr_t>(); |
+ for (intptr_t i = 0; i < count; i++) { |
+ d->AssignRef(AllocateUninitialized(old_space, Fraction::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++) { |
+ RawFraction* fraction = reinterpret_cast<RawFraction*>(d->Ref(id)); |
+ bool is_canonical = d->Read<bool>(); |
+ Deserializer::InitializeHeader(fraction, kFractionCid, |
+ Fraction::InstanceSize(), |
+ is_vm_object, is_canonical); |
+ RawObject** from = fraction->from(); |
+ RawObject** to = fraction->to(); |
+ for (RawObject** p = from; p <= to; p++) { |
+ *p = d->ReadRef(); |
+ } |
+ } |
+ } |
+}; |
+ |
+ |
class DoubleSerializationCluster : public SerializationCluster { |
public: |
DoubleSerializationCluster() { } |
@@ -4198,6 +4276,7 @@ SerializationCluster* Serializer::NewClusterForClass(intptr_t cid) { |
case kClosureCid: return new (Z) ClosureSerializationCluster(); |
case kMintCid: return new (Z) MintSerializationCluster(); |
case kBigintCid: return new (Z) BigintSerializationCluster(); |
+ case kFractionCid: return new (Z) FractionSerializationCluster(); |
case kDoubleCid: return new (Z) DoubleSerializationCluster(); |
case kGrowableObjectArrayCid: |
return new (Z) GrowableObjectArraySerializationCluster(); |
@@ -4521,6 +4600,7 @@ DeserializationCluster* Deserializer::ReadCluster() { |
case kClosureCid: return new (Z) ClosureDeserializationCluster(); |
case kMintCid: return new (Z) MintDeserializationCluster(); |
case kBigintCid: return new (Z) BigintDeserializationCluster(); |
+ case kFractionCid: return new (Z) FractionDeserializationCluster(); |
case kDoubleCid: return new (Z) DoubleDeserializationCluster(); |
case kGrowableObjectArrayCid: |
return new (Z) GrowableObjectArrayDeserializationCluster(); |