feat(napi): add lifetime span to JsBuffer
This commit is contained in:
parent
c0277542a2
commit
f1281af260
2 changed files with 16 additions and 23 deletions
|
@ -219,7 +219,7 @@ impl Env {
|
|||
Ok(JsObject::from_raw_unchecked(self.0, raw_value))
|
||||
}
|
||||
|
||||
pub fn create_buffer(&self, length: u64) -> Result<JsBuffer> {
|
||||
pub fn create_buffer<'env, 'buffer>(&'env self, length: u64) -> Result<JsBuffer<'buffer>> {
|
||||
let mut raw_value = ptr::null_mut();
|
||||
let mut data = Vec::with_capacity(length as usize);
|
||||
let mut data_ptr = data.as_mut_ptr();
|
||||
|
@ -228,7 +228,7 @@ impl Env {
|
|||
})?;
|
||||
mem::forget(data);
|
||||
|
||||
Ok(JsBuffer::from_raw_unchecked(
|
||||
Ok(JsBuffer::new(
|
||||
self.0,
|
||||
raw_value,
|
||||
data_ptr as *mut u8,
|
||||
|
@ -236,7 +236,10 @@ impl Env {
|
|||
))
|
||||
}
|
||||
|
||||
pub fn create_buffer_with_data(&self, mut data: Vec<u8>) -> Result<JsBuffer> {
|
||||
pub fn create_buffer_with_data<'env, 'buffer>(
|
||||
&'env self,
|
||||
mut data: Vec<u8>,
|
||||
) -> Result<JsBuffer<'buffer>> {
|
||||
let length = data.len() as u64;
|
||||
let mut raw_value = ptr::null_mut();
|
||||
let data_ptr = data.as_mut_ptr();
|
||||
|
@ -253,12 +256,7 @@ impl Env {
|
|||
let mut changed = 0;
|
||||
check_status(unsafe { sys::napi_adjust_external_memory(self.0, length as i64, &mut changed) })?;
|
||||
mem::forget(data);
|
||||
Ok(JsBuffer::from_raw_unchecked(
|
||||
self.0,
|
||||
raw_value,
|
||||
data_ptr,
|
||||
length as usize,
|
||||
))
|
||||
Ok(JsBuffer::new(self.0, raw_value, data_ptr, length as usize))
|
||||
}
|
||||
|
||||
pub fn create_arraybuffer(&self, length: u64) -> Result<JsArrayBuffer> {
|
||||
|
|
|
@ -8,18 +8,13 @@ use crate::error::check_status;
|
|||
use crate::{sys, Error, Result};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct JsBuffer {
|
||||
pub struct JsBuffer<'buffer> {
|
||||
pub value: JsObject,
|
||||
pub data: &'static [u8],
|
||||
pub data: &'buffer [u8],
|
||||
}
|
||||
|
||||
impl JsBuffer {
|
||||
pub(crate) fn from_raw_unchecked(
|
||||
env: sys::napi_env,
|
||||
value: sys::napi_value,
|
||||
data: *mut u8,
|
||||
len: usize,
|
||||
) -> Self {
|
||||
impl<'buffer> JsBuffer<'buffer> {
|
||||
pub(crate) fn new(env: sys::napi_env, value: sys::napi_value, data: *mut u8, len: usize) -> Self {
|
||||
Self {
|
||||
value: JsObject(Value {
|
||||
env,
|
||||
|
@ -139,7 +134,7 @@ impl JsBuffer {
|
|||
}
|
||||
}
|
||||
|
||||
impl NapiValue for JsBuffer {
|
||||
impl<'buffer> NapiValue for JsBuffer<'buffer> {
|
||||
fn raw_value(&self) -> sys::napi_value {
|
||||
self.value.0.value
|
||||
}
|
||||
|
@ -177,13 +172,13 @@ impl NapiValue for JsBuffer {
|
|||
}
|
||||
}
|
||||
|
||||
impl AsRef<[u8]> for JsBuffer {
|
||||
impl<'buffer> AsRef<[u8]> for JsBuffer<'buffer> {
|
||||
fn as_ref(&self) -> &[u8] {
|
||||
self.data
|
||||
}
|
||||
}
|
||||
|
||||
impl Deref for JsBuffer {
|
||||
impl<'buffer> Deref for JsBuffer<'buffer> {
|
||||
type Target = [u8];
|
||||
|
||||
fn deref(&self) -> &[u8] {
|
||||
|
@ -191,9 +186,9 @@ impl Deref for JsBuffer {
|
|||
}
|
||||
}
|
||||
|
||||
impl TryFrom<JsUnknown> for JsBuffer {
|
||||
impl<'buffer> TryFrom<JsUnknown> for JsBuffer<'buffer> {
|
||||
type Error = Error;
|
||||
fn try_from(value: JsUnknown) -> Result<JsBuffer> {
|
||||
fn try_from(value: JsUnknown) -> Result<JsBuffer<'buffer>> {
|
||||
JsBuffer::from_raw(value.0.env, value.0.value)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue