@@ -158,6 +158,27 @@ class SnapshotDeserializer : public BlobDeserializer<SnapshotDeserializer> {
158158 template <typename T>
159159 requires (!std::is_arithmetic_v<T> && !std::same_as<T, std::string>)
160160 T Read ();
161+
162+ v8::StartupData ReadV8StartupData (
163+ SnapshotData::DataOwnership ownership) {
164+ Debug (" Read<v8::StartupData>()\n " );
165+
166+ int raw_size = ReadArithmetic<int >();
167+ Debug (" size=%d\n " , raw_size);
168+
169+ CHECK_GT (raw_size, 0 ); // There should be no startup data of size 0.
170+ if (ownership == SnapshotData::DataOwnership::kOwned ) {
171+ // The data pointer of v8::StartupData would be deleted so it must be
172+ // new'ed.
173+ std::unique_ptr<char > buf = std::unique_ptr<char >(new char [raw_size]);
174+ ReadArithmetic<char >(buf.get (), raw_size);
175+ return v8::StartupData{buf.release (), raw_size};
176+ }
177+
178+ const char * data = sink.data () + read_total;
179+ read_total += raw_size;
180+ return v8::StartupData{data, raw_size};
181+ }
161182};
162183
163184class SnapshotSerializer : public BlobSerializer <SnapshotSerializer> {
@@ -181,17 +202,7 @@ class SnapshotSerializer : public BlobSerializer<SnapshotSerializer> {
181202// [ |raw_size| bytes ] contents
182203template <>
183204v8::StartupData SnapshotDeserializer::Read () {
184- Debug (" Read<v8::StartupData>()\n " );
185-
186- int raw_size = ReadArithmetic<int >();
187- Debug (" size=%d\n " , raw_size);
188-
189- CHECK_GT (raw_size, 0 ); // There should be no startup data of size 0.
190- // The data pointer of v8::StartupData would be deleted so it must be new'ed.
191- std::unique_ptr<char > buf = std::unique_ptr<char >(new char [raw_size]);
192- ReadArithmetic<char >(buf.get (), raw_size);
193-
194- return v8::StartupData{buf.release (), raw_size};
205+ return ReadV8StartupData (SnapshotData::DataOwnership::kOwned );
195206}
196207
197208template <>
@@ -640,7 +651,9 @@ bool SnapshotData::FromBlob(SnapshotData* out, const std::vector<char>& in) {
640651 return FromBlob (out, std::string_view (in.data (), in.size ()));
641652}
642653
643- bool SnapshotData::FromBlob (SnapshotData* out, std::string_view in) {
654+ bool SnapshotData::FromBlob (SnapshotData* out,
655+ std::string_view in,
656+ DataOwnership v8_snapshot_blob_data_ownership) {
644657 SnapshotDeserializer r (in);
645658 r.Debug (" SnapshotData::FromBlob()\n " );
646659
@@ -656,7 +669,9 @@ bool SnapshotData::FromBlob(SnapshotData* out, std::string_view in) {
656669 return false ;
657670 }
658671
659- out->v8_snapshot_blob_data = r.Read <v8::StartupData>();
672+ out->v8_snapshot_blob_data =
673+ r.ReadV8StartupData (v8_snapshot_blob_data_ownership);
674+ out->v8_snapshot_blob_data_ownership = v8_snapshot_blob_data_ownership;
660675 r.Debug (" Read isolate_data_info\n " );
661676 out->isolate_data_info = r.Read <IsolateDataSerializeInfo>();
662677 out->env_info = r.Read <EnvSerializeInfo>();
@@ -701,6 +716,7 @@ bool SnapshotData::Check() const {
701716
702717SnapshotData::~SnapshotData () {
703718 if (data_ownership == DataOwnership::kOwned &&
719+ v8_snapshot_blob_data_ownership == DataOwnership::kOwned &&
704720 v8_snapshot_blob_data.data != nullptr ) {
705721 delete[] v8_snapshot_blob_data.data ;
706722 }
@@ -822,6 +838,9 @@ namespace node {
822838 // -- v8_snapshot_blob_data begins --
823839 { v8_snapshot_blob_data, v8_snapshot_blob_size },
824840 // -- v8_snapshot_blob_data ends --
841+ // -- v8_snapshot_blob_data_ownership begins --
842+ SnapshotData::DataOwnership::kNotOwned,
843+ // -- v8_snapshot_blob_data_ownership ends --
825844 // -- isolate_data_info begins --
826845)" << data->isolate_data_info
827846 << R"(
0 commit comments