@@ -2717,33 +2717,56 @@ void BindingData::MemoryInfo(MemoryTracker* tracker) const {
27172717 file_handle_read_wrap_freelist);
27182718}
27192719
2720- BindingData::BindingData (Realm* realm, v8::Local<v8::Object> wrap)
2720+ BindingData::BindingData (Realm* realm,
2721+ v8::Local<v8::Object> wrap,
2722+ InternalFieldInfo* info)
27212723 : SnapshotableObject(realm, wrap, type_int),
2722- stats_field_array(realm->isolate (), kFsStatsBufferLength),
2723- stats_field_bigint_array(realm->isolate (), kFsStatsBufferLength),
2724- statfs_field_array(realm->isolate (), kFsStatFsBufferLength),
2725- statfs_field_bigint_array(realm->isolate (), kFsStatFsBufferLength) {
2724+ stats_field_array(realm->isolate (),
2725+ kFsStatsBufferLength,
2726+ MAYBE_FIELD_PTR(info, stats_field_array)),
2727+ stats_field_bigint_array(realm->isolate (),
2728+ kFsStatsBufferLength,
2729+ MAYBE_FIELD_PTR(info, stats_field_bigint_array)),
2730+ statfs_field_array(realm->isolate (),
2731+ kFsStatFsBufferLength,
2732+ MAYBE_FIELD_PTR(info, statfs_field_array)),
2733+ statfs_field_bigint_array(
2734+ realm->isolate (),
2735+ kFsStatFsBufferLength,
2736+ MAYBE_FIELD_PTR(info, statfs_field_bigint_array)) {
27262737 Isolate* isolate = realm->isolate ();
27272738 Local<Context> context = realm->context ();
2728- wrap->Set (context,
2729- FIXED_ONE_BYTE_STRING (isolate, " statValues" ),
2730- stats_field_array.GetJSArray ())
2731- .Check ();
2732-
2733- wrap->Set (context,
2734- FIXED_ONE_BYTE_STRING (isolate, " bigintStatValues" ),
2735- stats_field_bigint_array.GetJSArray ())
2736- .Check ();
2737-
2738- wrap->Set (context,
2739- FIXED_ONE_BYTE_STRING (isolate, " statFsValues" ),
2740- statfs_field_array.GetJSArray ())
2741- .Check ();
27422739
2743- wrap->Set (context,
2744- FIXED_ONE_BYTE_STRING (isolate, " bigintStatFsValues" ),
2745- statfs_field_bigint_array.GetJSArray ())
2746- .Check ();
2740+ if (info == nullptr ) {
2741+ wrap->Set (context,
2742+ FIXED_ONE_BYTE_STRING (isolate, " statValues" ),
2743+ stats_field_array.GetJSArray ())
2744+ .Check ();
2745+
2746+ wrap->Set (context,
2747+ FIXED_ONE_BYTE_STRING (isolate, " bigintStatValues" ),
2748+ stats_field_bigint_array.GetJSArray ())
2749+ .Check ();
2750+
2751+ wrap->Set (context,
2752+ FIXED_ONE_BYTE_STRING (isolate, " statFsValues" ),
2753+ statfs_field_array.GetJSArray ())
2754+ .Check ();
2755+
2756+ wrap->Set (context,
2757+ FIXED_ONE_BYTE_STRING (isolate, " bigintStatFsValues" ),
2758+ statfs_field_bigint_array.GetJSArray ())
2759+ .Check ();
2760+ } else {
2761+ stats_field_array.Deserialize (realm->context ());
2762+ stats_field_bigint_array.Deserialize (realm->context ());
2763+ statfs_field_array.Deserialize (realm->context ());
2764+ statfs_field_bigint_array.Deserialize (realm->context ());
2765+ }
2766+ stats_field_array.MakeWeak ();
2767+ stats_field_bigint_array.MakeWeak ();
2768+ statfs_field_array.MakeWeak ();
2769+ statfs_field_bigint_array.MakeWeak ();
27472770}
27482771
27492772void BindingData::Deserialize (Local<Context> context,
@@ -2753,28 +2776,34 @@ void BindingData::Deserialize(Local<Context> context,
27532776 DCHECK_EQ (index, BaseObject::kEmbedderType );
27542777 HandleScope scope (context->GetIsolate ());
27552778 Realm* realm = Realm::GetCurrent (context);
2756- BindingData* binding = realm->AddBindingData <BindingData>(context, holder);
2779+ InternalFieldInfo* casted_info = static_cast <InternalFieldInfo*>(info);
2780+ BindingData* binding =
2781+ realm->AddBindingData <BindingData>(context, holder, casted_info);
27572782 CHECK_NOT_NULL (binding);
27582783}
27592784
27602785bool BindingData::PrepareForSerialization (Local<Context> context,
27612786 v8::SnapshotCreator* creator) {
27622787 CHECK (file_handle_read_wrap_freelist.empty ());
2763- // We'll just re-initialize the buffers in the constructor since their
2764- // contents can be thrown away once consumed in the previous call.
2765- stats_field_array.Release ();
2766- stats_field_bigint_array.Release ();
2767- statfs_field_array.Release ();
2768- statfs_field_bigint_array.Release ();
2788+ DCHECK_NULL (internal_field_info_);
2789+ internal_field_info_ = InternalFieldInfoBase::New<InternalFieldInfo>(type ());
2790+ internal_field_info_->stats_field_array =
2791+ stats_field_array.Serialize (context, creator);
2792+ internal_field_info_->stats_field_bigint_array =
2793+ stats_field_bigint_array.Serialize (context, creator);
2794+ internal_field_info_->statfs_field_array =
2795+ statfs_field_array.Serialize (context, creator);
2796+ internal_field_info_->statfs_field_bigint_array =
2797+ statfs_field_bigint_array.Serialize (context, creator);
27692798 // Return true because we need to maintain the reference to the binding from
27702799 // JS land.
27712800 return true ;
27722801}
27732802
27742803InternalFieldInfoBase* BindingData::Serialize (int index) {
27752804 DCHECK_EQ (index, BaseObject::kEmbedderType );
2776- InternalFieldInfo* info =
2777- InternalFieldInfoBase::New<InternalFieldInfo>( type ()) ;
2805+ InternalFieldInfo* info = internal_field_info_;
2806+ internal_field_info_ = nullptr ;
27782807 return info;
27792808}
27802809
0 commit comments