12
12
using node::contextify::ContextifyContext;
13
13
using v8::Array;
14
14
using v8::ArrayBuffer;
15
- using v8::ArrayBufferCreationMode ;
15
+ using v8::BackingStore ;
16
16
using v8::Context;
17
17
using v8::EscapableHandleScope;
18
18
using v8::Exception;
@@ -123,10 +123,9 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
123
123
std::vector<Local<SharedArrayBuffer>> shared_array_buffers;
124
124
// Attach all transferred SharedArrayBuffers to their new Isolate.
125
125
for (uint32_t i = 0 ; i < shared_array_buffers_.size (); ++i) {
126
- Local<SharedArrayBuffer> sab;
127
- if (!shared_array_buffers_[i]->GetSharedArrayBuffer (env, context)
128
- .ToLocal (&sab))
129
- return MaybeLocal<Value>();
126
+ Local<SharedArrayBuffer> sab =
127
+ SharedArrayBuffer::New (env->isolate (),
128
+ std::move (shared_array_buffers_[i]));
130
129
shared_array_buffers.push_back (sab);
131
130
}
132
131
shared_array_buffers_.clear ();
@@ -141,30 +140,12 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
141
140
delegate.deserializer = &deserializer;
142
141
143
142
// Attach all transferred ArrayBuffers to their new Isolate.
144
- for (uint32_t i = 0 ; i < array_buffer_contents_.size (); ++i) {
145
- if (!env->isolate_data ()->uses_node_allocator ()) {
146
- // We don't use Node's allocator on the receiving side, so we have
147
- // to create the ArrayBuffer from a copy of the memory.
148
- AllocatedBuffer buf =
149
- env->AllocateManaged (array_buffer_contents_[i].size );
150
- memcpy (buf.data (),
151
- array_buffer_contents_[i].data ,
152
- array_buffer_contents_[i].size );
153
- deserializer.TransferArrayBuffer (i, buf.ToArrayBuffer ());
154
- continue ;
155
- }
156
-
157
- env->isolate_data ()->node_allocator ()->RegisterPointer (
158
- array_buffer_contents_[i].data , array_buffer_contents_[i].size );
159
-
143
+ for (uint32_t i = 0 ; i < array_buffers_.size (); ++i) {
160
144
Local<ArrayBuffer> ab =
161
- ArrayBuffer::New (env->isolate (),
162
- array_buffer_contents_[i].release (),
163
- array_buffer_contents_[i].size ,
164
- ArrayBufferCreationMode::kInternalized );
145
+ ArrayBuffer::New (env->isolate (), std::move (array_buffers_[i]));
165
146
deserializer.TransferArrayBuffer (i, ab);
166
147
}
167
- array_buffer_contents_ .clear ();
148
+ array_buffers_ .clear ();
168
149
169
150
if (deserializer.ReadHeader (context).IsNothing ())
170
151
return MaybeLocal<Value>();
@@ -173,8 +154,8 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
173
154
}
174
155
175
156
void Message::AddSharedArrayBuffer (
176
- const SharedArrayBufferMetadataReference& reference ) {
177
- shared_array_buffers_.push_back (reference );
157
+ std::shared_ptr<BackingStore> backing_store ) {
158
+ shared_array_buffers_.emplace_back ( std::move (backing_store) );
178
159
}
179
160
180
161
void Message::AddMessagePort (std::unique_ptr<MessagePortData>&& data) {
@@ -249,16 +230,9 @@ class SerializerDelegate : public ValueSerializer::Delegate {
249
230
}
250
231
}
251
232
252
- auto reference = SharedArrayBufferMetadata::ForSharedArrayBuffer (
253
- env_,
254
- context_,
255
- shared_array_buffer);
256
- if (!reference) {
257
- return Nothing<uint32_t >();
258
- }
259
233
seen_shared_array_buffers_.emplace_back (
260
234
Global<SharedArrayBuffer> { isolate, shared_array_buffer });
261
- msg_->AddSharedArrayBuffer (reference );
235
+ msg_->AddSharedArrayBuffer (shared_array_buffer-> GetBackingStore () );
262
236
return Just (i);
263
237
}
264
238
@@ -386,18 +360,12 @@ Maybe<bool> Message::Serialize(Environment* env,
386
360
}
387
361
388
362
for (Local<ArrayBuffer> ab : array_buffers) {
389
- // If serialization succeeded, we want to take ownership of
390
- // (a.k.a. externalize) the underlying memory region and render
391
- // it inaccessible in this Isolate.
392
- ArrayBuffer::Contents contents = ab->Externalize ();
363
+ // If serialization succeeded, we render it inaccessible in this Isolate.
364
+ std::shared_ptr<BackingStore> backing_store = ab->GetBackingStore ();
365
+ ab->Externalize (backing_store);
393
366
ab->Detach ();
394
367
395
- CHECK (env->isolate_data ()->uses_node_allocator ());
396
- env->isolate_data ()->node_allocator ()->UnregisterPointer (
397
- contents.Data (), contents.ByteLength ());
398
-
399
- array_buffer_contents_.emplace_back (MallocedBuffer<char >{
400
- static_cast <char *>(contents.Data ()), contents.ByteLength ()});
368
+ array_buffers_.emplace_back (std::move (backing_store));
401
369
}
402
370
403
371
delegate.Finish ();
@@ -411,9 +379,8 @@ Maybe<bool> Message::Serialize(Environment* env,
411
379
}
412
380
413
381
void Message::MemoryInfo (MemoryTracker* tracker) const {
414
- tracker->TrackField (" array_buffer_contents" , array_buffer_contents_);
415
- tracker->TrackFieldWithSize (" shared_array_buffers" ,
416
- shared_array_buffers_.size () * sizeof (shared_array_buffers_[0 ]));
382
+ tracker->TrackField (" array_buffers_" , array_buffers_);
383
+ tracker->TrackField (" shared_array_buffers" , shared_array_buffers_);
417
384
tracker->TrackField (" message_ports" , message_ports_);
418
385
}
419
386
0 commit comments