feat(napi): implement dataview related apis

This commit is contained in:
LongYinan 2020-10-11 22:15:58 +08:00
parent 809ecfec49
commit ae8de8a631
No known key found for this signature in database
GPG key ID: C3666B7FC82ADAD7
4 changed files with 73 additions and 16 deletions

View file

@ -164,7 +164,7 @@ yarn test
| [napi_create_object](https://nodejs.org/api/n-api.html#n_api_napi_create_object) | 1 | v8.0.0 | ✅ | | [napi_create_object](https://nodejs.org/api/n-api.html#n_api_napi_create_object) | 1 | v8.0.0 | ✅ |
| [napi_create_symbol](https://nodejs.org/api/n-api.html#n_api_napi_create_symbol) | 1 | v8.0.0 | ✅ | | [napi_create_symbol](https://nodejs.org/api/n-api.html#n_api_napi_create_symbol) | 1 | v8.0.0 | ✅ |
| [napi_create_typedarray](https://nodejs.org/api/n-api.html#n_api_napi_create_typedarray) | 1 | v8.0.0 | ✅ | | [napi_create_typedarray](https://nodejs.org/api/n-api.html#n_api_napi_create_typedarray) | 1 | v8.0.0 | ✅ |
| [napi_create_dataview](https://nodejs.org/api/n-api.html#n_api_napi_create_dataview) | 1 | v8.3.0 | ⛔️ | | [napi_create_dataview](https://nodejs.org/api/n-api.html#n_api_napi_create_dataview) | 1 | v8.3.0 | |
| [napi_create_int32](https://nodejs.org/api/n-api.html#n_api_napi_create_int32) | 1 | v8.4.0 | ✅ | | [napi_create_int32](https://nodejs.org/api/n-api.html#n_api_napi_create_int32) | 1 | v8.4.0 | ✅ |
| [napi_create_uint32](https://nodejs.org/api/n-api.html#n_api_napi_create_uint32) | 1 | v8.4.0 | ✅ | | [napi_create_uint32](https://nodejs.org/api/n-api.html#n_api_napi_create_uint32) | 1 | v8.4.0 | ✅ |
| [napi_create_int64](https://nodejs.org/api/n-api.html#n_api_napi_create_int64) | 1 | v8.4.0 | ✅ | | [napi_create_int64](https://nodejs.org/api/n-api.html#n_api_napi_create_int64) | 1 | v8.4.0 | ✅ |
@ -185,7 +185,7 @@ yarn test
| [napi_get_buffer_info](https://nodejs.org/api/n-api.html#n_api_napi_get_buffer_info) | 1 | v8.0.0 | ✅ | | [napi_get_buffer_info](https://nodejs.org/api/n-api.html#n_api_napi_get_buffer_info) | 1 | v8.0.0 | ✅ |
| [napi_get_prototype](https://nodejs.org/api/n-api.html#n_api_napi_get_prototype) | 1 | v8.0.0 | ✅ | | [napi_get_prototype](https://nodejs.org/api/n-api.html#n_api_napi_get_prototype) | 1 | v8.0.0 | ✅ |
| [napi_get_typedarray_info](https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info) | 1 | v8.0.0 | ✅ | | [napi_get_typedarray_info](https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info) | 1 | v8.0.0 | ✅ |
| [napi_get_dataview_info](https://nodejs.org/api/n-api.html#n_api_napi_get_dataview_info) | 1 | v8.3.0 | ⛔️ | | [napi_get_dataview_info](https://nodejs.org/api/n-api.html#n_api_napi_get_dataview_info) | 1 | v8.3.0 | |
| [napi_get_date_value](https://nodejs.org/api/n-api.html#n_api_napi_get_date_value) | 5 | v11.11.0 | ✅ | | [napi_get_date_value](https://nodejs.org/api/n-api.html#n_api_napi_get_date_value) | 5 | v11.11.0 | ✅ |
| [napi_get_value_bool](https://nodejs.org/api/n-api.html#n_api_napi_get_value_bool) | 1 | v8.0.0 | ✅ | | [napi_get_value_bool](https://nodejs.org/api/n-api.html#n_api_napi_get_value_bool) | 1 | v8.0.0 | ✅ |
| [napi_get_value_double](https://nodejs.org/api/n-api.html#n_api_napi_get_value_double) | 1 | v8.0.0 | ✅ | | [napi_get_value_double](https://nodejs.org/api/n-api.html#n_api_napi_get_value_double) | 1 | v8.0.0 | ✅ |

View file

@ -1,5 +1,6 @@
use std::mem; use std::mem;
use std::ops::Deref; use std::ops::Deref;
use std::os::raw::c_void;
use std::ptr; use std::ptr;
use super::{Value, ValueType}; use super::{Value, ValueType};
@ -7,7 +8,7 @@ use crate::error::check_status;
use crate::{sys, JsUnknown, NapiValue, Ref, Result}; use crate::{sys, JsUnknown, NapiValue, Ref, Result};
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, Clone, Copy)] #[derive(Debug)]
pub struct JsArrayBuffer(pub(crate) Value); pub struct JsArrayBuffer(pub(crate) Value);
#[derive(Debug)] #[derive(Debug)]
@ -17,18 +18,30 @@ pub struct JsArrayBufferValue {
} }
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, Clone, Copy)] #[derive(Debug)]
pub struct JsTypedArray(pub(crate) Value); pub struct JsTypedArray(pub(crate) Value);
#[derive(Debug)] #[derive(Debug)]
pub struct JsTypedArrayValue<T> { pub struct JsTypedArrayValue {
pub arraybuffer: JsArrayBuffer, pub arraybuffer: JsArrayBuffer,
pub data: mem::ManuallyDrop<Vec<T>>, data: *mut c_void,
pub byte_offset: u64, pub byte_offset: u64,
pub length: u64, pub length: u64,
pub typedarray_type: TypedArrayType, pub typedarray_type: TypedArrayType,
} }
#[repr(transparent)]
#[derive(Debug)]
pub struct JsDataView(pub(crate) Value);
#[derive(Debug)]
pub struct JsDataViewValue {
pub arraybuffer: JsArrayBuffer,
data: *mut c_void,
pub byte_offset: u64,
pub length: u64,
}
#[derive(Debug)] #[derive(Debug)]
pub enum TypedArrayType { pub enum TypedArrayType {
Int8, Int8,
@ -101,8 +114,8 @@ impl JsArrayBuffer {
}) })
} }
pub fn create_typed_array( pub fn into_typedarray(
&self, self,
typedarray_type: TypedArrayType, typedarray_type: TypedArrayType,
length: u64, length: u64,
byte_offset: u64, byte_offset: u64,
@ -125,6 +138,24 @@ impl JsArrayBuffer {
})) }))
} }
pub fn into_dataview(self, length: u64, byte_offset: u64) -> Result<JsDataView> {
let mut dataview_value = ptr::null_mut();
check_status(unsafe {
sys::napi_create_dataview(
self.0.env,
length,
self.0.value,
byte_offset,
&mut dataview_value,
)
})?;
Ok(JsDataView(Value {
env: self.0.env,
value: dataview_value,
value_type: ValueType::Object,
}))
}
#[inline] #[inline]
pub fn into_ref(self) -> Result<Ref<JsArrayBufferValue>> { pub fn into_ref(self) -> Result<Ref<JsArrayBufferValue>> {
Ref::new(self.0, 1, self.into_value()?) Ref::new(self.0, 1, self.into_value()?)
@ -167,11 +198,11 @@ impl JsTypedArray {
/// https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info /// https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info
/// ///
/// ***Warning***: Use caution while using this API since the underlying data buffer is managed by the VM. /// ***Warning***: Use caution while using this API since the underlying data buffer is managed by the VM.
pub fn into_value<T>(self) -> Result<JsTypedArrayValue<T>> { pub fn into_value(self) -> Result<JsTypedArrayValue> {
let mut typedarray_type = sys::napi_typedarray_type::napi_int8_array; let mut typedarray_type = sys::napi_typedarray_type::napi_int8_array;
let mut len = 0u64; let mut len = 0u64;
let mut data = ptr::null_mut(); let mut data = ptr::null_mut();
let mut array_buffer = ptr::null_mut(); let mut arraybuffer_value = ptr::null_mut();
let mut byte_offset = 0u64; let mut byte_offset = 0u64;
check_status(unsafe { check_status(unsafe {
sys::napi_get_typedarray_info( sys::napi_get_typedarray_info(
@ -180,19 +211,43 @@ impl JsTypedArray {
&mut typedarray_type, &mut typedarray_type,
&mut len, &mut len,
&mut data, &mut data,
&mut array_buffer, &mut arraybuffer_value,
&mut byte_offset, &mut byte_offset,
) )
})?; })?;
Ok(JsTypedArrayValue { Ok(JsTypedArrayValue {
data: mem::ManuallyDrop::new(unsafe { data,
Vec::from_raw_parts(data as *mut T, len as usize, len as usize)
}),
length: len, length: len,
byte_offset, byte_offset,
typedarray_type: typedarray_type.into(), typedarray_type: typedarray_type.into(),
arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, array_buffer), arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, arraybuffer_value),
})
}
}
impl JsDataView {
pub fn into_value(self) -> Result<JsDataViewValue> {
let mut length = 0u64;
let mut byte_offset = 0u64;
let mut arraybuffer_value = ptr::null_mut();
let mut data = ptr::null_mut();
check_status(unsafe {
sys::napi_get_dataview_info(
self.0.env,
self.0.value,
&mut length,
&mut data,
&mut arraybuffer_value,
&mut byte_offset,
)
})?;
Ok(JsDataViewValue {
arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, arraybuffer_value),
byte_offset,
length,
data,
}) })
} }
} }

