forceGCSlowPaths(); // Force OOM error in FTL MakeRope to happen in a lazy slow path. | |
function assert(b) { | |
if (!b) | |
throw new Error("Bad assertion"); | |
} | |
function a() { return "a"; } | |
noInline(a); | |
function b() { return "b"; } | |
noInline(b); | |
function c() { return "c"; } | |
noInline(c); | |
function d() { return "d"; } | |
noInline(d); | |
function e() { return "e"; } | |
noInline(e); | |
function f() { return "f"; } | |
noInline(f); | |
function g() { return "g"; } | |
noInline(g); | |
let expString = "a"; | |
let exponentialBlowup = false; | |
let shouldBreak = false; | |
function foo(fun, left, right) { | |
let x = fun(); | |
let r = left + right; | |
var _a = a(); | |
var _b = b(); | |
var _c = c(); | |
var _d = d(); | |
var _e = e(); | |
var _f = f(); | |
var _g = g(); | |
try { | |
expString = expString + expString; | |
} catch(e) { | |
shouldBreak = true; | |
assert(_b === "b"); | |
assert(_c === "c"); | |
assert(_d === "d"); | |
assert(_e === "e"); | |
assert(_f === "f"); | |
assert(_g === "g"); | |
} | |
return x + r; | |
} | |
noInline(foo); | |
function blah() { return "blah"; } | |
noInline(blah); | |
for (let i = 0; i < 100000; i++) { | |
assert(foo(blah, "b", "a") === "blahba"); | |
if (!exponentialBlowup) | |
expString = "a"; | |
} | |
exponentialBlowup = true; | |
while (true) { | |
assert(foo(blah, "a", "b") === "blahab"); | |
if (shouldBreak) | |
break; | |
} |