//@ run("--useConcurrentJIT=false") // This test is set up delicately to: // 1. cause the test() function to DFG compile with just the right amount of profiling // so that ... // 2. the DFG identifies the "return Function()" path as dead, and ... // 3. the DFG compiled function doesn't OSR exit too many times before ... // 4. we change the implementation of the inlined foo() and execute test() again. // // This test should not crash. eval("\"use strict\"; var w;"); foo = function() { throw 0; } var x; (function() { eval("test = function() { ~foo(~(0 ? ~x : x) ? 0 : 0); return Function(); }"); })(); // This loop count of 2000 was empirically determined to be the right amount to get this // this issue to manifest. Dropping or raising it may mask the issue and prevent it from // manifesting. for (var i = 0; i < 2000; ++i) { try { test(); } catch(e) { } } foo = function() { }; test();