зеркало из https://github.com/mozilla/gecko-dev.git
175 строки
4.3 KiB
HTML
175 строки
4.3 KiB
HTML
<!--
|
|
Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/
|
|
-->
|
|
<html>
|
|
<head>
|
|
<title>WebAssembly.compile Test</title>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary);
|
|
const wasmIsSupported = SpecialPowers.Cu.getJSTestingFunctions().wasmIsSupported
|
|
const fooModuleCode = wasmTextToBinary(`(module
|
|
(func $foo (result i32) (i32.const 42))
|
|
(export "foo" $foo)
|
|
)`, 'new-format');
|
|
|
|
function checkFooModule(m) {
|
|
ok(m instanceof WebAssembly.Module, "got a module");
|
|
var i = new WebAssembly.Instance(m);
|
|
ok(i instanceof WebAssembly.Instance, "got an instance");
|
|
ok(i.exports.foo() === 42, "got 42");
|
|
}
|
|
|
|
function checkFooInstance(i) {
|
|
ok(i instanceof WebAssembly.Instance, "got a module");
|
|
ok(i.exports.foo() === 42, "got 42");
|
|
}
|
|
|
|
function propertiesExist() {
|
|
if (!wasmIsSupported()) {
|
|
ok(!this["WebAssembly"], "If the device doesn't support, there will be no WebAssembly object");
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
|
|
ok(WebAssembly, "WebAssembly object should exist");
|
|
ok(WebAssembly.compile, "WebAssembly.compile function should exist");
|
|
runTest();
|
|
}
|
|
|
|
function compileFail() {
|
|
WebAssembly.compile().then(
|
|
() => { ok(false, "should have failed"); runTest() }
|
|
).catch(
|
|
err => { ok(err instanceof TypeError, "empty compile failed"); runTest() }
|
|
);
|
|
}
|
|
|
|
function compileSuccess() {
|
|
WebAssembly.compile(fooModuleCode).then(
|
|
m => { checkFooModule(m); runTest() }
|
|
).catch(
|
|
err => { ok(false, String(err)); runTest() }
|
|
);
|
|
}
|
|
|
|
function compileManySuccess() {
|
|
const N = 100;
|
|
|
|
var arr = [];
|
|
for (var i = 0; i < N; i++)
|
|
arr.push(WebAssembly.compile(fooModuleCode));
|
|
|
|
SpecialPowers.gc();
|
|
|
|
Promise.all(arr).then (ms => {
|
|
ok(ms.length === N, "got the right number");
|
|
for (var i = 0; i < N; i++)
|
|
checkFooModule(ms[i]);
|
|
runTest();
|
|
}).catch(
|
|
err => { ok(false, String(err)); runTest() }
|
|
);
|
|
}
|
|
|
|
function compileInWorker() {
|
|
var w = new Worker(`data:text/plain,
|
|
onmessage = e => {
|
|
WebAssembly.compile(e.data).then(m => {
|
|
var i = new WebAssembly.Instance(m);
|
|
if (i.exports.foo() !== 42)
|
|
throw "bad i.exports.foo() result";
|
|
postMessage("ok");
|
|
close();
|
|
}).catch(err => { throw err });
|
|
}
|
|
`);
|
|
w.postMessage(fooModuleCode);
|
|
w.onmessage = e => {
|
|
ok(e.data === "ok", "worker test");
|
|
runTest();
|
|
}
|
|
}
|
|
|
|
function terminateCompileInWorker() {
|
|
var w = new Worker(`data:text/plain,
|
|
var fooModuleCode;
|
|
function spawnWork() {
|
|
const N = 100;
|
|
var arr = [];
|
|
for (var i = 0; i < N; i++)
|
|
arr.push(WebAssembly.compile(fooModuleCode));
|
|
Promise.all(arr).then(spawnWork);
|
|
}
|
|
onmessage = e => {
|
|
fooModuleCode = e.data;
|
|
spawnWork();
|
|
postMessage("ok");
|
|
}
|
|
`);
|
|
w.postMessage(fooModuleCode);
|
|
w.onmessage = e => {
|
|
ok(e.data === "ok", "worker finished first step");
|
|
w.terminate();
|
|
runTest();
|
|
}
|
|
}
|
|
|
|
function instantiateFail() {
|
|
WebAssembly.instantiate().then(
|
|
() => { ok(false, "should have failed"); runTest() }
|
|
).catch(
|
|
err => { ok(err instanceof TypeError, "empty compile failed"); runTest() }
|
|
);
|
|
}
|
|
|
|
function instantiateSuccess() {
|
|
WebAssembly.instantiate(fooModuleCode).then(
|
|
r => { checkFooModule(r.module); checkFooInstance(r.instance); runTest() }
|
|
).catch(
|
|
err => { ok(false, String(err)); runTest() }
|
|
);
|
|
}
|
|
|
|
function chainSuccess() {
|
|
WebAssembly.compile(fooModuleCode).then(
|
|
m => WebAssembly.instantiate(m)
|
|
).then(
|
|
i => { checkFooInstance(i); runTest() }
|
|
).catch(
|
|
err => { ok(false, String(err)); runTest() }
|
|
);
|
|
}
|
|
|
|
var tests = [ propertiesExist,
|
|
compileFail,
|
|
compileSuccess,
|
|
compileManySuccess,
|
|
compileInWorker,
|
|
terminateCompileInWorker,
|
|
instantiateFail,
|
|
instantiateSuccess,
|
|
chainSuccess
|
|
];
|
|
|
|
function runTest() {
|
|
if (!tests.length) {
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
|
|
var test = tests.shift();
|
|
test();
|
|
}
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
runTest();
|
|
</script>
|
|
</body>
|
|
</html>
|
|
|