@@ -25,11 +25,24 @@ using v8::Uint8Array;
25
25
using v8::Uint32Array;
26
26
using v8::Value;
27
27
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
+ }
30
40
31
41
bool BindingData::PrepareForSerialization (Local<Context> context,
32
42
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 ();
33
46
// Return true because we need to maintain the reference to the binding from
34
47
// JS land.
35
48
return true ;
@@ -57,10 +70,10 @@ void BindingData::Deserialize(Local<Context> context,
57
70
void BindingData::EncodeInto (const FunctionCallbackInfo<Value>& args) {
58
71
Environment* env = Environment::GetCurrent (args);
59
72
Isolate* isolate = env->isolate ();
60
- CHECK_GE (args.Length (), 3 );
73
+ CHECK_GE (args.Length (), 2 );
61
74
CHECK (args[0 ]->IsString ());
62
75
CHECK (args[1 ]->IsUint8Array ());
63
- CHECK (args[ 2 ]-> IsUint32Array () );
76
+ BindingData* binding_data = Environment::GetBindingData<BindingData>(args );
64
77
65
78
Local<String> source = args[0 ].As <String>();
66
79
@@ -69,21 +82,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
69
82
char * write_result = static_cast <char *>(buf->Data ()) + dest->ByteOffset ();
70
83
size_t dest_length = dest->ByteLength ();
71
84
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
-
78
85
int nchars;
79
86
int written = source->WriteUtf8 (
80
87
isolate,
81
88
write_result,
82
89
dest_length,
83
90
&nchars,
84
91
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;
87
95
}
88
96
89
97
// Encode a single string to a UTF-8 Uint8Array (not Buffer).
0 commit comments