Source code

Revision control

Copy as Markdown

Other Tools

// The use of arguments other than reading arguments.length should disable
// the ArgumentsLength optimization, and should emit the raw property
// operations.
//
// This includes:
// * assignment on arguments.length
// * delete on arguments.length
// * use of arguments alone
// * optional chain
function deleteOnArgumentsLength() {
assertEq(arguments.length, 3);
const result = delete arguments.length;
assertEq(result, true);
assertEq(arguments.length, undefined);
const result2 = delete arguments.length;
assertEq(result2, true);
}
deleteOnArgumentsLength(1, 2, 3);
function deleteOnArgumentsOptionalLength() {
assertEq(arguments?.length, 3);
const result = delete arguments?.length;
assertEq(result, true);
assertEq(arguments?.length, undefined);
const result2 = delete arguments?.length;
assertEq(result2, true);
}
deleteOnArgumentsOptionalLength(1, 2, 3);
function deleteOnArgumentsLengthAfterModify() {
arguments.length = 4;
assertEq(arguments.length, 4);
const result = delete arguments.length;
assertEq(result, true);
assertEq(arguments.length, undefined);
const result2 = delete arguments.length;
assertEq(result2, true);
}
deleteOnArgumentsLengthAfterModify();
function modify(a) {
a.length = 4;
}
function deleteOnArgumentsLengthAfterImplicitModify() {
modify(arguments);
assertEq(arguments.length, 4);
const result = delete arguments.length;
assertEq(result, true);
assertEq(arguments.length, undefined);
const result2 = delete arguments.length;
assertEq(result2, true);
}
deleteOnArgumentsLengthAfterImplicitModify();
function deleteOnArgumentsLengthProp() {
arguments.length = {
prop: 10,
};
assertEq(arguments.length.prop, 10);
const result = delete arguments.length.prop;
assertEq(result, true);
assertEq(arguments.length.prop, undefined);
const result2 = delete arguments.length.prop;
assertEq(result2, true);
}
deleteOnArgumentsLengthProp();
function deleteOnArgumentsLengthOptionalProp() {
arguments.length = {
prop: 10,
};
assertEq(arguments.length?.prop, 10);
const result = delete arguments.length?.prop;
assertEq(result, true);
assertEq(arguments.length?.prop, undefined);
// The no-op delete should also return true.
const result2 = delete arguments.length?.prop;
assertEq(result2, true);
}
deleteOnArgumentsLengthOptionalProp();
function deleteOnArgumentsOptionalLengthOptionalProp() {
arguments.length = {
prop: 10,
};
assertEq(arguments?.length?.prop, 10);
const result = delete arguments?.length?.prop;
assertEq(result, true);
assertEq(arguments?.length?.prop, undefined);
const result2 = delete arguments?.length?.prop;
assertEq(result2, true);
const result3 = delete arguments?.length;
assertEq(result3, true);
assertEq(arguments.length, undefined);
const result4 = delete arguments?.length?.prop;
assertEq(result4, true);
}
deleteOnArgumentsOptionalLengthOptionalProp();
if (typeof reportCompare === "function")
reportCompare(0, 0);