2021-09-23 02:29:09 +09:00
|
|
|
mod callback_info;
|
|
|
|
mod env;
|
|
|
|
mod error;
|
|
|
|
mod js_values;
|
|
|
|
mod module_register;
|
|
|
|
|
|
|
|
pub use callback_info::*;
|
|
|
|
pub use ctor::ctor;
|
|
|
|
pub use env::*;
|
|
|
|
pub use js_values::*;
|
|
|
|
pub use module_register::*;
|
|
|
|
|
|
|
|
use super::sys;
|
|
|
|
use std::{ffi::c_void, mem};
|
|
|
|
|
|
|
|
/// # Safety
|
|
|
|
///
|
|
|
|
/// called when node wrapper objects destroyed
|
|
|
|
pub unsafe extern "C" fn raw_finalize_unchecked<T>(
|
|
|
|
env: sys::napi_env,
|
|
|
|
finalize_data: *mut c_void,
|
|
|
|
finalize_hint: *mut c_void,
|
|
|
|
) {
|
|
|
|
let obj = finalize_data as *mut T;
|
2022-01-13 12:15:02 +09:00
|
|
|
unsafe { Box::from_raw(obj) };
|
2021-09-23 02:29:09 +09:00
|
|
|
if !finalize_hint.is_null() {
|
2022-01-13 12:15:02 +09:00
|
|
|
let size_hint = unsafe { *Box::from_raw(finalize_hint as *mut Option<i64>) };
|
2021-09-23 02:29:09 +09:00
|
|
|
if let Some(changed) = size_hint {
|
|
|
|
let mut adjusted = 0i64;
|
2022-01-13 12:15:02 +09:00
|
|
|
let status = unsafe { sys::napi_adjust_external_memory(env, -changed, &mut adjusted) };
|
2021-09-23 02:29:09 +09:00
|
|
|
debug_assert!(
|
|
|
|
status == sys::Status::napi_ok,
|
|
|
|
"Calling napi_adjust_external_memory failed"
|
|
|
|
);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// # Safety
|
|
|
|
///
|
|
|
|
/// called when node buffer is ready for gc
|
|
|
|
pub unsafe extern "C" fn drop_buffer(
|
|
|
|
_env: sys::napi_env,
|
|
|
|
finalize_data: *mut c_void,
|
|
|
|
finalize_hint: *mut c_void,
|
|
|
|
) {
|
|
|
|
let length_ptr = finalize_hint as *mut (usize, usize);
|
2022-01-13 12:15:02 +09:00
|
|
|
unsafe {
|
|
|
|
let (length, cap) = *Box::from_raw(length_ptr);
|
|
|
|
mem::drop(Vec::from_raw_parts(finalize_data as *mut u8, length, cap));
|
|
|
|
}
|
2021-09-23 02:29:09 +09:00
|
|
|
}
|