Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --setpref=experimental.capture_oom_stack_trace=true; skip-if: !this.hasOwnProperty("getLastOOMStackTrace")
function assertCapturesOOMStackTrace(f, lineNo) {
// Clear any existing trace
var initialTrace = getLastOOMStackTrace();
assertEq(initialTrace, null);
try {
f();
assertEq(true, false, "Expected an OOM exception");
} catch (e) {
print("✓ Exception caught: " + e);
// Check for captured stack trace
var finalTrace = getLastOOMStackTrace();
assertEq(finalTrace !== null, true, "Expected a stack trace after OOM");
print(finalTrace);
// Detailed analysis
var lines = finalTrace.split('\n');
let re = new RegExp("#0.*test_oom_comprehensive\.js:" + lineNo)
assertEq(re.test(lines[0]), true, "Missing innermost frame");
}
}
// Interpreter captures innermost frame
assertCapturesOOMStackTrace(function () {
function deepFunction() {
function evenDeeper() {
throwOutOfMemory();
}
evenDeeper();
}
deepFunction();
}, 31);
if (getJitCompilerOptions()['baseline.enable']){
// JITs capture innermost frame
assertCapturesOOMStackTrace(function () {
function deepFunction(shouldOOM) {
function evenDeeper() {
if (shouldOOM) {
assertEq(inJit(), true, "Should be JIT-compiled");
throwOutOfMemory();
}
}
evenDeeper();
}
const MAX = 150;
for (let i = 0; i < MAX; i++) {
deepFunction(i >= MAX - 1);
}
}, 45);
}