michael@0: Function.prototype.callX = Function.prototype.call; michael@0: var x; michael@0: function f() { michael@0: x = f.caller; michael@0: return x; michael@0: } michael@0: michael@0: function g() { michael@0: return f.callX(null); michael@0: } michael@0: michael@0: function h1() { michael@0: // native michael@0: return ([0].map(f))[0]; michael@0: } michael@0: michael@0: function h2() { michael@0: // self-hosted michael@0: x = null; michael@0: [0].forEach(f); michael@0: return x; michael@0: } michael@0: michael@0: function k() { michael@0: x = null; michael@0: [0, 1].sort(f); michael@0: return x; michael@0: } michael@0: michael@0: function l() { michael@0: return f(); michael@0: } michael@0: michael@0: assertEq(g(), g); michael@0: assertEq(h1(), h1); michael@0: assertEq(h2(), h2); michael@0: assertEq(k(), k); michael@0: assertEq(l(), l); michael@0: michael@0: var baz; michael@0: var foo = {callX: function() { return "m"; }}; michael@0: function bar() { michael@0: return baz.caller; michael@0: } michael@0: function m() { michael@0: return baz.callX(null); michael@0: } michael@0: michael@0: baz = foo; michael@0: assertEq(m(), "m"); michael@0: baz = bar; michael@0: assertEq(m(), m); michael@0: assertEq(m(), m);