Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// META: global=window,dedicatedworker,jsshell,shadowrealm
promise_test(async () => {
const wasmNamespace = await import("./resources/mutable-global-export.wasm");
const instance = WebAssembly.namespaceInstance(wasmNamespace);
const wasmNamespace2 = await import("./resources/mutable-global-export.wasm");
const instance2 = WebAssembly.namespaceInstance(wasmNamespace2);
assert_equals(instance, instance2);
assert_true(instance instanceof WebAssembly.Instance);
wasmNamespace.setGlobal(999);
assert_equals(instance.exports.getGlobal(), 999);
instance.exports.setGlobal(888);
assert_equals(wasmNamespace.getGlobal(), 888);
}, "WebAssembly.namespaceInstance() should return the underlying instance with shared state");
promise_test(async () => {
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance({}));
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance(null));
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance(undefined));
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance(42));
assert_throws_js(TypeError, () =>
WebAssembly.namespaceInstance("not a namespace")
);
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance([]));
assert_throws_js(TypeError, () =>
WebAssembly.namespaceInstance(function () {})
);
const jsModule = await import("./resources/globals.js");
assert_throws_js(TypeError, () => WebAssembly.namespaceInstance(jsModule));
}, "WebAssembly.namespaceInstance() should throw TypeError for non-WebAssembly namespaces");
promise_test(async () => {
const exportsModule = await import("./resources/exports.wasm");
const globalsModule = await import("./resources/globals.wasm");
const exportsInstance = WebAssembly.namespaceInstance(exportsModule);
const globalsInstance = WebAssembly.namespaceInstance(globalsModule);
assert_not_equals(exportsInstance, globalsInstance);
assert_true(exportsInstance.exports.func instanceof Function);
assert_true(globalsInstance.exports.getLocalMutI32 instanceof Function);
globalsModule.setLocalMutI32(12345);
assert_equals(globalsInstance.exports.getLocalMutI32(), 12345);
globalsInstance.exports.setLocalMutI32(54321);
assert_equals(globalsModule.getLocalMutI32(), 54321);
const exportsInstance2 = WebAssembly.namespaceInstance(exportsModule);
assert_equals(exportsInstance, exportsInstance2);
}, "WebAssembly.namespaceInstance() should work correctly with multiple modules");