22// SPDX-License-Identifier: Apache-2.0
33use std:: { rc:: Rc , slice} ;
44
5+ use half:: f16;
56use rquickjs:: {
67 atom:: PredefinedAtom ,
78 class:: { Trace , Tracer } ,
@@ -228,9 +229,11 @@ pub enum ObjectBytes<'js> {
228229 I32Array ( TypedArray < ' js , i32 > ) ,
229230 U64Array ( TypedArray < ' js , u64 > ) ,
230231 I64Array ( TypedArray < ' js , i64 > ) ,
232+ F16Array ( TypedArray < ' js , f16 > ) ,
231233 F32Array ( TypedArray < ' js , f32 > ) ,
232234 F64Array ( TypedArray < ' js , f64 > ) ,
233- DataView ( ArrayBuffer < ' js > , usize , usize ) , // buffer, offset, length
235+ U8ClampedArray ( ArrayBuffer < ' js > , usize , usize ) , // buffer, offset, length
236+ DataView ( ArrayBuffer < ' js > , usize , usize ) , // buffer, offset, length
234237 Vec ( Vec < u8 > ) ,
235238}
236239
@@ -250,9 +253,11 @@ impl<'js> Trace<'js> for ObjectBytes<'js> {
250253 ObjectBytes :: I32Array ( a) => a. trace ( tracer) ,
251254 ObjectBytes :: U64Array ( a) => a. trace ( tracer) ,
252255 ObjectBytes :: I64Array ( a) => a. trace ( tracer) ,
256+ ObjectBytes :: F16Array ( a) => a. trace ( tracer) ,
253257 ObjectBytes :: F32Array ( a) => a. trace ( tracer) ,
254258 ObjectBytes :: F64Array ( a) => a. trace ( tracer) ,
255- ObjectBytes :: DataView ( d, _, _) => d. trace ( tracer) ,
259+ ObjectBytes :: U8ClampedArray ( ab, _, _) => ab. trace ( tracer) ,
260+ ObjectBytes :: DataView ( ab, _, _) => ab. trace ( tracer) ,
256261 ObjectBytes :: Vec ( v) => v. trace ( tracer) ,
257262 }
258263 }
@@ -269,11 +274,16 @@ impl<'js> IntoJs<'js> for ObjectBytes<'js> {
269274 ObjectBytes :: I32Array ( a) => a. into_js ( ctx) ,
270275 ObjectBytes :: U64Array ( a) => a. into_js ( ctx) ,
271276 ObjectBytes :: I64Array ( a) => a. into_js ( ctx) ,
277+ ObjectBytes :: F16Array ( a) => a. into_js ( ctx) ,
272278 ObjectBytes :: F32Array ( a) => a. into_js ( ctx) ,
273279 ObjectBytes :: F64Array ( a) => a. into_js ( ctx) ,
274- ObjectBytes :: DataView ( d, _, _) => {
280+ ObjectBytes :: U8ClampedArray ( ab, _, _) => {
281+ let ctor: Constructor = ctx. globals ( ) . get ( PredefinedAtom :: Uint8ClampedArray ) ?;
282+ ctor. construct ( ( ab, ) )
283+ } ,
284+ ObjectBytes :: DataView ( ab, _, _) => {
275285 let ctor: Constructor = ctx. globals ( ) . get ( PredefinedAtom :: DataView ) ?;
276- ctor. construct ( ( d , ) )
286+ ctor. construct ( ( ab , ) )
277287 } ,
278288 ObjectBytes :: Vec ( v) => v. into_js ( ctx) ,
279289 }
@@ -359,11 +369,15 @@ impl<'js> ObjectBytes<'js> {
359369 ObjectBytes :: I32Array ( array) => array. as_bytes ( ) ,
360370 ObjectBytes :: U64Array ( array) => array. as_bytes ( ) ,
361371 ObjectBytes :: I64Array ( array) => array. as_bytes ( ) ,
372+ ObjectBytes :: F16Array ( array) => array. as_bytes ( ) ,
362373 ObjectBytes :: F32Array ( array) => array. as_bytes ( ) ,
363374 ObjectBytes :: F64Array ( array) => array. as_bytes ( ) ,
364- ObjectBytes :: DataView ( array_buffer, offset, length) => array_buffer
365- . as_bytes ( )
366- . map ( |b| & b[ * offset..* offset + * length] ) ,
375+ ObjectBytes :: U8ClampedArray ( ab, offset, length) => {
376+ ab. as_bytes ( ) . map ( |b| & b[ * offset..* offset + * length] )
377+ } ,
378+ ObjectBytes :: DataView ( ab, offset, length) => {
379+ ab. as_bytes ( ) . map ( |b| & b[ * offset..* offset + * length] )
380+ } ,
367381 ObjectBytes :: Vec ( bytes) => Some ( bytes. as_ref ( ) ) ,
368382 }
369383 . ok_or ( ERROR_MSG_ARRAY_BUFFER_DETACHED . into ( ) )
@@ -419,6 +433,10 @@ impl<'js> ObjectBytes<'js> {
419433 return Ok ( Some ( ObjectBytes :: I64Array ( typed_array) ) ) ;
420434 }
421435
436+ if let Ok ( typed_array) = TypedArray :: < f16 > :: from_object ( obj. clone ( ) ) {
437+ return Ok ( Some ( ObjectBytes :: F16Array ( typed_array) ) ) ;
438+ }
439+
422440 if let Ok ( typed_array) = TypedArray :: < f32 > :: from_object ( obj. clone ( ) ) {
423441 return Ok ( Some ( ObjectBytes :: F32Array ( typed_array) ) ) ;
424442 }
@@ -427,24 +445,23 @@ impl<'js> ObjectBytes<'js> {
427445 return Ok ( Some ( ObjectBytes :: F64Array ( typed_array) ) ) ;
428446 }
429447
430- if let Ok ( array_buffer) = obj. get :: < _ , ArrayBuffer > ( "buffer" ) {
431- let byte_offset: usize = obj. get ( "byteOffset" ) . unwrap_or ( 0 ) ;
432- let byte_length: usize = obj. get ( "byteLength" ) . unwrap_or_else ( |_| array_buffer. len ( ) ) ;
433- return Ok ( Some ( ObjectBytes :: DataView (
434- array_buffer,
435- byte_offset,
436- byte_length,
437- ) ) ) ;
448+ if let Ok ( ab) = obj. get :: < _ , ArrayBuffer > ( "buffer" ) {
449+ let tag: String = obj
450+ . get ( PredefinedAtom :: SymbolToStringTag )
451+ . unwrap_or_default ( ) ;
452+ let offset: usize = obj. get ( "byteOffset" ) . unwrap_or ( 0 ) ;
453+ let length: usize = obj. get ( "byteLength" ) . unwrap_or_else ( |_| ab. len ( ) ) ;
454+ return Ok ( Some ( match tag. as_str ( ) {
455+ "Uint8ClampedArray" => ObjectBytes :: U8ClampedArray ( ab, offset, length) ,
456+ _ => ObjectBytes :: DataView ( ab, offset, length) ,
457+ } ) ) ;
438458 }
439459
440460 Ok ( None )
441461 }
442462
443463 pub fn get_array_buffer ( & self ) -> Result < Option < ( ArrayBuffer < ' js > , usize , usize ) > > {
444464 let buffer = match self {
445- ObjectBytes :: DataView ( array_buffer, offset, length) => {
446- ( array_buffer. clone ( ) , * length, * offset)
447- } ,
448465 ObjectBytes :: U8Array ( typed_array) => {
449466 let byte_length = typed_array. len ( ) ;
450467 (
@@ -509,6 +526,14 @@ impl<'js> ObjectBytes<'js> {
509526 typed_array. get ( "byteOffset" ) ?,
510527 )
511528 } ,
529+ ObjectBytes :: F16Array ( typed_array) => {
530+ let byte_length = typed_array. len ( ) * 2 ;
531+ (
532+ typed_array. arraybuffer ( ) ?,
533+ byte_length,
534+ typed_array. get ( "byteOffset" ) ?,
535+ )
536+ } ,
512537 ObjectBytes :: F32Array ( typed_array) => {
513538 let byte_length = typed_array. len ( ) * 4 ;
514539 (
@@ -525,6 +550,12 @@ impl<'js> ObjectBytes<'js> {
525550 typed_array. get ( "byteOffset" ) ?,
526551 )
527552 } ,
553+ ObjectBytes :: U8ClampedArray ( buffer, offset, length) => {
554+ ( buffer. clone ( ) , * length, * offset)
555+ } ,
556+ ObjectBytes :: DataView ( array_buffer, offset, length) => {
557+ ( array_buffer. clone ( ) , * length, * offset)
558+ } ,
528559 _ => return Ok ( None ) ,
529560 } ;
530561
0 commit comments