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