Skip to content

Commit

Permalink
[wasm] Source Phase Imports for ESM Integration (web-platform-tests#4…
Browse files Browse the repository at this point in the history
…2467)

Co-authored-by: Nicolò Ribaudo <[email protected]>
  • Loading branch information
guybedford and nicolo-ribaudo authored Nov 17, 2023
1 parent 0588aff commit 8b18dd1
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 1 deletion.
41 changes: 41 additions & 0 deletions wasm/jsapi/module/moduleSource.tentative.any.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// META: global=window,dedicatedworker,jsshell,shadowrealm
// META: script=/wasm/jsapi/wasm-module-builder.js
// META: script=/wasm/jsapi/assertions.js

let emptyModuleBinary;
setup(() => {
emptyModuleBinary = new WasmModuleBuilder().toBuffer();
});

test(() => {
assert_equals(typeof AbstractModuleSource, "undefined");
const AbstractModuleSource = Object.getPrototypeOf(WebAssembly.Module);
assert_equals(AbstractModuleSource.name, "AbstractModuleSource");
assert_not_equals(AbstractModuleSource, Function);
}, "AbstractModuleSource intrinsic");

test(() => {
const AbstractModuleSourceProto = Object.getPrototypeOf(WebAssembly.Module.prototype);
assert_not_equals(AbstractModuleSourceProto, Object);
const AbstractModuleSource = Object.getPrototypeOf(WebAssembly.Module);
assert_equals(AbstractModuleSource.prototype, AbstractModuleSourceProto);
}, "AbstractModuleSourceProto intrinsic");

test(() => {
const builder = new WasmModuleBuilder();

builder
.addFunction("fn", kSig_v_v)
.addBody([])
.exportFunc();
builder.addMemory(0, 256, true);

const buffer = builder.toBuffer()
const module = new WebAssembly.Module(buffer);

const AbstractModuleSource = Object.getPrototypeOf(WebAssembly.Module);
const toStringTag = Object.getOwnPropertyDescriptor(AbstractModuleSource.prototype, Symbol.toStringTag).get;

assert_equals(toStringTag.call(module), "WebAssembly.Module");
assert_throws_js(TypeError, () => toStringTag.call({}));
}, "AbstractModuleSourceProto toStringTag brand check");
3 changes: 3 additions & 0 deletions wasm/webapi/esm-integration/resources/worker-source-phase.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import source modSource from "./worker.wasm";
assert_true(modSource instanceof WebAssembly.Module);
assert_true(await import.source("./worker.wasm") === modSource);
3 changes: 2 additions & 1 deletion wasm/webapi/esm-integration/resources/worker.js
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
import * as mod from "./worker.wasm"
import * as mod from "./worker.wasm";
assert_true(await import("./worker.wasm") === mod);
35 changes: 35 additions & 0 deletions wasm/webapi/esm-integration/source-phase.tentative.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!doctype html>
<title>Source phase imports</title>

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script type=module>
setup({ single_test: true });

import source exportedNamesSource from "./resources/exported-names.wasm";

assert_true(exportedNamesSource instanceof WebAssembly.Module);
const AbstractModuleSource = Object.getPrototypeOf(WebAssembly.Module);
assert_equals(AbstractModuleSource.name, "AbstractModuleSource");
assert_true(exportedNamesSource instanceof AbstractModuleSource);

assert_array_equals(WebAssembly.Module.exports(exportedNamesSource).sort(),
["func", "glob", "mem", "tab"]);

const wasmImportFromWasmSource = await import.source("./resources/wasm-import-from-wasm.wasm");

assert_true(wasmImportFromWasmSource instanceof WebAssembly.Module);

let logged = false;
const instance = await WebAssembly.instantiate(wasmImportFromWasmSource, {
"./wasm-export-to-wasm.wasm": {
log () {
logged = true;
}
}
});
instance.exports.logExec();
assert_true(logged);

done();
</script>

0 comments on commit 8b18dd1

Please sign in to comment.