From 9b7bc2da120985300b1f038a08112e33a3b68092 Mon Sep 17 00:00:00 2001 From: Nic-vwalt <36562088+Nic-vdwalt@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:33:49 +0200 Subject: [PATCH] core/sys/wasm/js: support shared memory in browser APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copy shared-backed views only where browser APIs reject them while preserving direct access for ordinary WebAssembly memory. 💘 Generated with OpenAlloy Assisted-by: GPT-5.6 Sol via OpenAlloy --- core/sys/wasm/js/odin.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 4d19916bd..a195c3e22 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -19,6 +19,8 @@ class WasmMemoryInterface { this.exports = null; this.listenerMap = new Map(); + this.isShared = false; + // Size (in bytes) of the integer type, should be 4 on `js_wasm32` and 8 on `js_wasm64p32` this.intSize = 4; } @@ -29,6 +31,9 @@ class WasmMemoryInterface { setMemory(memory) { this.memory = memory; + // Avoid instanceof because memory may come from another realm. + this.isShared = typeof SharedArrayBuffer !== "undefined" && memory != null && + Object.prototype.toString.call(memory.buffer) === "[object SharedArrayBuffer]"; } setExports(exports) { @@ -96,9 +101,16 @@ class WasmMemoryInterface { return new Uint8Array(this.memory.buffer, ptr, Number(len)); } + loadBytesUnshared(ptr, len) { + const bytes = this.loadBytes(ptr, len); + if (this.isShared) { + return bytes.slice(); + } + return bytes; + } + loadString(ptr, len) { - const bytes = this.loadBytes(ptr, Number(len)); - return new TextDecoder().decode(bytes); + return new TextDecoder().decode(this.loadBytesUnshared(ptr, Number(len))); } loadCstring(ptr) { @@ -1612,6 +1624,12 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { rand_bytes: (ptr, len) => { const view = new Uint8Array(wasmMemoryInterface.memory.buffer, ptr, len) + if (wasmMemoryInterface.isShared) { + const tmp = new Uint8Array(len) + crypto.getRandomValues(tmp) + view.set(tmp) + return + } crypto.getRandomValues(view) }, },