From 525d8815905520ad870a389c9d00c658739a43e2 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Thu, 25 Aug 2022 21:51:06 +0800 Subject: [PATCH] fix(napi): remove previous reference if value_ref existed Usually happens while using ZST --- crates/backend/src/codegen/struct.rs | 2 +- crates/napi/src/bindgen_runtime/callback_info.rs | 2 ++ crates/napi/src/bindgen_runtime/js_values/value_ref.rs | 7 +++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/crates/backend/src/codegen/struct.rs b/crates/backend/src/codegen/struct.rs index 56bd28ba83..a4895680e1 100644 --- a/crates/backend/src/codegen/struct.rs +++ b/crates/backend/src/codegen/struct.rs @@ -375,7 +375,7 @@ impl NapiStruct { "Failed to wrap native object of class `{}`", #js_name_raw )?; - napi::bindgen_prelude::Reference::<#name>::add_ref(wrapped_value, (wrapped_value, object_ref, finalize_callbacks_ptr)); + napi::bindgen_prelude::Reference::<#name>::add_ref(env, wrapped_value, (wrapped_value, object_ref, finalize_callbacks_ptr)); Ok(result) } } diff --git a/crates/napi/src/bindgen_runtime/callback_info.rs b/crates/napi/src/bindgen_runtime/callback_info.rs index 08363745a8..f7c238a46b 100644 --- a/crates/napi/src/bindgen_runtime/callback_info.rs +++ b/crates/napi/src/bindgen_runtime/callback_info.rs @@ -94,6 +94,7 @@ impl CallbackInfo { }; Reference::::add_ref( + self.env, value_ref as *mut c_void, (value_ref as *mut c_void, object_ref, finalize_callbacks_ptr), ); @@ -176,6 +177,7 @@ impl CallbackInfo { )?; Reference::::add_ref( + self.env, value_ref as *mut c_void, (value_ref as *mut c_void, object_ref, finalize_callbacks_ptr), ); diff --git a/crates/napi/src/bindgen_runtime/js_values/value_ref.rs b/crates/napi/src/bindgen_runtime/js_values/value_ref.rs index 9f61d76f31..48a88d8211 100644 --- a/crates/napi/src/bindgen_runtime/js_values/value_ref.rs +++ b/crates/napi/src/bindgen_runtime/js_values/value_ref.rs @@ -59,9 +59,12 @@ impl Drop for Reference { impl Reference { #[doc(hidden)] - pub fn add_ref(t: *mut c_void, value: RefInformation) { + pub fn add_ref(env: crate::sys::napi_env, t: *mut c_void, value: RefInformation) { REFERENCE_MAP.borrow_mut(|map| { - map.insert(t, value); + if let Some((_, previous_ref, previous_rc)) = map.insert(t, value) { + unsafe { Rc::from_raw(previous_rc) }; + unsafe { crate::sys::napi_delete_reference(env, previous_ref) }; + } }); }