// |jit-test| skip-if: !isAsmJSCompilationAvailable() || (!getBuildConfiguration("arm-simulator") && !getBuildConfiguration("arm64-simulator")) // Single-step profiling currently only works in the ARM simulator
// Test profiling enablement while asm.js is running. var stacks; var ffi = function(enable) { if (enable == +1)
enableGeckoProfiling();
enableSingleStepProfiling();
stacks = disableSingleStepProfiling(); if (enable == -1)
disableGeckoProfiling();
} var f = asmLink(asmCompile('global','ffis',USE_ASM + "var ffi=ffis.ffi; function g(i) { i=i|0; ffi(i|0) } function f(i) { i=i|0; g(i|0) } return f"), null, {ffi});
f(0);
assertStackContainsSeq(stacks, "");
f(+1);
assertStackContainsSeq(stacks, "<,g,f,>");
f(0);
assertStackContainsSeq(stacks, "<,g,f,>");
f(-1);
assertStackContainsSeq(stacks, "<,g,f,>");
f(0);
assertStackContainsSeq(stacks, "");
// Enable profiling for the rest of the tests.
enableGeckoProfiling();
var f = asmLink(asmCompile(USE_ASM + "function f() { return 42 } return f"));
enableSingleStepProfiling();
assertEq(f(), 42); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,>");
var m = asmCompile(USE_ASM + "function g(i) { i=i|0; return (i+1)|0 } function f() { return g(42)|0 } return f"); for (var i = 0; i < 3; i++) { var f = asmLink(m);
enableSingleStepProfiling();
assertEq(f(), 43); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,g,f,>,f,>,>");
}
var m = asmCompile(USE_ASM + "function g1() { return 1 } function g2() { return 2 } function f(i) { i=i|0; return TBL[i&1]()|0 } var TBL=[g1,g2]; return f"); for (var i = 0; i < 3; i++) { var f = asmLink(m);
enableSingleStepProfiling();
assertEq(f(0), 1);
assertEq(f(1), 2); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,g1,f,>,f,>,>,>,f,>,g2,f,>,f,>,>");
}
function testBuiltinD2D(name) { var m = asmCompile('g', USE_ASM + "var fun=g.Math." + name + "; function f(d) { d=+d; return +fun(d) } return f"); for (var i = 0; i < 3; i++) { var f = asmLink(m, this);
enableSingleStepProfiling();
assertEq(f(.1), eval("Math." + name + "(.1)")); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,N,f,>,f,>,>");
}
} for (name of ['sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'ceil', 'floor', 'exp', 'log'])
testBuiltinD2D(name);
function testBuiltinF2F(name) { var m = asmCompile('g', USE_ASM + "var tof=g.Math.fround; var fun=g.Math." + name + "; function f(d) { d=tof(d); return tof(fun(d)) } return f"); for (var i = 0; i < 3; i++) { var f = asmLink(m, this);
enableSingleStepProfiling();
assertEq(f(.1), eval("Math.fround(Math." + name + "(Math.fround(.1)))")); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,N,f,>,f,>,>");
}
} for (name of ['ceil', 'floor'])
testBuiltinF2F(name);
function testBuiltinDD2D(name) { var m = asmCompile('g', USE_ASM + "var fun=g.Math." + name + "; function f(d, e) { d=+d; e=+e; return +fun(d,e) } return f"); for (var i = 0; i < 3; i++) { var f = asmLink(m, this);
enableSingleStepProfiling();
assertEq(f(.1, .2), eval("Math." + name + "(.1, .2)")); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,N,f,>,f,>,>");
}
} for (name of ['atan2', 'pow'])
testBuiltinDD2D(name);
// Ion FFI exit for (var i = 0; i < 20; i++)
assertEq(f(), 83);
enableSingleStepProfiling();
assertEq(f(), 83); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,<,f,>,f,>,<,f,>,f,>,>");
var ffi1 = function() { return { valueOf() { return 20 } } } var ffi2 = function() { return { valueOf() { return 74 } } } var f = asmLink(m, null, {ffi1,ffi2});
// Interp FFI exit
enableSingleStepProfiling();
assertEq(f(), 94); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,<,f,>,f,>,<,f,>,f,>,>"); // TODO: add 'valueOf' once interp shows up
// Ion FFI exit for (var i = 0; i < 20; i++)
assertEq(f(), 94);
enableSingleStepProfiling();
assertEq(f(), 94); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f,>,<,f,>,f,>,<,f,>,f,>,>"); // TODO: add 'valueOf' once interp shows up
var ffi1 = function() { return 15 } var ffi2 = function() { return f2() + 17 } var {f1,f2} = asmLink(asmCompile('g','ffis', USE_ASM + "var ffi1=ffis.ffi1, ffi2=ffis.ffi2; function f2() { return ffi1()|0 } function f1() { return ffi2()|0 } return {f1:f1, f2:f2}"), null, {ffi1, ffi2}); // Interpreter FFI exit
enableSingleStepProfiling();
assertEq(f1(), 32); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f1,>,<,f1,>,>,<,f1,>,f2,>,<,f1,>,<,f2,>,<,f1,>,f2,>,<,f1,>,>,<,f1,>,<,f1,>,f1,>,>");
// Ion FFI exit var jitOptions = getJitCompilerOptions(); if (jitOptions['baseline.enable']) { for (var i = 0; i < 20; i++)
assertEq(f1(), 32);
enableSingleStepProfiling();
assertEq(f1(), 32); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,f1,>,<,f1,>,>,<,f1,>,f2,>,<,f1,>,<,f2,>,<,f1,>,f2,>,<,f1,>,>,<,f1,>,<,f1,>,f1,>,>");
}
// Thunks
setJitCompilerOption("jump-threshold", 0); var h = asmLink(asmCompile(USE_ASM + 'function f() {} function g() { f() } function h() { g() } return h'));
enableSingleStepProfiling();
h(); var stacks = disableSingleStepProfiling();
assertStackContainsSeq(stacks, ">,h,>,g,h,>,f,g,h,>,g,h,>,h,>,>");
setJitCompilerOption("jump-threshold", -1);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.