1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:37:43 +00:00

LibJS: Make more use of Token::flystring_value()

This patch makes check_identifier_name_for_assignment_validity()
take a FlyString instead of a StringView. We then exploit this by
passing FlyString in more places via flystring_value().

This gives a ~1% speedup when parsing the largest Discord JS file.
This commit is contained in:
Andreas Kling 2022-02-13 13:34:26 +01:00
parent 0cb0979990
commit 50a446a5d1
2 changed files with 13 additions and 13 deletions

View file

@ -1029,8 +1029,8 @@ NonnullRefPtr<ClassExpression> Parser::parse_class_expression(bool expect_class_
RefPtr<FunctionExpression> constructor; RefPtr<FunctionExpression> constructor;
HashTable<FlyString> found_private_names; HashTable<FlyString> found_private_names;
String class_name = expect_class_name || match_identifier() || match(TokenType::Yield) || match(TokenType::Await) FlyString class_name = expect_class_name || match_identifier() || match(TokenType::Yield) || match(TokenType::Await)
? consume_identifier_reference().value().to_string() ? consume_identifier_reference().flystring_value()
: ""; : "";
check_identifier_name_for_assignment_validity(class_name, true); check_identifier_name_for_assignment_validity(class_name, true);
@ -2229,7 +2229,7 @@ NonnullRefPtr<AssignmentExpression> Parser::parse_assignment_expression(Assignme
if (!is<Identifier>(*lhs) && !is<MemberExpression>(*lhs) && !is<CallExpression>(*lhs)) { if (!is<Identifier>(*lhs) && !is<MemberExpression>(*lhs) && !is<CallExpression>(*lhs)) {
syntax_error("Invalid left-hand side in assignment"); syntax_error("Invalid left-hand side in assignment");
} else if (m_state.strict_mode && is<Identifier>(*lhs)) { } else if (m_state.strict_mode && is<Identifier>(*lhs)) {
auto name = static_cast<const Identifier&>(*lhs).string(); auto const& name = static_cast<Identifier const&>(*lhs).string();
check_identifier_name_for_assignment_validity(name); check_identifier_name_for_assignment_validity(name);
} else if (m_state.strict_mode && is<CallExpression>(*lhs)) { } else if (m_state.strict_mode && is<CallExpression>(*lhs)) {
syntax_error("Cannot assign to function call"); syntax_error("Cannot assign to function call");
@ -2501,7 +2501,7 @@ NonnullRefPtr<FunctionNodeType> Parser::parse_function_node(u8 parse_options, Op
function_kind = FunctionKind::Async; function_kind = FunctionKind::Async;
else else
function_kind = FunctionKind::Normal; function_kind = FunctionKind::Normal;
String name; FlyString name;
if (parse_options & FunctionNodeParseOptions::CheckForFunctionAndName) { if (parse_options & FunctionNodeParseOptions::CheckForFunctionAndName) {
if (function_kind == FunctionKind::Normal && match(TokenType::Async) && !next_token().trivia_contains_line_terminator()) { if (function_kind == FunctionKind::Normal && match(TokenType::Async) && !next_token().trivia_contains_line_terminator()) {
function_kind = FunctionKind::Async; function_kind = FunctionKind::Async;
@ -2516,9 +2516,9 @@ NonnullRefPtr<FunctionNodeType> Parser::parse_function_node(u8 parse_options, Op
} }
if (FunctionNodeType::must_have_name() || match_identifier()) if (FunctionNodeType::must_have_name() || match_identifier())
name = consume_identifier().value(); name = consume_identifier().flystring_value();
else if (is_function_expression && (match(TokenType::Yield) || match(TokenType::Await))) else if (is_function_expression && (match(TokenType::Yield) || match(TokenType::Await)))
name = consume().value(); name = consume().flystring_value();
check_identifier_name_for_assignment_validity(name); check_identifier_name_for_assignment_validity(name);
@ -2581,7 +2581,7 @@ Vector<FunctionNode::Parameter> Parser::parse_formal_parameters(int& function_le
return pattern.release_nonnull(); return pattern.release_nonnull();
auto token = consume_identifier(); auto token = consume_identifier();
auto parameter_name = token.value(); auto parameter_name = token.flystring_value();
check_identifier_name_for_assignment_validity(parameter_name); check_identifier_name_for_assignment_validity(parameter_name);
@ -2661,7 +2661,7 @@ Vector<FunctionNode::Parameter> Parser::parse_formal_parameters(int& function_le
return parameters; return parameters;
} }
static constexpr AK::Array<StringView, 36> s_reserved_words = { "break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete", "do", "else", "enum", "export", "extends", "false", "finally", "for", "function", "if", "import", "in", "instanceof", "new", "null", "return", "super", "switch", "this", "throw", "true", "try", "typeof", "var", "void", "while", "with" }; static AK::Array<FlyString, 36> s_reserved_words = { "break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete", "do", "else", "enum", "export", "extends", "false", "finally", "for", "function", "if", "import", "in", "instanceof", "new", "null", "return", "super", "switch", "this", "throw", "true", "try", "typeof", "var", "void", "while", "with" };
RefPtr<BindingPattern> Parser::parse_binding_pattern(Parser::AllowDuplicates allow_duplicates, Parser::AllowMemberExpressions allow_member_expressions) RefPtr<BindingPattern> Parser::parse_binding_pattern(Parser::AllowDuplicates allow_duplicates, Parser::AllowMemberExpressions allow_member_expressions)
{ {
@ -3959,7 +3959,7 @@ void Parser::discard_saved_state()
m_saved_state.take_last(); m_saved_state.take_last();
} }
void Parser::check_identifier_name_for_assignment_validity(StringView name, bool force_strict) void Parser::check_identifier_name_for_assignment_validity(FlyString const& name, bool force_strict)
{ {
// FIXME: this is now called from multiple places maybe the error message should be dynamic? // FIXME: this is now called from multiple places maybe the error message should be dynamic?
if (any_of(s_reserved_words, [&](auto& value) { return name == value; })) { if (any_of(s_reserved_words, [&](auto& value) { return name == value; })) {
@ -4141,13 +4141,13 @@ NonnullRefPtr<ImportStatement> Parser::parse_import_statement(Program& program)
// ImportSpecifier : ImportedBinding // ImportSpecifier : ImportedBinding
auto require_as = !match_imported_binding(); auto require_as = !match_imported_binding();
auto name_position = position(); auto name_position = position();
auto name = consume().value(); auto name = consume().flystring_value();
if (match_as()) { if (match_as()) {
consume(TokenType::Identifier); consume(TokenType::Identifier);
auto alias_position = position(); auto alias_position = position();
auto alias = consume_identifier().value(); auto alias = consume_identifier().flystring_value();
check_identifier_name_for_assignment_validity(alias); check_identifier_name_for_assignment_validity(alias);
entries_with_location.append({ { name, alias }, alias_position }); entries_with_location.append({ { name, alias }, alias_position });
@ -4168,7 +4168,7 @@ NonnullRefPtr<ImportStatement> Parser::parse_import_statement(Program& program)
consume(TokenType::Identifier); consume(TokenType::Identifier);
auto alias_position = position(); auto alias_position = position();
auto alias = consume_identifier().value(); auto alias = consume_identifier().flystring_value();
check_identifier_name_for_assignment_validity(alias); check_identifier_name_for_assignment_validity(alias);
entries_with_location.append({ { move(name), alias }, alias_position }); entries_with_location.append({ { move(name), alias }, alias_position });

View file

@ -216,7 +216,7 @@ private:
Token next_token(size_t steps = 1) const; Token next_token(size_t steps = 1) const;
void check_identifier_name_for_assignment_validity(StringView, bool force_strict = false); void check_identifier_name_for_assignment_validity(FlyString const&, bool force_strict = false);
bool try_parse_arrow_function_expression_failed_at_position(const Position&) const; bool try_parse_arrow_function_expression_failed_at_position(const Position&) const;
void set_try_parse_arrow_function_expression_failed_at_position(const Position&, bool); void set_try_parse_arrow_function_expression_failed_at_position(const Position&, bool);