View file

@ -9,7 +9,7 @@ use crate::error::check_status;
use crate::{sys, JsUnknown, NapiValue, Ref, Result}; use crate::{sys, JsUnknown, NapiValue, Ref, Result};
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, Clone, Copy)] #[derive(Debug)]
pub struct JsBuffer(pub(crate) Value); pub struct JsBuffer(pub(crate) Value);
#[derive(Debug)] #[derive(Debug)]

View file

@ -446,6 +446,7 @@ impl_js_value_methods!(JsBoolean);
impl_js_value_methods!(JsBuffer); impl_js_value_methods!(JsBuffer);
impl_js_value_methods!(JsArrayBuffer); impl_js_value_methods!(JsArrayBuffer);
impl_js_value_methods!(JsTypedArray); impl_js_value_methods!(JsTypedArray);
impl_js_value_methods!(JsDataView);
impl_js_value_methods!(JsNumber); impl_js_value_methods!(JsNumber);
impl_js_value_methods!(JsString); impl_js_value_methods!(JsString);
impl_js_value_methods!(JsObject); impl_js_value_methods!(JsObject);
@ -470,6 +471,7 @@ impl_napi_value_trait!(JsBoolean, Boolean);
impl_napi_value_trait!(JsBuffer, Object); impl_napi_value_trait!(JsBuffer, Object);
impl_napi_value_trait!(JsArrayBuffer, Object); impl_napi_value_trait!(JsArrayBuffer, Object);
impl_napi_value_trait!(JsTypedArray, Object); impl_napi_value_trait!(JsTypedArray, Object);
impl_napi_value_trait!(JsDataView, Object);
impl_napi_value_trait!(JsNumber, Number); impl_napi_value_trait!(JsNumber, Number);
impl_napi_value_trait!(JsString, String); impl_napi_value_trait!(JsString, String);
impl_napi_value_trait!(JsObject, Object); impl_napi_value_trait!(JsObject, Object);