From 156dfe3d629f36a03bdcde3a9a253934e45dd4de Mon Sep 17 00:00:00 2001 From: davidot Date: Fri, 26 Nov 2021 23:37:14 +0100 Subject: [PATCH] LibJS: Disallow member expression in binding pattern as parameters --- Userland/Libraries/LibJS/Parser.cpp | 4 +++- .../LibJS/Tests/syntax/destructuring-assignment.js | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index c8f5690798..5379c891d5 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -2383,7 +2383,7 @@ Vector Parser::parse_formal_parameters(int& function_le Vector parameters; auto consume_identifier_or_binding_pattern = [&]() -> Variant> { - if (auto pattern = parse_binding_pattern(AllowDuplicates::No, AllowMemberExpressions::Yes)) + if (auto pattern = parse_binding_pattern(AllowDuplicates::No, AllowMemberExpressions::No)) return pattern.release_nonnull(); auto token = consume_identifier(); @@ -2635,6 +2635,8 @@ RefPtr Parser::parse_binding_pattern(Parser::AllowDuplicates all return {}; } consume(); + } else if (is_object && !match(TokenType::CurlyClose)) { + consume(TokenType::Comma); } } diff --git a/Userland/Libraries/LibJS/Tests/syntax/destructuring-assignment.js b/Userland/Libraries/LibJS/Tests/syntax/destructuring-assignment.js index 7a709a31bb..198561c4a8 100644 --- a/Userland/Libraries/LibJS/Tests/syntax/destructuring-assignment.js +++ b/Userland/Libraries/LibJS/Tests/syntax/destructuring-assignment.js @@ -46,6 +46,20 @@ describe("parsing", () => { expect(`const [ a, [ ...{length} ] ] = [];`).toEval(); expect(`let [ a, [ ...{length} ] ] = [];`).toEval(); }); + + test("function parameters cannot use member expresssions", () => { + expect("function f([a.b]) {}").not.toEval(); + expect("function f([b[0]]) {}").not.toEval(); + + expect("function f({c:a.b}) {}").not.toEval(); + expect("function f({a:b[0]}) {}").not.toEval(); + + expect("([a.b]) => 1").not.toEval(); + expect("([b[0]]) => 2").not.toEval(); + + expect("({c:a.b}) => 3").not.toEval(); + expect("({a:b[0]}) => 4").not.toEval(); + }); }); describe("evaluating", () => {