Skip to content

Commit

Permalink
Function.prototype: Add tests "caller" and "arguments" properties (#4355
Browse files Browse the repository at this point in the history
)

Fixes #4340
Fixes #674
  • Loading branch information
jdorfman authored Jan 29, 2025
1 parent e99213a commit 7c37969
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 55 deletions.
45 changes: 45 additions & 0 deletions test/built-ins/Function/prototype/arguments/prop-desc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (C) 2024 Justin Dorfman. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-addrestrictedfunctionproperties
description: >
Function.prototype.arguments is an accessor property whose set and get
functions are both %ThrowTypeError%.
info: |
2. Let _thrower_ be _realm_.[[Intrinsics]].[[%ThrowTypeError%]].
3. Perform ! DefinePropertyOrThrow(_F_, *"caller"*, PropertyDescriptor { [[Get]]: _thrower_, [[Set]]: _thrower_, [[Enumerable]]: *false*, [[Configurable]]: *true* }).
4. Perform ! DefinePropertyOrThrow(_F_, *"arguments"*, PropertyDescriptor { [[Get]]: _thrower_, [[Set]]: _thrower_, [[Enumerable]]: *false*, [[Configurable]]: *true* }).
includes: [propertyHelper.js, wellKnownIntrinsicObjects.js]
---*/

const argumentsDesc = Object.getOwnPropertyDescriptor(Function.prototype, 'arguments');

verifyProperty(
Function.prototype,
"arguments",
{ enumerable: false, configurable: true },
{ restore: true }
);

assert.sameValue(typeof argumentsDesc.get, "function",
"Function.prototype.arguments has function getter");
assert.sameValue(typeof argumentsDesc.set, "function",
"Function.prototype.arguments has function setter");
assert.sameValue(argumentsDesc.get, argumentsDesc.set,
"Function.prototype.arguments property getter/setter are the same function");

var throwTypeError;
WellKnownIntrinsicObjects.forEach(function(record) {
if (record.name === "%ThrowTypeError%") {
throwTypeError = record.value;
}
});
if (throwTypeError) {
assert.sameValue(argumentsDesc.set, throwTypeError, "Function.prototype.arguments getter is %ThrowTypeError%");
}
assert.throws(TypeError, function() {
return Function.prototype.arguments;
});
assert.throws(TypeError, function() {
Function.prototype.arguments = arguments;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright (C) 2024 Justin Dorfman. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-addrestrictedfunctionproperties
description: >
Function.prototype.arguments and Function.prototype.arguments are both
accessor properties whose set and get functions are both %ThrowTypeError%.
info: |
2. Let _thrower_ be _realm_.[[Intrinsics]].[[%ThrowTypeError%]].
3. Perform ! DefinePropertyOrThrow(_F_, *"caller"*, PropertyDescriptor { [[Get]]: _thrower_, [[Set]]: _thrower_, [[Enumerable]]: *false*, [[Configurable]]: *true* }).
4. Perform ! DefinePropertyOrThrow(_F_, *"arguments"*, PropertyDescriptor { [[Get]]: _thrower_, [[Set]]: _thrower_, [[Enumerable]]: *false*, [[Configurable]]: *true* }).
---*/

const callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, "caller");
const argumentsDesc = Object.getOwnPropertyDescriptor(Function.prototype, "arguments");

// Other tests at ../{arguments,caller}/prop-desc.js already assert that each
// getter/setter pair use a single function (and when possible, that the
// function is %ThrowTypeError%), so this test only needs to assert equality
// *across* the pairs.
assert.sameValue(callerDesc.get, argumentsDesc.get,
"Function.prototype.arguments and Function.prototype.caller accessor functions should match (%ThrowTypeError%)");
43 changes: 43 additions & 0 deletions test/built-ins/Function/prototype/caller/prop-desc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (C) 2024 Justin Dorfman. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-function.prototype.caller
description: >
Function.prototype.caller property descriptor
info: |
Function.prototype.caller is an accessor property whose set and get
accessor functions are both %ThrowTypeError%.
includes: [propertyHelper.js, wellKnownIntrinsicObjects.js]
---*/

const callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, 'caller');

verifyProperty(
Function.prototype,
"caller",
{ enumerable: false, configurable: true },
{ restore: true }
);

assert.sameValue(typeof callerDesc.get, "function",
"Function.prototype.caller has function getter");
assert.sameValue(typeof callerDesc.set, "function",
"Function.prototype.caller has function setter");
assert.sameValue(callerDesc.get, callerDesc.set,
"Caller property getter/setter are the same function");

var throwTypeError;
WellKnownIntrinsicObjects.forEach(function(record) {
if (record.name === "%ThrowTypeError%") {
throwTypeError = record.value;
}
});
if (throwTypeError) {
assert.sameValue(callerDesc.set, throwTypeError, "Function.prototype.caller getter is %ThrowTypeError%");
}
assert.throws(TypeError, function() {
return Function.prototype.caller;
});
assert.throws(TypeError, function fn() {
Function.prototype.caller = fn;
});
27 changes: 0 additions & 27 deletions test/built-ins/Function/prototype/restricted-property-arguments.js

This file was deleted.

28 changes: 0 additions & 28 deletions test/built-ins/Function/prototype/restricted-property-caller.js

This file was deleted.

0 comments on commit 7c37969

Please sign in to comment.