From 910de95e7aadcbdb8a3f04ec1ec4c6518ef1cd86 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 14 Sep 2021 02:51:16 +0200 Subject: [PATCH] LibJS: Add a fast failure path to try_parse_arrow_function_expression() The save/load of parser state performed by lookahead parsing is quite expensive so let's try to avoid it in the most common case. This is a 15-20% speedup on various chunks of JS I've tested. :^) --- Userland/Libraries/LibJS/Parser.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index 72d8d8f94fe..b4c9d76693a 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -449,6 +449,20 @@ static bool is_simple_parameter_list(Vector const& para RefPtr Parser::try_parse_arrow_function_expression(bool expect_parens) { + if (!expect_parens) { + // NOTE: This is a fast path where we try to fail early in case this can't possibly + // be a match. The idea is to avoid the expensive parser state save/load mechanism. + // The logic is duplicated below in the "real" !expect_parens branch. + if (!match_identifier() && !match(TokenType::Yield) && !match(TokenType::Await)) + return nullptr; + auto forked_lexer = m_state.lexer; + auto token = forked_lexer.next(); + if (token.trivia_contains_line_terminator()) + return nullptr; + if (token.type() != TokenType::Arrow) + return nullptr; + } + save_state(); auto rule_start = push_start();