@@ -2717,33 +2717,56 @@ void BindingData::MemoryInfo(MemoryTracker* tracker) const {
2717
2717
file_handle_read_wrap_freelist);
2718
2718
}
2719
2719
2720
- BindingData::BindingData (Realm* realm, v8::Local<v8::Object> wrap)
2720
+ BindingData::BindingData (Realm* realm,
2721
+ v8::Local<v8::Object> wrap,
2722
+ InternalFieldInfo* info)
2721
2723
: 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)) {
2726
2737
Isolate* isolate = realm->isolate ();
2727
2738
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 ();
2742
2739
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 ();
2747
2770
}
2748
2771
2749
2772
void BindingData::Deserialize (Local<Context> context,
@@ -2753,28 +2776,34 @@ void BindingData::Deserialize(Local<Context> context,
2753
2776
DCHECK_EQ (index, BaseObject::kEmbedderType );
2754
2777
HandleScope scope (context->GetIsolate ());
2755
2778
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);
2757
2782
CHECK_NOT_NULL (binding);
2758
2783
}
2759
2784
2760
2785
bool BindingData::PrepareForSerialization (Local<Context> context,
2761
2786
v8::SnapshotCreator* creator) {
2762
2787
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);
2769
2798
// Return true because we need to maintain the reference to the binding from
2770
2799
// JS land.
2771
2800
return true ;
2772
2801
}
2773
2802
2774
2803
InternalFieldInfoBase* BindingData::Serialize (int index) {
2775
2804
DCHECK_EQ (index, BaseObject::kEmbedderType );
2776
- InternalFieldInfo* info =
2777
- InternalFieldInfoBase::New<InternalFieldInfo>( type ()) ;
2805
+ InternalFieldInfo* info = internal_field_info_;
2806
+ internal_field_info_ = nullptr ;
2778
2807
return info;
2779
2808
}
2780
2809
0 commit comments