61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
// META: global=window,dedicatedworker,jsshell
|
|
// META: script=/wasm/jsapi/wasm-module-builder.js
|
|
|
|
// Instantiate a module with an imported global and return the global.
|
|
function instantiateImportedGlobal(module, name, type, mutable, importedStringConstants) {
|
|
let builder = new WasmModuleBuilder();
|
|
builder.addImportedGlobal(module, name, type, mutable);
|
|
builder.addExportOfKind("global", kExternalGlobal, 0);
|
|
let bytes = builder.toBuffer();
|
|
let mod = new WebAssembly.Module(bytes, { importedStringConstants });
|
|
let instance = new WebAssembly.Instance(mod, {});
|
|
return instance.exports["global"];
|
|
}
|
|
|
|
const badGlobalTypes = [
|
|
[kWasmAnyRef, false],
|
|
[kWasmAnyRef, true],
|
|
[wasmRefType(kWasmAnyRef), false],
|
|
[wasmRefType(kWasmAnyRef), true],
|
|
[kWasmFuncRef, false],
|
|
[kWasmFuncRef, true],
|
|
[wasmRefType(kWasmFuncRef), false],
|
|
[wasmRefType(kWasmFuncRef), true],
|
|
[kWasmExternRef, true],
|
|
[wasmRefType(kWasmExternRef), true],
|
|
];
|
|
for ([type, mutable] of badGlobalTypes) {
|
|
test(() => {
|
|
assert_throws_js(WebAssembly.CompileError,
|
|
() => instantiateImportedGlobal("'", "constant", type, mutable, "'"),
|
|
"type mismatch");
|
|
});
|
|
}
|
|
|
|
const goodGlobalTypes = [
|
|
[kWasmExternRef, false],
|
|
[wasmRefType(kWasmExternRef), false],
|
|
];
|
|
const constants = [
|
|
'',
|
|
'\0',
|
|
'0',
|
|
'0'.repeat(100000),
|
|
'\uD83D\uDE00',
|
|
];
|
|
const namespaces = [
|
|
"",
|
|
"'",
|
|
"strings"
|
|
];
|
|
|
|
for (let namespace of namespaces) {
|
|
for (let constant of constants) {
|
|
for ([type, mutable] of goodGlobalTypes) {
|
|
test(() => {
|
|
let result = instantiateImportedGlobal(namespace, constant, type, mutable, namespace);
|
|
assert_equals(result.value, constant);
|
|
});
|
|
}
|
|
}
|
|
}
|