Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tests for Function.prototype.caller and arguments properties #4355

Merged
merged 16 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
});

This file was deleted.

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

This file was deleted.