diff --git a/Userland/Libraries/LibJS/Lexer.cpp b/Userland/Libraries/LibJS/Lexer.cpp index 340eca7ec5..cd4dc8a415 100644 --- a/Userland/Libraries/LibJS/Lexer.cpp +++ b/Userland/Libraries/LibJS/Lexer.cpp @@ -27,6 +27,7 @@ Lexer::Lexer(StringView source, StringView filename, size_t line_number, size_t , m_filename(filename) , m_line_number(line_number) , m_line_column(line_column) + , m_parsed_identifiers(adopt_ref(*new ParsedIdentifiers)) { if (s_keywords.is_empty()) { s_keywords.set("await", TokenType::Await); @@ -602,8 +603,7 @@ Token Lexer::next() } while (code_point.has_value()); identifier = builder.build(); - if (!m_parsed_identifiers.contains_slow(*identifier)) - m_parsed_identifiers.append(*identifier); + m_parsed_identifiers->identifiers.set(*identifier); auto it = s_keywords.find(identifier->hash(), [&](auto& entry) { return entry.key == identifier; }); if (it == s_keywords.end()) diff --git a/Userland/Libraries/LibJS/Lexer.h b/Userland/Libraries/LibJS/Lexer.h index 03991f596d..1ecbac223b 100644 --- a/Userland/Libraries/LibJS/Lexer.h +++ b/Userland/Libraries/LibJS/Lexer.h @@ -82,9 +82,13 @@ private: static HashMap s_two_char_tokens; static HashMap s_single_char_tokens; - // Resolved identifiers must be kept alive for the duration of the parsing stage, otherwise - // the only references to these strings are deleted by the Token destructor. - Vector m_parsed_identifiers; + struct ParsedIdentifiers : public RefCounted { + // Resolved identifiers must be kept alive for the duration of the parsing stage, otherwise + // the only references to these strings are deleted by the Token destructor. + HashTable identifiers; + }; + + RefPtr m_parsed_identifiers; }; }