@@ -321,8 +321,9 @@ class SerializerDelegate : public ValueSerializer::Delegate {
321321 }
322322
323323 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);
326327 }
327328
328329 // Convert process.env to a regular object.
@@ -536,8 +537,7 @@ Maybe<bool> Message::Serialize(Environment* env,
536537 ThrowDataCloneException (context, env->clone_untransferable_str ());
537538 return Nothing<bool >();
538539 }
539- JSTransferable* js_transferable = JSTransferable::Wrap (env, entry);
540- host_object = BaseObjectPtr<BaseObject>{js_transferable};
540+ host_object = JSTransferable::Wrap (env, entry);
541541 }
542542
543543 if (env->message_port_constructor_template ()->HasInstance (entry) &&
@@ -1190,22 +1190,26 @@ Local<FunctionTemplate> GetMessagePortConstructorTemplate(Environment* env) {
11901190}
11911191
11921192// static
1193- JSTransferable* JSTransferable::Wrap (Environment* env, Local<Object> target) {
1193+ BaseObjectPtr<JSTransferable> JSTransferable::Wrap (Environment* env,
1194+ Local<Object> target) {
11941195 Local<Context> context = env->context ();
11951196 Local<Value> wrapper_val =
11961197 target->GetPrivate (context, env->js_transferable_wrapper_private_symbol ())
11971198 .ToLocalChecked ();
11981199 DCHECK (wrapper_val->IsObject () || wrapper_val->IsUndefined ());
1199- JSTransferable* wrapper;
1200+ BaseObjectPtr< JSTransferable> wrapper;
12001201 if (wrapper_val->IsObject ()) {
1201- wrapper = Unwrap<JSTransferable>(wrapper_val);
1202+ wrapper =
1203+ BaseObjectPtr<JSTransferable>{Unwrap<JSTransferable>(wrapper_val)};
12021204 } else {
12031205 Local<Object> wrapper_obj = env->js_transferable_constructor_template ()
12041206 ->GetFunction (context)
12051207 .ToLocalChecked ()
12061208 ->NewInstance (context)
12071209 .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);
12091213 target
12101214 ->SetPrivate (
12111215 context, env->js_transferable_wrapper_private_symbol (), wrapper_obj)
@@ -1226,12 +1230,18 @@ JSTransferable::JSTransferable(Environment* env,
12261230 Local<Object> obj,
12271231 Local<Object> target)
12281232 : BaseObject(env, obj) {
1229- MakeWeak ();
12301233 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 ());
12321241}
12331242
12341243Local<Object> JSTransferable::target () const {
1244+ DCHECK (!target_.IsEmpty ());
12351245 return target_.Get (env ()->isolate ());
12361246}
12371247
@@ -1335,8 +1345,7 @@ JSTransferable::NestedTransferables() const {
13351345 if (!JSTransferable::IsJSTransferable (env (), context, obj)) {
13361346 continue ;
13371347 }
1338- JSTransferable* js_transferable = JSTransferable::Wrap (env (), obj);
1339- ret.emplace_back (js_transferable);
1348+ ret.emplace_back (JSTransferable::Wrap (env (), obj));
13401349 }
13411350 return Just (ret);
13421351}
@@ -1397,8 +1406,7 @@ BaseObjectPtr<BaseObject> JSTransferable::Data::Deserialize(
13971406 if (!JSTransferable::IsJSTransferable (env, context, ret.As <Object>())) {
13981407 return {};
13991408 }
1400- JSTransferable* js_transferable = JSTransferable::Wrap (env, ret.As <Object>());
1401- return BaseObjectPtr<BaseObject>{js_transferable};
1409+ return JSTransferable::Wrap (env, ret.As <Object>());
14021410}
14031411
14041412Maybe<bool > JSTransferable::Data::FinalizeTransferWrite (
0 commit comments