Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!Object.prototype.toSource)
/*
* Any copyright is dedicated to the Public Domain.
*/
//-----------------------------------------------------------------------------
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
// non262/misc/builtin-methods-reject-null-undefined-this.js declines to test.
var ClassToMethodMap =
{
Object: ["toSource"],
Function: ["toSource"],
Array: ["toSource"],
String: ["toSource"],
Boolean: ["toSource"],
Number: ["toSource"],
Date: ["toSource"],
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!");