From 4a2728554af66c5f7d7ecddafdd531b691b53cee Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Fri, 11 Apr 2025 05:42:56 +0000 Subject: [PATCH] PackageToJS: Add WebAssembly namespace option to instantiate --- Plugins/PackageToJS/Templates/instantiate.d.ts | 5 +++++ Plugins/PackageToJS/Templates/instantiate.js | 17 +++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Plugins/PackageToJS/Templates/instantiate.d.ts b/Plugins/PackageToJS/Templates/instantiate.d.ts index 6c71d1da..11837aba 100644 --- a/Plugins/PackageToJS/Templates/instantiate.d.ts +++ b/Plugins/PackageToJS/Templates/instantiate.d.ts @@ -56,6 +56,11 @@ export type ModuleSource = WebAssembly.Module | ArrayBufferView | ArrayBuffer | * The options for instantiating a WebAssembly module */ export type InstantiateOptions = { + /** + * The WebAssembly namespace to use for instantiation. + * Defaults to the globalThis.WebAssembly object. + */ + WebAssembly?: typeof globalThis.WebAssembly, /** * The WebAssembly module to instantiate */ diff --git a/Plugins/PackageToJS/Templates/instantiate.js b/Plugins/PackageToJS/Templates/instantiate.js index 2a41d48c..08351e67 100644 --- a/Plugins/PackageToJS/Templates/instantiate.js +++ b/Plugins/PackageToJS/Templates/instantiate.js @@ -63,6 +63,7 @@ export async function instantiateForThread( async function _instantiate( options ) { + const _WebAssembly = options.WebAssembly || WebAssembly; const moduleSource = options.module; /* #if IS_WASI */ const { wasi } = options; @@ -98,23 +99,23 @@ async function _instantiate( let module; let instance; let exports; - if (moduleSource instanceof WebAssembly.Module) { + if (moduleSource instanceof _WebAssembly.Module) { module = moduleSource; - instance = await WebAssembly.instantiate(module, importObject); + instance = await _WebAssembly.instantiate(module, importObject); } else if (typeof Response === "function" && (moduleSource instanceof Response || moduleSource instanceof Promise)) { - if (typeof WebAssembly.instantiateStreaming === "function") { - const result = await WebAssembly.instantiateStreaming(moduleSource, importObject); + if (typeof _WebAssembly.instantiateStreaming === "function") { + const result = await _WebAssembly.instantiateStreaming(moduleSource, importObject); module = result.module; instance = result.instance; } else { const moduleBytes = await (await moduleSource).arrayBuffer(); - module = await WebAssembly.compile(moduleBytes); - instance = await WebAssembly.instantiate(module, importObject); + module = await _WebAssembly.compile(moduleBytes); + instance = await _WebAssembly.instantiate(module, importObject); } } else { // @ts-expect-error: Type 'Response' is not assignable to type 'BufferSource' - module = await WebAssembly.compile(moduleSource); - instance = await WebAssembly.instantiate(module, importObject); + module = await _WebAssembly.compile(moduleSource); + instance = await _WebAssembly.instantiate(module, importObject); } swift.setInstance(instance);