Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| include:wasm.js;
// Do not manually change the default features with a jit-test directive. The
// logic below relies on this.
// Test that all features are either:
// 1. 'disabled' - not enabled by the default flags.
// 2. 'nightly' - must be enabled in nightly and not release or beta.
// 3. 'released' - must be enabled in nightly, release, and beta.
// 4. 'released-maybe-disable' - should be enabled, but may not be supported
// on a platform.
//
// As features are advanced, this test must be manually updated.
//
// NOTE1: This test relies on feature functions accurately guarding use of the
// feature to work correctly. All features should have a 'disabled.js'
// test to verify this. Basic testing for this is included with each
// feature in this test for sanity.
// NOTE2: Keep this file in sync with:
// `dom/worklet/tests/worklet_audioWorklet_WASM_features.js`.
let supportedFeatures = getWasmSupportedFeatures();
let enabledFeatures = getWasmEnabledFeatures();
let releaseOrBeta = getBuildConfiguration('release_or_beta');
let nightly = !releaseOrBeta;
// All compilers are enabled when we are running with the default flags.
assertEq(wasmCompileMode() == "baseline+ion", true);
// Check if the wasm module text is valid or not.
function check(text) {
try {
wasmEvalText(text);
return true;
} catch (err) {
if (!(err instanceof WebAssembly.CompileError)) {
throw err;
}
return false;
}
}
const DISABLED = "disabled";
const NIGHTLY = "nightly";
const RELEASED_MAYBE_DISABLED = "released-maybe-disabled";
const RELEASED = "released";
const IGNORE = "ignore";
let features = {
"stackSwitching": {
status: DISABLED,
test: () => check(`(tag) (func unreachable resume 0 unreachable)`)
},
"customPageSizes": {
status: DISABLED,
test: () => check(`(memory 1 1 (pagesize 1))`)
},
"compactImports": {
status: DISABLED,
test: () => check(`(import "mod" (item "1" (func)) (item "2" (func)))`)
},
"memoryControl": {
status: DISABLED,
test: () => check(`(func unreachable memory.discard unreachable)`)
},
"jsPromiseIntegration": {
status: NIGHTLY,
test: () => WebAssembly.promising !== undefined
},
"wideArithmetic": {
status: NIGHTLY,
test: () => check(`(func unreachable i64.add128 unreachable)`)
},
"simd": {
status: RELEASED_MAYBE_DISABLED,
test: () => check(`(func unreachable i8x16.splat unreachable)`)
},
"relaxedSimd": {
status: RELEASED_MAYBE_DISABLED,
test: () => check(`(func unreachable i16x8.relaxed_laneselect unreachable)`)
},
"threads": {
status: RELEASED,
test: () => check(`(memory 1 1 shared)`)
},
"branchHinting": {
status: RELEASED,
// No way to accurately feature test this
test: () => true,
},
// Hard to feature test
"mozIntGemm": { status: IGNORE, test: () => true },
// Testing utility
"testSerialization": { status: IGNORE, test: () => true },
};
// Every key in supportedFeatures must be in features.
for (name in supportedFeatures) {
assertEq((name in features), true, `expected build config[${name}] in features`);
}
// Every key in enabledFeatures must be in features.
for (name in supportedFeatures) {
assertEq((name in features), true, `expected build config[${name}] in features`);
}
for (name in features) {
let {status, test} = features[name];
// Every key in features must be in supportedFeatures and enabledFeatures.
assertEq((name in supportedFeatures), true, `expected ${name} in supportedFeatures`);
assertEq((name in enabledFeatures), true, `expected ${name} in enabledFeatures`);
// Features can be disabled by build configuration, in which case we can't
// test anything about them.
if (!supportedFeatures[name]) {
continue;
}
if (status == IGNORE) {
continue;
}
let checkEnabled = test();
let reportedEnabled = enabledFeatures[name];
assertEq(checkEnabled, reportedEnabled, `${name} feature tests disagree`);
let enabled = checkEnabled;
if (status == DISABLED) {
assertEq(enabled, false, `${name} should be disabled`);
} else if (status == NIGHTLY) {
assertEq(enabled, nightly, `${name} should be enabled on nightly`);
} else if (status == RELEASED) {
assertEq(enabled, true, `${name} should be enabled`);
} else if (status == RELEASED_MAYBE_DISABLED) {
// Maybe disabled for runtime specific reasons, at least we successfully
// ran the feature test.
} else {
throw new Error("unknown status");
}
}