From 5fd87ccd169f5ed0d047f89744740e3fc0aed4eb Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 16 Sep 2020 20:03:06 +0100 Subject: LibJS: Add FIXMEs for parsing increment operators with function LHS/RHS The parser considers it a syntax error at the moment, other engines throw a ReferenceError during runtime for ++foo(), --foo(), foo()++ and foo()--, so I assume the spec defines this. --- Libraries/LibJS/Parser.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'Libraries/LibJS') diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index c8b70a874e..3448a197b5 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -653,6 +653,8 @@ NonnullRefPtr Parser::parse_unary_prefixed_expression() auto rhs_start_line = m_parser_state.m_current_token.line_number(); auto rhs_start_column = m_parser_state.m_current_token.line_column(); auto rhs = parse_expression(precedence, associativity); + // FIXME: Apparently for functions this should also not be enforced on a parser level, + // other engines throw ReferenceError for ++foo() if (!rhs->is_identifier() && !rhs->is_member_expression()) syntax_error(String::format("Right-hand side of prefix increment operator must be identifier or member expression, got %s", rhs->class_name()), rhs_start_line, rhs_start_column); return create_ast_node(UpdateOp::Increment, move(rhs), true); @@ -662,6 +664,8 @@ NonnullRefPtr Parser::parse_unary_prefixed_expression() auto rhs_start_line = m_parser_state.m_current_token.line_number(); auto rhs_start_column = m_parser_state.m_current_token.line_column(); auto rhs = parse_expression(precedence, associativity); + // FIXME: Apparently for functions this should also not be enforced on a parser level, + // other engines throw ReferenceError for --foo() if (!rhs->is_identifier() && !rhs->is_member_expression()) syntax_error(String::format("Right-hand side of prefix decrement operator must be identifier or member expression, got %s", rhs->class_name()), rhs_start_line, rhs_start_column); return create_ast_node(UpdateOp::Decrement, move(rhs), true); @@ -1096,11 +1100,15 @@ NonnullRefPtr Parser::parse_secondary_expression(NonnullRefPtris_identifier() && !lhs->is_member_expression()) syntax_error(String::format("Left-hand side of postfix increment operator must be identifier or member expression, got %s", lhs->class_name())); consume(); return create_ast_node(UpdateOp::Increment, move(lhs)); case TokenType::MinusMinus: + // FIXME: Apparently for functions this should also not be enforced on a parser level, + // other engines throw ReferenceError for foo()-- if (!lhs->is_identifier() && !lhs->is_member_expression()) syntax_error(String::format("Left-hand side of postfix increment operator must be identifier or member expression, got %s", lhs->class_name())); consume(); -- cgit v1.2.3