@@ -25,11 +25,24 @@ using v8::Uint8Array;
2525using v8::Uint32Array;
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" , encode_into_results_buffer_);
30+ }
31+
32+ BindingData::BindingData (Environment* env, v8::Local<v8::Object> object)
33+ : SnapshotableObject(env, object, type_int),
34+ encode_into_results_buffer_ (env->isolate (), kEncodeIntoResultsLength) {
35+ object->Set (env->context (),
36+ FIXED_ONE_BYTE_STRING (env->isolate (), " encodeIntoResults" ),
37+ encode_into_results_buffer_.GetJSArray ())
38+ .Check ();
39+ }
3040
3141bool BindingData::PrepareForSerialization (Local<Context> context,
3242 v8::SnapshotCreator* creator) {
43+ // We'll just re-initialize the buffers in the constructor since their
44+ // contents can be thrown away once consumed in the previous call.
45+ encode_into_results_buffer_.Release ();
3346 // Return true because we need to maintain the reference to the binding from
3447 // JS land.
3548 return true ;
@@ -57,10 +70,10 @@ void BindingData::Deserialize(Local<Context> context,
5770void BindingData::EncodeInto (const FunctionCallbackInfo<Value>& args) {
5871 Environment* env = Environment::GetCurrent (args);
5972 Isolate* isolate = env->isolate ();
60- CHECK_GE (args.Length (), 3 );
73+ CHECK_GE (args.Length (), 2 );
6174 CHECK (args[0 ]->IsString ());
6275 CHECK (args[1 ]->IsUint8Array ());
63- CHECK (args[ 2 ]-> IsUint32Array () );
76+ BindingData* binding_data = Environment::GetBindingData<BindingData>(args );
6477
6578 Local<String> source = args[0 ].As <String>();
6679
@@ -69,21 +82,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
6982 char * write_result = static_cast <char *>(buf->Data ()) + dest->ByteOffset ();
7083 size_t dest_length = dest->ByteLength ();
7184
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-
7885 int nchars;
7986 int written = source->WriteUtf8 (
8087 isolate,
8188 write_result,
8289 dest_length,
8390 &nchars,
8491 String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8);
85- results[0 ] = nchars;
86- results[1 ] = written;
92+
93+ binding_data->encode_into_results_buffer_ [0 ] = nchars;
94+ binding_data->encode_into_results_buffer_ [1 ] = written;
8795}
8896
8997// Encode a single string to a UTF-8 Uint8Array (not Buffer).
0 commit comments