From ef427fa966332a953356cac54e79d952aa77e658 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 21 Jul 2025 19:46:57 +0800 Subject: [PATCH] Map ArrayBuffer and ArrayBufferView to u8. Depends on https://github.com/lightpanda-io/zig-v8-fork/pull/86 Built ontop of https://github.com/lightpanda-io/browser/pull/906 just because this is the feature that uses it. --- build.zig.zon | 4 ++-- src/browser/encoding/TextDecoder.zig | 1 + src/runtime/js.zig | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 10a76063..b51e82da 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -13,8 +13,8 @@ .hash = "tigerbeetle_io-0.0.0-ViLgxpyRBAB5BMfIcj3KMXfbJzwARs9uSl8aRy2OXULd", }, .v8 = .{ - .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/10025d52cb1d33434f18634c326e67038fd927d5.tar.gz", - .hash = "v8-0.0.0-xddH6-vCAwCtIRfzEw1zKu0TnMbDrFltZ8I0x-PALyIh", + .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/b22911e02e4884a76acf52aa9aff2ba169d05b40.tar.gz", + .hash = "v8-0.0.0-xddH69zCAwAzm1u5cQVa-uG5ib2y6PpENXCl8yEYdUYk", }, //.v8 = .{ .path = "../zig-v8-fork" }, //.tigerbeetle_io = .{ .path = "../tigerbeetle-io" }, diff --git a/src/browser/encoding/TextDecoder.zig b/src/browser/encoding/TextDecoder.zig index bc5f38d2..99ea06e2 100644 --- a/src/browser/encoding/TextDecoder.zig +++ b/src/browser/encoding/TextDecoder.zig @@ -92,6 +92,7 @@ test "Browser.Encoding.TextDecoder" { .{ "d1.ignoreBOM", "false" }, .{ "d1.decode(new Uint8Array([240, 160, 174, 183]))", "𠮷" }, .{ "d1.decode(new Uint8Array([0xEF, 0xBB, 0xBF, 240, 160, 174, 183]))", "𠮷" }, + .{ "d1.decode(new Uint8Array([49, 50]).buffer)", "12" }, .{ "let d2 = new TextDecoder('utf8', {fatal: true})", null }, .{ diff --git a/src/runtime/js.zig b/src/runtime/js.zig index b5216ab8..4a5fdeba 100644 --- a/src/runtime/js.zig +++ b/src/runtime/js.zig @@ -953,9 +953,21 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { } }, .slice => { + var force_u8 = false; + var array_buffer: ?v8.ArrayBuffer = null; if (js_value.isTypedArray()) { const buffer_view = js_value.castTo(v8.ArrayBufferView); - const buffer = buffer_view.getBuffer(); + array_buffer = buffer_view.getBuffer(); + } else if (js_value.isArrayBufferView()) { + force_u8 = true; + const buffer_view = js_value.castTo(v8.ArrayBufferView); + array_buffer = buffer_view.getBuffer(); + } else if (js_value.isArrayBuffer()) { + force_u8 = true; + array_buffer = js_value.castTo(v8.ArrayBuffer); + } + + if (array_buffer) |buffer| { const backing_store = v8.BackingStore.sharedPtrGet(&buffer.getBackingStore()); const data = backing_store.getData(); const byte_len = backing_store.getByteLength(); @@ -964,7 +976,7 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { u8 => { // need this sentinel check to keep the compiler happy if (ptr.sentinel() == null) { - if (js_value.isUint8Array() or js_value.isUint8ClampedArray()) { + if (force_u8 or js_value.isUint8Array() or js_value.isUint8ClampedArray()) { const arr_ptr = @as([*]u8, @alignCast(@ptrCast(data))); return arr_ptr[0..byte_len]; }