Skip to content

Commit 7cd1b6a

Browse files
committed
use buffer views bounds to expose arrays
1 parent d14b2e8 commit 7cd1b6a

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/runtime/js.zig

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)