fix(napi): deref from Uint8ClampedArray

This commit is contained in:
LongYinan 2022-02-07 12:24:09 +08:00
parent 25f2147e6b
commit 2763a8e7b2
No known key found for this signature in database
GPG key ID: C3666B7FC82ADAD7
6 changed files with 17 additions and 1 deletions

View file

@ -263,7 +263,8 @@ impl JsTypedArray {
impl JsTypedArrayValue { impl JsTypedArrayValue {
#[inline] #[inline]
fn is_valid_as_ref(&self, dest_type: TypedArrayType) { fn is_valid_as_ref(&self, dest_type: TypedArrayType) {
if self.typedarray_type == TypedArrayType::Uint8Clamped && dest_type != TypedArrayType::Uint8 { // deref `Uint8ClampedArray` as `&[u8]` is valid
if self.typedarray_type == TypedArrayType::Uint8Clamped && dest_type == TypedArrayType::Uint8 {
return; return;
} }
if self.typedarray_type != dest_type { if self.typedarray_type != dest_type {

View file

@ -145,6 +145,7 @@ Generated by [AVA](https://avajs.dev).
export function convertU32Array(input: Uint32Array): Array<number> export function convertU32Array(input: Uint32Array): Array<number>
export function createExternalTypedArray(): Uint32Array␊ export function createExternalTypedArray(): Uint32Array␊
export function mutateTypedArray(input: Float32Array): void␊ export function mutateTypedArray(input: Float32Array): void␊
export function derefUint8Array(a: Uint8Array, b: Uint8ClampedArray): number␊
/**␊ /**␊
* \`constructor\` option for \`struct\` requires all fields to be public,␊ * \`constructor\` option for \`struct\` requires all fields to be public,␊
* otherwise tag impl fn as constructor␊ * otherwise tag impl fn as constructor␊

View file

@ -83,6 +83,7 @@ import {
testSerdeRoundtrip, testSerdeRoundtrip,
createObjWithProperty, createObjWithProperty,
dateToNumber, dateToNumber,
derefUint8Array,
} from '../' } from '../'
test('export const', (t) => { test('export const', (t) => {
@ -358,6 +359,13 @@ test('mutate TypedArray', (t) => {
t.deepEqual(input, new Float32Array([2.0, 4.0, 6.0, 8.0, 10.0])) t.deepEqual(input, new Float32Array([2.0, 4.0, 6.0, 8.0, 10.0]))
}) })
test('deref uint8 array', (t) => {
t.is(
derefUint8Array(new Uint8Array([1, 2]), new Uint8ClampedArray([3, 4])),
4,
)
})
test('async', async (t) => { test('async', async (t) => {
const bufPromise = readFileAsync(join(__dirname, '../package.json')) const bufPromise = readFileAsync(join(__dirname, '../package.json'))
await t.notThrowsAsync(bufPromise) await t.notThrowsAsync(bufPromise)

View file

@ -135,6 +135,7 @@ export function appendBuffer(buf: Buffer): Buffer
export function convertU32Array(input: Uint32Array): Array<number> export function convertU32Array(input: Uint32Array): Array<number>
export function createExternalTypedArray(): Uint32Array export function createExternalTypedArray(): Uint32Array
export function mutateTypedArray(input: Float32Array): void export function mutateTypedArray(input: Float32Array): void
export function derefUint8Array(a: Uint8Array, b: Uint8ClampedArray): number
/** /**
* `constructor` option for `struct` requires all fields to be public, * `constructor` option for `struct` requires all fields to be public,
* otherwise tag impl fn as constructor * otherwise tag impl fn as constructor

View file

@ -28,3 +28,8 @@ fn mutate_typed_array(mut input: Float32Array) {
*item *= 2.0; *item *= 2.0;
} }
} }
#[napi]
fn deref_uint8_array(a: Uint8Array, b: Uint8ClampedArray) -> u32 {
(a.len() + b.len()) as u32
}