michael@0: /* michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/licenses/publicdomain/ michael@0: */ michael@0: michael@0: var gTestfile = 'function-caller.js'; michael@0: var BUGNUMBER = 514581; michael@0: var summary = "Function.prototype.caller should throw a TypeError for " + michael@0: "strict-mode functions"; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: // behavior michael@0: michael@0: function expectTypeError(fun) michael@0: { michael@0: try michael@0: { michael@0: fun(); michael@0: throw new Error("didn't throw"); michael@0: } michael@0: catch (e) michael@0: { michael@0: assertEq(e instanceof TypeError, true, michael@0: "expected TypeError calling function" + michael@0: ("name" in fun ? " " + fun.name : "") + ", instead got: " + e); michael@0: } michael@0: } michael@0: michael@0: function bar() { "use strict"; } michael@0: expectTypeError(function barCaller() { bar.caller; }); michael@0: michael@0: function baz() { "use strict"; return 17; } michael@0: expectTypeError(function bazCaller() { baz.caller; }); michael@0: michael@0: michael@0: // accessor identity michael@0: michael@0: function strictMode() { "use strict"; return 42; } michael@0: var canonicalTTE = Object.getOwnPropertyDescriptor(strictMode, "caller").get; michael@0: michael@0: var barCaller = Object.getOwnPropertyDescriptor(bar, "caller"); michael@0: assertEq("get" in barCaller, true); michael@0: assertEq("set" in barCaller, true); michael@0: assertEq(barCaller.get, canonicalTTE); michael@0: assertEq(barCaller.set, canonicalTTE); michael@0: michael@0: var barArguments = Object.getOwnPropertyDescriptor(bar, "arguments"); michael@0: assertEq("get" in barArguments, true); michael@0: assertEq("set" in barArguments, true); michael@0: assertEq(barArguments.get, canonicalTTE); michael@0: assertEq(barArguments.set, canonicalTTE); michael@0: michael@0: var bazCaller = Object.getOwnPropertyDescriptor(baz, "caller"); michael@0: assertEq("get" in bazCaller, true); michael@0: assertEq("set" in bazCaller, true); michael@0: assertEq(bazCaller.get, canonicalTTE); michael@0: assertEq(bazCaller.set, canonicalTTE); michael@0: michael@0: var bazArguments = Object.getOwnPropertyDescriptor(baz, "arguments"); michael@0: assertEq("get" in bazArguments, true); michael@0: assertEq("set" in bazArguments, true); michael@0: assertEq(bazArguments.get, canonicalTTE); michael@0: assertEq(bazArguments.set, canonicalTTE); michael@0: michael@0: michael@0: // [[ThrowTypeError]] characteristics michael@0: michael@0: assertEq(Object.prototype.toString.call(canonicalTTE), "[object Function]"); michael@0: assertEq(Object.getPrototypeOf(canonicalTTE), Function.prototype); michael@0: assertEq(canonicalTTE.length, 0); michael@0: assertEq(Object.isExtensible(canonicalTTE), false); michael@0: canonicalTTE.lumpy = 17; michael@0: assertEq(canonicalTTE.hasOwnProperty("lumpy"), false); michael@0: assertEq("lumpy" in canonicalTTE, false); michael@0: expectTypeError(function setTTEProp() { "use strict"; canonicalTTE.x = 42; }); michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("All tests passed!");