Skip to content

Commit 421cb77

Browse files
authored
add delete_reference method to JsEnv; invoke after calling napi_wrap (#56)
1 parent 2f30a04 commit 421cb77

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

nj-core/src/basic.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ impl JsEnv {
387387
Ok(js_constructor)
388388
}
389389

390-
pub fn create_reference(&self, cons: napi_value,count: u32) -> Result<napi_ref,NjError> {
390+
pub fn create_reference(&self, cons: napi_value,count: u32) -> Result<napi_ref,NjError> {
391391

392392
let mut result = ptr::null_mut();
393393
napi_call_result!(
@@ -402,6 +402,9 @@ impl JsEnv {
402402
Ok(result)
403403
}
404404

405+
pub fn delete_reference(&self, ref_: napi_ref) -> Result<(), NjError> {
406+
Ok(napi_call_result!(crate::sys::napi_delete_reference(self.0, ref_))?)
407+
}
405408

406409
pub fn get_new_target(&self, info: napi_callback_info) -> Result<napi_value,NjError> {
407410

nj-core/src/class.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ impl <T>JSObjectWrapper<T> where T: JSClass {
4747
rust_ref.wrapper = wrap;
4848
}
4949

50+
// Finally, remove the reference in response to finalize callback
51+
// See footnote on `napi_wrap` documentation: https://nodejs.org/api/n-api.html#n_api_napi_wrap
52+
//
53+
// "Caution: The optional returned reference (if obtained) should be deleted via napi_delete_reference
54+
// ONLY in response to the finalize callback invocation. If it is deleted before then,
55+
// then the finalize callback may never be invoked. Therefore, when obtaining a reference a
56+
// finalize callback is also required in order to enable correct disposal of the reference."
57+
js_env.delete_reference(wrap);
58+
5059
Ok(js_cb.this_owned())
5160
}
5261
}
@@ -153,7 +162,7 @@ pub trait JSClass: Sized {
153162
debug!("my object finalize");
154163
unsafe {
155164
let ptr: *mut JSObjectWrapper<Self> = finalize_data as *mut JSObjectWrapper<Self>;
156-
let _rust = Box::from_raw(ptr);
165+
Box::from_raw(ptr);
157166
}
158167

159168
}

0 commit comments

Comments
 (0)