1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // Check that asm.js code shows up on the stack.
- function run_test() {
- let p = Cc["@mozilla.org/tools/profiler;1"];
- // Just skip the test if the profiler component isn't present.
- if (!p)
- return;
- p = p.getService(Ci.nsIProfiler);
- if (!p)
- return;
- // This test assumes that it's starting on an empty SPS stack.
- // (Note that the other profiler tests also assume the profiler
- // isn't already started.)
- do_check_true(!p.IsActive());
- let jsFuns = Cu.getJSTestingFunctions();
- if (!jsFuns.isAsmJSCompilationAvailable())
- return;
- const ms = 10;
- p.StartProfiler(10000, ms, ["js"], 1);
- let stack = null;
- function ffi_function(){
- var delayMS = 5;
- while (1) {
- let then = Date.now();
- do {} while (Date.now() - then < delayMS);
- var thread0 = p.getProfileData().threads[0];
- if (delayMS > 30000)
- return;
- delayMS *= 2;
- if (thread0.samples.data.length == 0)
- continue;
- var lastSample = thread0.samples.data[thread0.samples.data.length - 1];
- stack = String(getInflatedStackLocations(thread0, lastSample));
- if (stack.indexOf("trampoline") !== -1)
- return;
- }
- }
- function asmjs_module(global, ffis) {
- "use asm";
- var ffi = ffis.ffi;
- function asmjs_function() {
- ffi();
- }
- return asmjs_function;
- }
- do_check_true(jsFuns.isAsmJSModule(asmjs_module));
- var asmjs_function = asmjs_module(null, {ffi:ffi_function});
- do_check_true(jsFuns.isAsmJSFunction(asmjs_function));
- asmjs_function();
- do_check_neq(stack, null);
- var i1 = stack.indexOf("entry trampoline");
- do_check_true(i1 !== -1);
- var i2 = stack.indexOf("asmjs_function");
- do_check_true(i2 !== -1);
- var i3 = stack.indexOf("FFI trampoline");
- do_check_true(i3 !== -1);
- var i4 = stack.indexOf("ffi_function");
- do_check_true(i4 !== -1);
- do_check_true(i1 < i2);
- do_check_true(i2 < i3);
- do_check_true(i3 < i4);
- p.StopProfiler();
- }
|