Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| --wasm-compiler=optimizing; skip-if: !wasmIsSupported()
// In this case we're setting things up so that wasm can't be compiled, as the
// only available compiler is Ion, and enabling the Debugger will disable Ion.
//
// The test tests that the lazy creation of the WebAssembly object is not
// dependent on whether WebAssembly can be compiled or not: if wasm is supported
// then the WebAssembly object should always be created. The fact that wasm
// can't be compiled is a separate matter.
//
// IT'S IMPORTANT NOT TO MENTION THE WEBASSEMBLY OBJECT UNTIL AFTER THE DEBUGGER
// HAS BEEN CREATED, AND NOT TO LOAD lib/wasm.js OR OTHER WASM CODE HERE.
var g7 = newGlobal({newCompartment: true});
g7.parent = this;
g7.eval("var dbg = Debugger(parent)");
assertEq(typeof WebAssembly, "object");
// Test that validation works even if compilers are not available.
WebAssembly.validate(wasmTextToBinary('(module (func))'));
// Test that compilation fails with a sensible error.
var bits = wasmTextToBinary('(module (func))');
var msg = /no WebAssembly compiler available/
var exn;
exn = null;
try { new WebAssembly.Module(bits); } catch (e) { exn = e; }
assertEq(Boolean(exn), true);
assertEq(Boolean(String(exn).match(msg)), true);
exn = null;
try { WebAssembly.compile(bits); } catch (e) { exn = e; }
assertEq(Boolean(exn), true);
assertEq(Boolean(String(exn).match(msg)), true);
exn = null;
try { WebAssembly.instantiate(bits); } catch (e) { exn = e; }
assertEq(Boolean(exn), true);
assertEq(Boolean(String(exn).match(msg)), true);
// We do not use wasmStreamingEnabled() here because that checks whether
// compilers are available, and that is precisely what we want to be checking
// ourselves. But streaming compilation is available only if there are helper
// threads, so that's an OK proxy.
if (helperThreadCount() > 0) {
exn = null;
WebAssembly.compileStreaming(bits).catch(e => { exn = e; });
drainJobQueue();
assertEq(Boolean(exn), true);
assertEq(Boolean(String(exn).match(msg)), true);
exn = null;
WebAssembly.instantiateStreaming(bits).catch(e => { exn = e; });
drainJobQueue();
assertEq(Boolean(exn), true);
assertEq(Boolean(String(exn).match(msg)), true);
}