// 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); }); } } }