@@ -21,15 +21,30 @@ using v8::Local;
21
21
using v8::MaybeLocal;
22
22
using v8::Object;
23
23
using v8::String;
24
- using v8::Uint8Array;
25
24
using v8::Uint32Array;
25
+ using v8::Uint8Array;
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" ,
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
+ }
30
42
31
43
bool BindingData::PrepareForSerialization (Local<Context> context,
32
44
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 ();
33
48
// Return true because we need to maintain the reference to the binding from
34
49
// JS land.
35
50
return true ;
@@ -48,19 +63,19 @@ void BindingData::Deserialize(Local<Context> context,
48
63
InternalFieldInfoBase* info) {
49
64
DCHECK_EQ (index, BaseObject::kEmbedderType );
50
65
v8::HandleScope scope (context->GetIsolate ());
51
- Environment* env = Environment ::GetCurrent (context);
66
+ Realm* realm = Realm ::GetCurrent (context);
52
67
// Recreate the buffer in the constructor.
53
- BindingData* binding = env ->AddBindingData <BindingData>(context, holder);
68
+ BindingData* binding = realm ->AddBindingData <BindingData>(context, holder);
54
69
CHECK_NOT_NULL (binding);
55
70
}
56
71
57
72
void BindingData::EncodeInto (const FunctionCallbackInfo<Value>& args) {
58
73
Environment* env = Environment::GetCurrent (args);
59
74
Isolate* isolate = env->isolate ();
60
- CHECK_GE (args.Length (), 3 );
75
+ CHECK_GE (args.Length (), 2 );
61
76
CHECK (args[0 ]->IsString ());
62
77
CHECK (args[1 ]->IsUint8Array ());
63
- CHECK (args[ 2 ]-> IsUint32Array () );
78
+ BindingData* binding_data = Realm::GetBindingData<BindingData>(args );
64
79
65
80
Local<String> source = args[0 ].As <String>();
66
81
@@ -69,21 +84,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) {
69
84
char * write_result = static_cast <char *>(buf->Data ()) + dest->ByteOffset ();
70
85
size_t dest_length = dest->ByteLength ();
71
86
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
87
int nchars;
79
88
int written = source->WriteUtf8 (
80
89
isolate,
81
90
write_result,
82
91
dest_length,
83
92
&nchars,
84
93
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;
87
97
}
88
98
89
99
// Encode a single string to a UTF-8 Uint8Array (not Buffer).
@@ -176,9 +186,9 @@ void BindingData::Initialize(Local<Object> target,
176
186
Local<Value> unused,
177
187
Local<Context> context,
178
188
void * priv) {
179
- Environment* env = Environment ::GetCurrent (context);
189
+ Realm* realm = Realm ::GetCurrent (context);
180
190
BindingData* const binding_data =
181
- env ->AddBindingData <BindingData>(context, target);
191
+ realm ->AddBindingData <BindingData>(context, target);
182
192
if (binding_data == nullptr ) return ;
183
193
184
194
SetMethod (context, target, " encodeInto" , EncodeInto);
0 commit comments