@@ -1192,80 +1192,90 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
11921192 fn jsValueToTypedArray (_ : * JsContext , comptime T : type , js_value : v8.Value ) ! ? []T {
11931193 var force_u8 = false ;
11941194 var array_buffer : ? v8.ArrayBuffer = null ;
1195+
1196+ var byte_len : usize = undefined ;
1197+ var byte_offset : usize = undefined ;
1198+
11951199 if (js_value .isTypedArray ()) {
11961200 const buffer_view = js_value .castTo (v8 .ArrayBufferView );
1201+
1202+ byte_len = buffer_view .getByteLength ();
1203+ byte_offset = buffer_view .getByteOffset ();
11971204 array_buffer = buffer_view .getBuffer ();
11981205 } else if (js_value .isArrayBufferView ()) {
11991206 force_u8 = true ;
12001207 const buffer_view = js_value .castTo (v8 .ArrayBufferView );
1208+ byte_len = buffer_view .getByteLength ();
1209+ byte_offset = buffer_view .getByteOffset ();
12011210 array_buffer = buffer_view .getBuffer ();
12021211 } else if (js_value .isArrayBuffer ()) {
12031212 force_u8 = true ;
12041213 array_buffer = js_value .castTo (v8 .ArrayBuffer );
1214+ byte_len = array_buffer .? .getByteLength ();
1215+ byte_offset = 0 ;
12051216 }
12061217
12071218 const buffer = array_buffer orelse return null ;
12081219
12091220 const backing_store = v8 .BackingStore .sharedPtrGet (& buffer .getBackingStore ());
12101221 const data = backing_store .getData ();
1211- const byte_len = backing_store .getByteLength ();
12121222
12131223 switch (T ) {
12141224 u8 = > {
12151225 // need this sentinel check to keep the compiler happy
12161226 if (force_u8 or js_value .isUint8Array () or js_value .isUint8ClampedArray ()) {
12171227 if (byte_len == 0 ) return &[_ ]u8 {};
12181228 const arr_ptr = @as ([* ]u8 , @ptrCast (@alignCast (data )));
1219- return arr_ptr [0 .. byte_len ];
1229+ return arr_ptr [byte_offset .. byte_len ];
12201230 }
12211231 },
12221232 i8 = > {
12231233 if (js_value .isInt8Array ()) {
12241234 if (byte_len == 0 ) return &[_ ]i8 {};
12251235 const arr_ptr = @as ([* ]i8 , @ptrCast (@alignCast (data )));
1226- return arr_ptr [0 .. byte_len ];
1236+ return arr_ptr [byte_offset .. byte_len ];
12271237 }
12281238 },
12291239 u16 = > {
12301240 if (js_value .isUint16Array ()) {
12311241 if (byte_len == 0 ) return &[_ ]u16 {};
12321242 const arr_ptr = @as ([* ]u16 , @ptrCast (@alignCast (data )));
1233- return arr_ptr [0 .. byte_len / 2 ];
1243+ return arr_ptr [byte_offset .. byte_len / 2 ];
12341244 }
12351245 },
12361246 i16 = > {
12371247 if (js_value .isInt16Array ()) {
12381248 if (byte_len == 0 ) return &[_ ]i16 {};
12391249 const arr_ptr = @as ([* ]i16 , @ptrCast (@alignCast (data )));
1240- return arr_ptr [0 .. byte_len / 2 ];
1250+ return arr_ptr [byte_offset .. byte_len / 2 ];
12411251 }
12421252 },
12431253 u32 = > {
12441254 if (js_value .isUint32Array ()) {
12451255 if (byte_len == 0 ) return &[_ ]u32 {};
12461256 const arr_ptr = @as ([* ]u32 , @ptrCast (@alignCast (data )));
1247- return arr_ptr [0 .. byte_len / 4 ];
1257+ return arr_ptr [byte_offset .. byte_len / 4 ];
12481258 }
12491259 },
12501260 i32 = > {
12511261 if (js_value .isInt32Array ()) {
12521262 if (byte_len == 0 ) return &[_ ]i32 {};
12531263 const arr_ptr = @as ([* ]i32 , @ptrCast (@alignCast (data )));
1254- return arr_ptr [0 .. byte_len / 4 ];
1264+ return arr_ptr [byte_offset .. byte_len / 4 ];
12551265 }
12561266 },
12571267 u64 = > {
12581268 if (js_value .isBigUint64Array ()) {
12591269 if (byte_len == 0 ) return &[_ ]u64 {};
12601270 const arr_ptr = @as ([* ]u64 , @ptrCast (@alignCast (data )));
1261- return arr_ptr [0 .. byte_len / 8 ];
1271+ return arr_ptr [byte_offset .. byte_len / 8 ];
12621272 }
12631273 },
12641274 i64 = > {
12651275 if (js_value .isBigInt64Array ()) {
12661276 if (byte_len == 0 ) return &[_ ]i64 {};
12671277 const arr_ptr = @as ([* ]i64 , @ptrCast (@alignCast (data )));
1268- return arr_ptr [0 .. byte_len / 8 ];
1278+ return arr_ptr [byte_offset .. byte_len / 8 ];
12691279 }
12701280 },
12711281 else = > {},
0 commit comments