diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js new file mode 100644 index 0000000000..58d94d6f70 --- /dev/null +++ b/js/src/tests/non262/eval/redeclared-arguments-in-param-expression-eval.js @@ -0,0 +1,87 @@ +// Ensure there's no predefined |arguments| binding. +assertEq("arguments" in this, false); + +// Declare |arguments| when no pre-existing (and explicit) |arguments| bindings are present. +function f1(p = eval("var arguments")) {} +assertThrowsInstanceOf(f1, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| var-binding. +function f2(p = eval("var arguments")) { + var arguments; +} +assertThrowsInstanceOf(f2, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| function declaration. +// +// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> doesn't create the +// implicit |arguments| binding when no parameter expressions are present. This case +// may be special-cased in implementations and therefore should be tested specifically. +function f3(p = eval("var arguments")) { + function arguments() {} +} +assertThrowsInstanceOf(f3, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| lexical binding. +// +// <https://tc39.es/ecma262/#sec-functiondeclarationinstantiation> doesn't create the +// implicit |arguments| binding when no parameter expressions are present. This case +// may be special-cased in implementations and therefore should be tested specifically. +function f4(p = eval("var arguments")) { + let arguments; +} +assertThrowsInstanceOf(f4, SyntaxError); + +// Declare |arguments| when a following parameter is named |arguments|. +function f5(p = eval("var arguments"), arguments) {} +assertThrowsInstanceOf(f5, SyntaxError); + +// Declare |arguments| when a preceding parameter is named |arguments|. +function f6(arguments, p = eval("var arguments")) {} +assertThrowsInstanceOf(f6, SyntaxError); + + +// Repeat the same kind of tests for arrow function. + +// Declare |arguments| when no pre-existing |arguments| bindings are present. +var a1 = (p = eval("var arguments = 'param'")) => { + assertEq(arguments, "param"); +}; +a1(); + +// Declare |arguments| when the function body contains an |arguments| var-binding. +var a2 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + var arguments = "local"; + assertEq(arguments, "local"); + assertEq(q(), "param"); +}; +a2(); + +// Declare |arguments| when the function body contains an |arguments| function declaration. +var a3 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + function arguments() {} + assertEq(typeof arguments, "function"); + assertEq(q(), "param"); +}; +a3(); + +// Declare |arguments| when the function body contains an |arguments| lexical binding. +var a4 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + let arguments = "local"; + assertEq(arguments, "local"); + assertEq(q(), "param"); +}; +a4(); + +// Declare |arguments| when a following parameter is named |arguments|. +var a5 = (p = eval("var arguments"), arguments) => {}; +assertThrowsInstanceOf(a5, SyntaxError); + +// Declare |arguments| when a preceding parameter is named |arguments|. +var a6 = (arguments, p = eval("var arguments")) => {}; +assertThrowsInstanceOf(a6, SyntaxError); + +// None of the direct eval calls introduced a global |arguments| binding. +assertEq("arguments" in this, false); + +if (typeof reportCompare === "function") + reportCompare(true, true); |