// Test exotic ways of triggering recompilation. // Lowered native call. var x = 0; var y = true; for (var i = 0; i < 20; i++) { x += Array.map.apply(undefined, [[0], function(x) { if (i == 10) eval("y = 20"); return 1; }])[0]; } assertEq(x, 20); assertEq(y, 20); // Recompilation triggered by local function. var o = {}; function what(q) { function inner() { return q; } o.f = inner; var a = o.f(); return a; } for (var i = 0; i < 10; i++) { var a = what(i); assertEq(a, i); } // Lowered scripted call to apply returning code pointer. var global = 3; function foo(x, y) { var q = x.apply(null, y); if (q != 10) assertEq(global, true); } foo(function(a) { global = a; return 10; }, [1]); foo(function(a) { global = a; return 10; }, [1]); foo(function(a) { global = a; return 10; }, [1]); assertEq(global, 1); foo(function(a) { global = a; return 3; }, [true]); assertEq(global, true); // Lowered scripted call returning NULL. var oglobal = 3; function xfoo(x, y) { var q = x.apply(null, y); if (q != 10) assertEq(oglobal, true); } xfoo(function(a) { oglobal = a; return 10; }, [1]); xfoo(function(a) { oglobal = a; return 10; }, [1]); xfoo(function(a) { oglobal = a; return 10; }, [1]); assertEq(oglobal, 1); xfoo(function(a) { [1,2,3]; oglobal = a; return 3; }, [true]); assertEq(oglobal, true); // Recompilation out of SplatApplyArgs. weirdarray = [,,1,2,3]; Object.defineProperty(weirdarray, 0, {get: function() { vglobal = 'true'; }}); var vglobal = 3; function yfoo(x, y) { var q = x.apply(null, y); if (q != 10) assertEq(vglobal, 'true'); else assertEq(vglobal, 3); } yfoo(function(a) { return 10; }, [1]); yfoo(function(a) { return 10; }, [1]); yfoo(function(a) { return 10; }, [1]); yfoo(function() { return 0; }, weirdarray);