Services.prefs.setBoolPref("javascript.options.wasm_tail_calls", true); registerCleanupFunction(() => { Services.prefs.clearUserPref("javascript.options.wasm_tail_calls"); }); // The tests runs code in tight loop with the profiler enabled. It is testing // behavoir of MacroAssembler::wasmCollapseFrameXXXX methods. // It is not guarantee 100% hit since the profiler probes stacks every 1ms, // but it will happen often enough. add_task(async () => { await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]); Assert.ok(Services.profiler.IsActive()); /* Wasm module that is tested: (module (func $f (param i64 i64 i64 i64 i64 i64 i64 i64 i64) local.get 0 i64.eqz br_if 0 local.get 0 return_call $g ) (func $g (param i64) local.get 0 i64.const 1 i64.sub i64.const 2 i64.const 6 i64.const 3 i64.const 4 i64.const 1 i64.const 2 i64.const 6 i64.const 3 return_call $f ) (func (export "run") i64.const 0x100000 call $g ) ) */ const b = new Uint8Array([ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x03, 0x60, 0x09, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x60, 0x01, 0x7e, 0x00, 0x60, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02, 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x0a, 0x31, 0x03, 0x0b, 0x00, 0x20, 0x00, 0x50, 0x0d, 0x00, 0x20, 0x00, 0x12, 0x01, 0x0b, 0x19, 0x00, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x42, 0x02, 0x42, 0x06, 0x42, 0x03, 0x42, 0x04, 0x42, 0x01, 0x42, 0x02, 0x42, 0x06, 0x42, 0x03, 0x12, 0x00, 0x0b, 0x09, 0x00, 0x42, 0x80, 0x80, 0xc0, 0x00, 0x10, 0x01, 0x0b ]); const ins = new WebAssembly.Instance(new WebAssembly.Module(b)); for (var i = 0; i < 100; i++) { ins.exports.run(); } Assert.ok(true, "Done"); await Services.profiler.StopProfiler(); }); add_task(async () => { await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]); Assert.ok(Services.profiler.IsActive()); /* Wasm modules that are tested: (module (func (export "t"))) (module (import "" "t" (func $g)) (table $t 1 1 funcref) (func $f (return_call_indirect $t (i32.const 0))) (func (export "run") (param i64) loop local.get 0 i64.eqz br_if 1 call $f local.get 0 i64.const 1 i64.sub local.set 0 br 0 end ) (elem (i32.const 0) $g) ) */ const b0 = new Uint8Array([ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x74, 0x00, 0x00, 0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b ]); const ins0 = new WebAssembly.Instance(new WebAssembly.Module(b0)); const b = new Uint8Array([ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x60, 0x00, 0x00, 0x60, 0x01, 0x7e, 0x00, 0x02, 0x06, 0x01, 0x00, 0x01, 0x74, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x01, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x09, 0x07, 0x01, 0x00, 0x41, 0x00, 0x0b, 0x01, 0x00, 0x0a, 0x1f, 0x02, 0x07, 0x00, 0x41, 0x00, 0x13, 0x00, 0x00, 0x0b, 0x15, 0x00, 0x03, 0x40, 0x20, 0x00, 0x50, 0x0d, 0x01, 0x10, 0x01, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x21, 0x00, 0x0c, 0x00, 0x0b, 0x0b ]); const ins = new WebAssembly.Instance(new WebAssembly.Module(b), {"": {t: ins0.exports.t,},}); for (var i = 0; i < 100; i++) { ins.exports.run(0x100000n); } Assert.ok(true, "Done"); await Services.profiler.StopProfiler(); }); /** * All the tests are implemented with add_task, this starts them automatically. */ function run_test() { do_get_profile(); run_next_test(); }