@@ -1251,80 +1251,88 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
1251
1251
fn jsValueToTypedArray (_ : * JsContext , comptime T : type , js_value : v8.Value ) ! ? []T {
1252
1252
var force_u8 = false ;
1253
1253
var array_buffer : ? v8.ArrayBuffer = null ;
1254
+ var byte_len : usize = undefined ;
1255
+ var byte_offset : usize = undefined ;
1256
+
1254
1257
if (js_value .isTypedArray ()) {
1255
1258
const buffer_view = js_value .castTo (v8 .ArrayBufferView );
1259
+ byte_len = buffer_view .getByteLength ();
1260
+ byte_offset = buffer_view .getByteOffset ();
1256
1261
array_buffer = buffer_view .getBuffer ();
1257
1262
} else if (js_value .isArrayBufferView ()) {
1258
1263
force_u8 = true ;
1259
1264
const buffer_view = js_value .castTo (v8 .ArrayBufferView );
1265
+ byte_len = buffer_view .getByteLength ();
1266
+ byte_offset = buffer_view .getByteOffset ();
1260
1267
array_buffer = buffer_view .getBuffer ();
1261
1268
} else if (js_value .isArrayBuffer ()) {
1262
1269
force_u8 = true ;
1263
1270
array_buffer = js_value .castTo (v8 .ArrayBuffer );
1271
+ byte_len = array_buffer .? .getByteLength ();
1272
+ byte_offset = 0 ;
1264
1273
}
1265
1274
1266
1275
const buffer = array_buffer orelse return null ;
1267
1276
1268
1277
const backing_store = v8 .BackingStore .sharedPtrGet (& buffer .getBackingStore ());
1269
1278
const data = backing_store .getData ();
1270
- const byte_len = backing_store .getByteLength ();
1271
1279
1272
1280
switch (T ) {
1273
1281
u8 = > {
1274
1282
// need this sentinel check to keep the compiler happy
1275
1283
if (force_u8 or js_value .isUint8Array () or js_value .isUint8ClampedArray ()) {
1276
1284
if (byte_len == 0 ) return &[_ ]u8 {};
1277
1285
const arr_ptr = @as ([* ]u8 , @ptrCast (@alignCast (data )));
1278
- return arr_ptr [0 .. byte_len ];
1286
+ return arr_ptr [byte_offset .. byte_offset + byte_len ];
1279
1287
}
1280
1288
},
1281
1289
i8 = > {
1282
1290
if (js_value .isInt8Array ()) {
1283
1291
if (byte_len == 0 ) return &[_ ]i8 {};
1284
1292
const arr_ptr = @as ([* ]i8 , @ptrCast (@alignCast (data )));
1285
- return arr_ptr [0 .. byte_len ];
1293
+ return arr_ptr [byte_offset .. byte_offset + byte_len ];
1286
1294
}
1287
1295
},
1288
1296
u16 = > {
1289
1297
if (js_value .isUint16Array ()) {
1290
1298
if (byte_len == 0 ) return &[_ ]u16 {};
1291
1299
const arr_ptr = @as ([* ]u16 , @ptrCast (@alignCast (data )));
1292
- return arr_ptr [0 .. byte_len / 2 ];
1300
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 2 ];
1293
1301
}
1294
1302
},
1295
1303
i16 = > {
1296
1304
if (js_value .isInt16Array ()) {
1297
1305
if (byte_len == 0 ) return &[_ ]i16 {};
1298
1306
const arr_ptr = @as ([* ]i16 , @ptrCast (@alignCast (data )));
1299
- return arr_ptr [0 .. byte_len / 2 ];
1307
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 2 ];
1300
1308
}
1301
1309
},
1302
1310
u32 = > {
1303
1311
if (js_value .isUint32Array ()) {
1304
1312
if (byte_len == 0 ) return &[_ ]u32 {};
1305
1313
const arr_ptr = @as ([* ]u32 , @ptrCast (@alignCast (data )));
1306
- return arr_ptr [0 .. byte_len / 4 ];
1314
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 4 ];
1307
1315
}
1308
1316
},
1309
1317
i32 = > {
1310
1318
if (js_value .isInt32Array ()) {
1311
1319
if (byte_len == 0 ) return &[_ ]i32 {};
1312
1320
const arr_ptr = @as ([* ]i32 , @ptrCast (@alignCast (data )));
1313
- return arr_ptr [0 .. byte_len / 4 ];
1321
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 4 ];
1314
1322
}
1315
1323
},
1316
1324
u64 = > {
1317
1325
if (js_value .isBigUint64Array ()) {
1318
1326
if (byte_len == 0 ) return &[_ ]u64 {};
1319
1327
const arr_ptr = @as ([* ]u64 , @ptrCast (@alignCast (data )));
1320
- return arr_ptr [0 .. byte_len / 8 ];
1328
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 8 ];
1321
1329
}
1322
1330
},
1323
1331
i64 = > {
1324
1332
if (js_value .isBigInt64Array ()) {
1325
1333
if (byte_len == 0 ) return &[_ ]i64 {};
1326
1334
const arr_ptr = @as ([* ]i64 , @ptrCast (@alignCast (data )));
1327
- return arr_ptr [0 .. byte_len / 8 ];
1335
+ return arr_ptr [byte_offset .. byte_offset + byte_len / 8 ];
1328
1336
}
1329
1337
},
1330
1338
else = > {},
0 commit comments