class A { constructor() { } } class B extends A { constructor(iterationCount) { let values = []; for (let i = 2; i < iterationCount; ++i) { // Let's keep the loop busy. let divided = false; for (let j = i - 1; j > 1; --j) { if (!(i % j)) { divided = true; break; } } if (!divided) values.push(i); if (!(i % (iterationCount - 2))) print(this); else if (values.length == iterationCount) super(values); } } } noInline(B); // Small warm up with small iteration count. Try to get to DFG. for (var i = 0; i < 30; ++i) { var exception = null; try { new B(10); } catch (e) { exception = e; if (!(e instanceof ReferenceError)) throw "Exception thrown in iteration " + i + " was not a reference error"; } if (!exception) throw "Exception not thrown for an unitialized this at iteration " + i; } // Now try to go to FTL in the constructor. for (var i = 0; i < 2; ++i) { var exception = null; try { new B(7e3); } catch (e) { exception = e; if (!(e instanceof ReferenceError)) throw "Exception thrown in iteration " + i + " was not a reference error"; } if (!exception) throw "Exception not thrown for an unitialized this at iteration " + i; }