fix(napi): fallback to copy buffer if zero copy is not allowed ()

This commit is contained in:
LongYinan 2023-01-19 17:26:59 +08:00 committed by GitHub
parent bdbdbccb56
commit fda0aa0eec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 154 additions and 166 deletions
crates
napi/src/bindgen_runtime/js_values
sys/src

View file

@ -231,16 +231,31 @@ impl ToNapiValue for Buffer {
// the same data pointer if it's 0x0.
unsafe { sys::napi_create_buffer(env, len, ptr::null_mut(), &mut ret) }
} else {
unsafe {
let value_ptr = val.inner.as_ptr();
let val_box_ptr = Box::into_raw(Box::new(val));
let mut status = unsafe {
sys::napi_create_external_buffer(
env,
len,
val.inner.as_ptr() as *mut c_void,
value_ptr as *mut c_void,
Some(drop_buffer),
Box::into_raw(Box::new(val)) as *mut c_void,
val_box_ptr as *mut c_void,
&mut ret,
)
};
if status == napi_sys::Status::napi_no_external_buffers_allowed {
let value = unsafe { Box::from_raw(val_box_ptr) };
status = unsafe {
sys::napi_create_buffer_copy(
env,
len,
value.inner.as_ptr() as *mut c_void,
ptr::null_mut(),
&mut ret,
)
};
}
status
},
"Failed to create napi buffer"
)?;

View file

@ -131,6 +131,7 @@ pub mod Status {
pub const napi_arraybuffer_expected: i32 = 19;
pub const napi_detachable_arraybuffer_expected: i32 = 20;
pub const napi_would_deadlock: i32 = 21; // unused
pub const napi_no_external_buffers_allowed: i32 = 22;
}
pub type napi_callback =