@@ -21,15 +21,30 @@ using v8::Local;
2121using v8::MaybeLocal;
2222using v8::Object;
2323using v8::String;
24- using v8::Uint8Array;
2524using v8::Uint32Array;
25+ using v8::Uint8Array;
2626using v8::Value;
2727
28- BindingData::BindingData (Environment* env, Local<Object> object)
29- : SnapshotableObject(env, object, type_int) {}
28+ void BindingData::MemoryInfo (MemoryTracker* tracker) const {
29+ tracker->TrackField (" encode_into_results_buffer" ,
30+ encode_into_results_buffer_);
31+ }
32+
33+ BindingData::BindingData (Realm* realm, v8::Local<v8::Object> object)
34+ : SnapshotableObject(realm, object, type_int),
35+ encode_into_results_buffer_ (realm->isolate (), kEncodeIntoResultsLength) {
36+ object
37+ ->Set (realm->context (),
38+ FIXED_ONE_BYTE_STRING (realm->isolate (), " encodeIntoResults" ),
39+ encode_into_results_buffer_.GetJSArray ())
40+ .Check ();
41+ }
3042
3143bool BindingData::PrepareForSerialization (Local<Context> context,
3244 v8::SnapshotCreator* creator) {
45+ // We'll just re-initialize the buffers in the constructor since their
46+ // contents can be thrown away once consumed in the previous call.
47+ encode_into_results_buffer_.Release ();
3348 // Return true because we need to maintain the reference to the binding from
3449 // JS land.
3550 return true ;
@@ -48,19 +63,19 @@ void BindingData::Deserialize(Local<Context> context,
4863 InternalFieldInfoBase* info) {
4964 DCHECK_EQ (index, BaseObject::kEmbedderType );
5065 v8::HandleScope scope (context->GetIsolate ());
51- Environment* env = Environment ::GetCurrent (context);
66+ Realm* realm = Realm ::GetCurrent (context);
5267 // Recreate the buffer in the constructor.
53- BindingData* binding = env ->AddBindingData <BindingData>(context, holder);
68+ BindingData* binding = realm ->AddBindingData <BindingData>(context, holder);
5469 CHECK_NOT_NULL (binding);
5570}
5671
5772void BindingData::EncodeInto (const FunctionCallbackInfo<Value>& args) {
5873 Environment* env = Environment::GetCurrent (args);
5974 Isolate* isolate = env->isolate ();
60- CHECK_GE (args.Length (), 3 );
75+ CHECK_GE (args.Length (), 2 );
6176 CHECK (args[0 ]->IsString ());
6277 CHECK (args[1 ]->IsUint8Array ());
63- CHECK (args[ 2 ]-> IsUint32Array () );
78+ BindingData* binding_data = Realm::GetBindingData<BindingData>(args );
6479
6580 Local<String> source = args[0 ].As <String>();
6681
@@ -69,21 +84,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
6984 char * write_result = static_cast <char *>(buf->Data ()) + dest->ByteOffset ();
7085 size_t dest_length = dest->ByteLength ();
7186
72- // results = [ read, written ]
73- Local<Uint32Array> result_arr = args[2 ].As <Uint32Array>();
74- uint32_t * results = reinterpret_cast <uint32_t *>(
75- static_cast <char *>(result_arr->Buffer ()->Data ()) +
76- result_arr->ByteOffset ());
77-
7887 int nchars;
7988 int written = source->WriteUtf8 (
8089 isolate,
8190 write_result,
8291 dest_length,
8392 &nchars,
8493 String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8);
85- results[0 ] = nchars;
86- results[1 ] = written;
94+
95+ binding_data->encode_into_results_buffer_ [0 ] = nchars;
96+ binding_data->encode_into_results_buffer_ [1 ] = written;
8797}
8898
8999// Encode a single string to a UTF-8 Uint8Array (not Buffer).
@@ -176,9 +186,9 @@ void BindingData::Initialize(Local<Object> target,
176186 Local<Value> unused,
177187 Local<Context> context,
178188 void * priv) {
179- Environment* env = Environment ::GetCurrent (context);
189+ Realm* realm = Realm ::GetCurrent (context);
180190 BindingData* const binding_data =
181- env ->AddBindingData <BindingData>(context, target);
191+ realm ->AddBindingData <BindingData>(context, target);
182192 if (binding_data == nullptr ) return ;
183193
184194 SetMethod (context, target, " encodeInto" , EncodeInto);
0 commit comments