|
6 | 6 |
|
7 | 7 | #include "platform/assert.h" |
8 | 8 | #include "vm/bootstrap.h" |
| 9 | +#include "vm/class_id.h" |
9 | 10 | #include "vm/compiler/backend/code_statistics.h" |
10 | 11 | #include "vm/compiler/frontend/bytecode_reader.h" |
11 | 12 | #include "vm/compiler/relocation.h" |
@@ -767,6 +768,74 @@ class SignatureDataDeserializationCluster : public DeserializationCluster { |
767 | 768 | } |
768 | 769 | }; |
769 | 770 |
|
| 771 | +#if !defined(DART_PRECOMPILED_RUNTIME) |
| 772 | +class FfiTrampolineDataSerializationCluster : public SerializationCluster { |
| 773 | + public: |
| 774 | + FfiTrampolineDataSerializationCluster() |
| 775 | + : SerializationCluster("FfiTrampolineData") {} |
| 776 | + ~FfiTrampolineDataSerializationCluster() {} |
| 777 | + |
| 778 | + void Trace(Serializer* s, RawObject* object) { |
| 779 | + RawFfiTrampolineData* data = FfiTrampolineData::RawCast(object); |
| 780 | + objects_.Add(data); |
| 781 | + PushFromTo(data); |
| 782 | + } |
| 783 | + |
| 784 | + void WriteAlloc(Serializer* s) { |
| 785 | + s->WriteCid(kFfiTrampolineDataCid); |
| 786 | + const intptr_t count = objects_.length(); |
| 787 | + s->WriteUnsigned(count); |
| 788 | + for (intptr_t i = 0; i < count; i++) { |
| 789 | + s->AssignRef(objects_[i]); |
| 790 | + } |
| 791 | + } |
| 792 | + |
| 793 | + void WriteFill(Serializer* s) { |
| 794 | + intptr_t count = objects_.length(); |
| 795 | + for (intptr_t i = 0; i < count; i++) { |
| 796 | + RawFfiTrampolineData* const data = objects_[i]; |
| 797 | + AutoTraceObject(data); |
| 798 | + WriteFromTo(data); |
| 799 | + |
| 800 | + // TODO(37295): FFI callbacks shouldn't be written to a snapshot. They |
| 801 | + // should only be referenced by the callback registry in Thread. |
| 802 | + ASSERT(data->ptr()->callback_id_ == 0); |
| 803 | + } |
| 804 | + } |
| 805 | + |
| 806 | + private: |
| 807 | + GrowableArray<RawFfiTrampolineData*> objects_; |
| 808 | +}; |
| 809 | +#endif // !DART_PRECOMPILED_RUNTIME |
| 810 | + |
| 811 | +class FfiTrampolineDataDeserializationCluster : public DeserializationCluster { |
| 812 | + public: |
| 813 | + FfiTrampolineDataDeserializationCluster() {} |
| 814 | + ~FfiTrampolineDataDeserializationCluster() {} |
| 815 | + |
| 816 | + void ReadAlloc(Deserializer* d) { |
| 817 | + start_index_ = d->next_index(); |
| 818 | + PageSpace* old_space = d->heap()->old_space(); |
| 819 | + intptr_t count = d->ReadUnsigned(); |
| 820 | + for (intptr_t i = 0; i < count; i++) { |
| 821 | + d->AssignRef( |
| 822 | + AllocateUninitialized(old_space, FfiTrampolineData::InstanceSize())); |
| 823 | + } |
| 824 | + stop_index_ = d->next_index(); |
| 825 | + } |
| 826 | + |
| 827 | + void ReadFill(Deserializer* d) { |
| 828 | + for (intptr_t id = start_index_; id < stop_index_; id++) { |
| 829 | + RawFfiTrampolineData* data = |
| 830 | + reinterpret_cast<RawFfiTrampolineData*>(d->Ref(id)); |
| 831 | + Deserializer::InitializeHeader(data, kFfiTrampolineDataCid, |
| 832 | + FfiTrampolineData::InstanceSize()); |
| 833 | + ReadFromTo(data); |
| 834 | + data->ptr()->callback_id_ = 0; |
| 835 | + } |
| 836 | + } |
| 837 | +}; |
| 838 | + |
770 | 839 | #if !defined(DART_PRECOMPILED_RUNTIME) |
771 | 840 | class RedirectionDataSerializationCluster : public SerializationCluster { |
772 | 841 | public: |
@@ -4308,6 +4377,8 @@ SerializationCluster* Serializer::NewClusterForClass(intptr_t cid) { |
4308 | 4377 | return new (Z) SignatureDataSerializationCluster(); |
4309 | 4378 | case kRedirectionDataCid: |
4310 | 4379 | return new (Z) RedirectionDataSerializationCluster(); |
| 4380 | + case kFfiTrampolineDataCid: |
| 4381 | + return new (Z) FfiTrampolineDataSerializationCluster(); |
4311 | 4382 | case kFieldCid: |
4312 | 4383 | return new (Z) FieldSerializationCluster(); |
4313 | 4384 | case kScriptCid: |
@@ -4944,6 +5015,8 @@ DeserializationCluster* Deserializer::ReadCluster() { |
4944 | 5015 | return new (Z) SignatureDataDeserializationCluster(); |
4945 | 5016 | case kRedirectionDataCid: |
4946 | 5017 | return new (Z) RedirectionDataDeserializationCluster(); |
| 5018 | + case kFfiTrampolineDataCid: |
| 5019 | + return new (Z) FfiTrampolineDataDeserializationCluster(); |
4947 | 5020 | case kFieldCid: |
4948 | 5021 | return new (Z) FieldDeserializationCluster(); |
4949 | 5022 | case kScriptCid: |
|
0 commit comments