1325473 - A TypeError should be thrown when accessing 'arguments' or 'caller' on any of the new function types.

This commit is contained in:
Gaming4JC 2019-06-08 15:15:05 -04:00 committed by Roy Tam
commit baab6a6ca9
2 changed files with 54 additions and 2 deletions

View file

@ -0,0 +1,43 @@
// Tests that newer-type functions (i.e. anything not defined by regular function declarations and
// expressions) throw when accessing their 'arguments' and 'caller' properties.
// 9.2.7 (AddRestrictedFunctionProperties) defines accessors on Function.prototype which throw on
// every 'get' and 'set' of 'caller' and 'arguments'.
// Additionally, 16.2 (Forbidden Extensions) forbids adding properties to all non-"legacy" function
// declarations and expressions. This creates the effect that all newer-style functions act like
// strict-mode functions when accessing their 'caller' and 'arguments' properties.
const container = {
async asyncMethod() {},
*genMethod() {},
method() {}
};
[
async function(){},
function*(){},
() => {},
async () => {},
container.asyncMethod,
container.genMethod,
container.method
].forEach(f => {
checkArgumentsAccess(f);
checkCallerAccess(f);
});
function checkArgumentsAccess(f) {
assertThrowsInstanceOf(() => f.arguments, TypeError,
`Expected 'arguments' property access to throw on ${f}`);
}
function checkCallerAccess(f) {
assertThrowsInstanceOf(() => f.caller, TypeError,
`Expected 'caller' property access to throw on ${f}`);
}
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");