@@ -321,8 +321,9 @@ class SerializerDelegate : public ValueSerializer::Delegate {
321
321
}
322
322
323
323
if (JSTransferable::IsJSTransferable (env_, context_, object)) {
324
- JSTransferable* js_transferable = JSTransferable::Wrap (env_, object);
325
- return WriteHostObject (BaseObjectPtr<BaseObject>{js_transferable});
324
+ BaseObjectPtr<JSTransferable> js_transferable =
325
+ JSTransferable::Wrap (env_, object);
326
+ return WriteHostObject (js_transferable);
326
327
}
327
328
328
329
// Convert process.env to a regular object.
@@ -536,8 +537,7 @@ Maybe<bool> Message::Serialize(Environment* env,
536
537
ThrowDataCloneException (context, env->clone_untransferable_str ());
537
538
return Nothing<bool >();
538
539
}
539
- JSTransferable* js_transferable = JSTransferable::Wrap (env, entry);
540
- host_object = BaseObjectPtr<BaseObject>{js_transferable};
540
+ host_object = JSTransferable::Wrap (env, entry);
541
541
}
542
542
543
543
if (env->message_port_constructor_template ()->HasInstance (entry) &&
@@ -1190,22 +1190,26 @@ Local<FunctionTemplate> GetMessagePortConstructorTemplate(Environment* env) {
1190
1190
}
1191
1191
1192
1192
// static
1193
- JSTransferable* JSTransferable::Wrap (Environment* env, Local<Object> target) {
1193
+ BaseObjectPtr<JSTransferable> JSTransferable::Wrap (Environment* env,
1194
+ Local<Object> target) {
1194
1195
Local<Context> context = env->context ();
1195
1196
Local<Value> wrapper_val =
1196
1197
target->GetPrivate (context, env->js_transferable_wrapper_private_symbol ())
1197
1198
.ToLocalChecked ();
1198
1199
DCHECK (wrapper_val->IsObject () || wrapper_val->IsUndefined ());
1199
- JSTransferable* wrapper;
1200
+ BaseObjectPtr< JSTransferable> wrapper;
1200
1201
if (wrapper_val->IsObject ()) {
1201
- wrapper = Unwrap<JSTransferable>(wrapper_val);
1202
+ wrapper =
1203
+ BaseObjectPtr<JSTransferable>{Unwrap<JSTransferable>(wrapper_val)};
1202
1204
} else {
1203
1205
Local<Object> wrapper_obj = env->js_transferable_constructor_template ()
1204
1206
->GetFunction (context)
1205
1207
.ToLocalChecked ()
1206
1208
->NewInstance (context)
1207
1209
.ToLocalChecked ();
1208
- wrapper = new JSTransferable (env, wrapper_obj, target);
1210
+ // Make sure the JSTransferable wrapper object is not garbage collected
1211
+ // until the strong BaseObjectPtr's reference count is decreased to 0.
1212
+ wrapper = MakeDetachedBaseObject<JSTransferable>(env, wrapper_obj, target);
1209
1213
target
1210
1214
->SetPrivate (
1211
1215
context, env->js_transferable_wrapper_private_symbol (), wrapper_obj)
@@ -1226,12 +1230,18 @@ JSTransferable::JSTransferable(Environment* env,
1226
1230
Local<Object> obj,
1227
1231
Local<Object> target)
1228
1232
: BaseObject(env, obj) {
1229
- MakeWeak ();
1230
1233
target_.Reset (env->isolate (), target);
1231
- target_.SetWeak ();
1234
+ }
1235
+
1236
+ JSTransferable::~JSTransferable () {
1237
+ HandleScope scope (env ()->isolate ());
1238
+ target_.Get (env ()->isolate ())
1239
+ ->DeletePrivate (env ()->context (),
1240
+ env ()->js_transferable_wrapper_private_symbol ());
1232
1241
}
1233
1242
1234
1243
Local<Object> JSTransferable::target () const {
1244
+ DCHECK (!target_.IsEmpty ());
1235
1245
return target_.Get (env ()->isolate ());
1236
1246
}
1237
1247
@@ -1335,8 +1345,7 @@ JSTransferable::NestedTransferables() const {
1335
1345
if (!JSTransferable::IsJSTransferable (env (), context, obj)) {
1336
1346
continue ;
1337
1347
}
1338
- JSTransferable* js_transferable = JSTransferable::Wrap (env (), obj);
1339
- ret.emplace_back (js_transferable);
1348
+ ret.emplace_back (JSTransferable::Wrap (env (), obj));
1340
1349
}
1341
1350
return Just (ret);
1342
1351
}
@@ -1397,8 +1406,7 @@ BaseObjectPtr<BaseObject> JSTransferable::Data::Deserialize(
1397
1406
if (!JSTransferable::IsJSTransferable (env, context, ret.As <Object>())) {
1398
1407
return {};
1399
1408
}
1400
- JSTransferable* js_transferable = JSTransferable::Wrap (env, ret.As <Object>());
1401
- return BaseObjectPtr<BaseObject>{js_transferable};
1409
+ return JSTransferable::Wrap (env, ret.As <Object>());
1402
1410
}
1403
1411
1404
1412
Maybe<bool > JSTransferable::Data::FinalizeTransferWrite (
0 commit comments