/* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ //----------------------------------------------------------------------------- var BUGNUMBER = 619283; var summary = "ECMAScript built-in methods that immediately throw when |this| is " + "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ // This test fills out for the non-standard methods which // ecma_5/misc/builtin-methods-reject-null-undefined-this.js declines to test. var ClassToMethodMap = { Object: [/* * Don't box this just yet for these methods -- they're used too * much without qualification to do that. :-( */ /* "__defineGetter__", "__defineSetter__", */ "__lookupGetter__", "__lookupSetter__", "watch", "unwatch", "toSource"], Function: ["toSource"], Array: ["toSource"], String: ["toSource", "quote", "bold", "italics", "fixed", "fontsize", "fontcolor", "link", "anchor", "strike", "small", "big", "blink", "sup", "sub", "substr", "trimLeft", "trimRight", "toJSON"], Boolean: ["toSource", "toJSON"], Number: ["toSource", "toJSON"], Date: ["toSource", "toLocaleFormat", "getYear", "setYear", "toGMTString"], RegExp: ["toSource"], Error: ["toSource"], }; var badThisValues = [null, undefined]; function testMethod(Class, className, method) { var expr; // Try out explicit this values for (var i = 0, sz = badThisValues.length; i < sz; i++) { var badThis = badThisValues[i]; expr = className + ".prototype." + method + ".call(" + badThis + ")"; try { Class.prototype[method].call(badThis); throw new Error(expr + " didn't throw a TypeError"); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error for " + expr + ", instead threw " + e); } expr = className + ".prototype." + method + ".apply(" + badThis + ")"; try { Class.prototype[method].apply(badThis); throw new Error(expr + " didn't throw a TypeError"); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error for " + expr + ", instead threw " + e); } } // ..and for good measure.. expr = "(0, " + className + ".prototype." + method + ")()" try { // comma operator to call GetValue() on the method and de-Reference it (0, Class.prototype[method])(); throw new Error(expr + " didn't throw a TypeError"); } catch (e) { assertEq(e instanceof TypeError, true, "wrong error for " + expr + ", instead threw " + e); } } for (var className in ClassToMethodMap) { var Class = this[className]; var methodNames = ClassToMethodMap[className]; for (var i = 0, sz = methodNames.length; i < sz; i++) { var method = methodNames[i]; testMethod(Class, className, method); } } /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("All tests passed!");