Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| --no-blinterp
// Disable Baseline Interpreter and JITs because we only read information about
// C++ Interpreter profiling frames.
enableGeckoProfilingWithSlowAssertions();
function assertStack(stack, expected) {
assertEq(stack.length, expected.length);
for (let i = 0; i < stack.length; i++) {
// Use |split| to get rid of the file name.
assertEq(stack[i].dynamicString.split(" (")[0], expected[i]);
}
}
// We currently don't push entries for frames that were already on the stack
// when the profiler was enabled.
assertStack(readGeckoInterpProfilingStack(), []);
function testBasic() {
let g1 = function() {
return readGeckoInterpProfilingStack();
}
let f1 = () => g1();
assertStack(f1(), ["testBasic", "f1", "g1"]);
// Test non-function frames.
assertStack(evaluate("eval(`(function foo() { return readGeckoInterpProfilingStack(); })()`)"),
["testBasic", "@evaluate", "@evaluate line 1 > eval:1:1", "foo"]);
}
testBasic();
testBasic();
function testThrow() {
let stacks = [];
let thrower = function() {
stacks.push(readGeckoInterpProfilingStack());
throw 1;
};
let catcher = function() {
try {
thrower();
} catch (e) {
stacks.push(readGeckoInterpProfilingStack());
}
};
catcher();
assertEq(stacks.length, 2);
assertStack(stacks[0], ["testThrow", "catcher", "thrower"]);
assertStack(stacks[1], ["testThrow", "catcher"]);
}
testThrow();
testThrow();
function testSelfHosted() {
let stacks = [1, 2, 3].map(function() {
return readGeckoInterpProfilingStack();
});
assertEq(stacks.length, 3);
for (var stack of stacks) {
assertStack(stack, ["testSelfHosted", "map", "testSelfHosted/stacks<"]);
}
}
testSelfHosted();
testSelfHosted();
function testGenerator() {
let stacks = [];
let generator = function*() {
stacks.push(readGeckoInterpProfilingStack());
yield 1;
stacks.push(readGeckoInterpProfilingStack());
yield 2;
stacks.push(readGeckoInterpProfilingStack());
};
for (let x of generator()) {}
assertStack(readGeckoInterpProfilingStack(), ["testGenerator"]);
assertEq(stacks.length, 3);
for (var stack of stacks) {
assertStack(stack, ["testGenerator", "next", "generator"]);
}
}
testGenerator();
testGenerator();
async function testAsync() {
let stacks = [];
let asyncFun = async function() {
stacks.push(readGeckoInterpProfilingStack());
await 1;
stacks.push(readGeckoInterpProfilingStack());
};
await asyncFun();
assertStack(readGeckoInterpProfilingStack(), ["AsyncFunctionNext", "testAsync"]);
assertEq(stacks.length, 2);
assertStack(stacks[0], ["testAsync", "asyncFun"]);
assertStack(stacks[1], ["AsyncFunctionNext", "asyncFun"]);
}
testAsync();
drainJobQueue();
testAsync();
drainJobQueue();
disableGeckoProfiling();