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