@@ -20,15 +20,30 @@ using v8::Local;
2020using v8::MaybeLocal;
2121using v8::Object;
2222using v8::String;
23- using v8::Uint8Array;
2423using v8::Uint32Array;
24+ using v8::Uint8Array;
2525using v8::Value;
2626
27- BindingData::BindingData (Environment* env, Local<Object> object)
28- : SnapshotableObject(env, object, type_int) {}
27+ void BindingData::MemoryInfo (MemoryTracker* tracker) const {
28+ tracker->TrackField (" encode_into_results_buffer" ,
29+ encode_into_results_buffer_);
30+ }
31+
32+ BindingData::BindingData (Realm* realm, v8::Local<v8::Object> object)
33+ : SnapshotableObject(realm, object, type_int),
34+ encode_into_results_buffer_ (realm->isolate (), kEncodeIntoResultsLength) {
35+ object
36+ ->Set (realm->context (),
37+ FIXED_ONE_BYTE_STRING (realm->isolate (), " encodeIntoResults" ),
38+ encode_into_results_buffer_.GetJSArray ())
39+ .Check ();
40+ }
2941
3042bool BindingData::PrepareForSerialization (Local<Context> context,
3143 v8::SnapshotCreator* creator) {
44+ // We'll just re-initialize the buffers in the constructor since their
45+ // contents can be thrown away once consumed in the previous call.
46+ encode_into_results_buffer_.Release ();
3247 // Return true because we need to maintain the reference to the binding from
3348 // JS land.
3449 return true ;
@@ -47,19 +62,19 @@ void BindingData::Deserialize(Local<Context> context,
4762 InternalFieldInfoBase* info) {
4863 DCHECK_EQ (index, BaseObject::kEmbedderType );
4964 v8::HandleScope scope (context->GetIsolate ());
50- Environment* env = Environment ::GetCurrent (context);
65+ Realm* realm = Realm ::GetCurrent (context);
5166 // Recreate the buffer in the constructor.
52- BindingData* binding = env ->AddBindingData <BindingData>(context, holder);
67+ BindingData* binding = realm ->AddBindingData <BindingData>(context, holder);
5368 CHECK_NOT_NULL (binding);
5469}
5570
5671void BindingData::EncodeInto (const FunctionCallbackInfo<Value>& args) {
5772 Environment* env = Environment::GetCurrent (args);
5873 Isolate* isolate = env->isolate ();
59- CHECK_GE (args.Length (), 3 );
74+ CHECK_GE (args.Length (), 2 );
6075 CHECK (args[0 ]->IsString ());
6176 CHECK (args[1 ]->IsUint8Array ());
62- CHECK (args[ 2 ]-> IsUint32Array () );
77+ BindingData* binding_data = Realm::GetBindingData<BindingData>(args );
6378
6479 Local<String> source = args[0 ].As <String>();
6580
@@ -68,21 +83,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
6883 char * write_result = static_cast <char *>(buf->Data ()) + dest->ByteOffset ();
6984 size_t dest_length = dest->ByteLength ();
7085
71- // results = [ read, written ]
72- Local<Uint32Array> result_arr = args[2 ].As <Uint32Array>();
73- uint32_t * results = reinterpret_cast <uint32_t *>(
74- static_cast <char *>(result_arr->Buffer ()->Data ()) +
75- result_arr->ByteOffset ());
76-
7786 int nchars;
7887 int written = source->WriteUtf8 (
7988 isolate,
8089 write_result,
8190 dest_length,
8291 &nchars,
8392 String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8);
84- results[0 ] = nchars;
85- results[1 ] = written;
93+
94+ binding_data->encode_into_results_buffer_ [0 ] = nchars;
95+ binding_data->encode_into_results_buffer_ [1 ] = written;
8696}
8797
8898// Encode a single string to a UTF-8 Uint8Array (not Buffer).
@@ -175,9 +185,9 @@ void BindingData::Initialize(Local<Object> target,
175185 Local<Value> unused,
176186 Local<Context> context,
177187 void * priv) {
178- Environment* env = Environment ::GetCurrent (context);
188+ Realm* realm = Realm ::GetCurrent (context);
179189 BindingData* const binding_data =
180- env ->AddBindingData <BindingData>(context, target);
190+ realm ->AddBindingData <BindingData>(context, target);
181191 if (binding_data == nullptr ) return ;
182192
183193 SetMethod (context, target, " encodeInto" , EncodeInto);
0 commit comments