mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 10:19:03 +03:00
LibCpp: Only store error messages for the main parser state
There's no need to store parser error messages for states with depth > 0, as they will eventually be popped from the states stack and their error messages will never be displayed to the user. Profiling shows that this change reduces the % of backtraces that contain the store_state & load_state functions from ~95% to ~70%. Empirically this change reduces the time it takes on my machine for the c++ language server to handle a file that #includes <LibGUI/Widget.h> from ~14sec to ~4sec.
This commit is contained in:
parent
2c41e89d08
commit
eb6a15d52b
Notes:
sideshowbarker
2024-07-18 09:06:49 +09:00
Author: https://github.com/itamar8910 Commit: https://github.com/SerenityOS/serenity/commit/eb6a15d52be Pull-request: https://github.com/SerenityOS/serenity/pull/8731
@ -894,6 +894,10 @@ Vector<Token> Parser::tokens_in_range(Position start, Position end) const
|
|||||||
void Parser::error(StringView message)
|
void Parser::error(StringView message)
|
||||||
{
|
{
|
||||||
LOG_SCOPE();
|
LOG_SCOPE();
|
||||||
|
|
||||||
|
if (!m_saved_states.is_empty())
|
||||||
|
return;
|
||||||
|
|
||||||
if (message.is_null() || message.is_empty())
|
if (message.is_null() || message.is_empty())
|
||||||
message = "<empty>";
|
message = "<empty>";
|
||||||
String formatted_message;
|
String formatted_message;
|
||||||
@ -907,7 +911,7 @@ void Parser::error(StringView message)
|
|||||||
m_tokens[m_state.token_index].start().column);
|
m_tokens[m_state.token_index].start().column);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_state.errors.append(formatted_message);
|
m_errors.append(formatted_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::match_expression()
|
bool Parser::match_expression()
|
||||||
|
@ -33,7 +33,7 @@ public:
|
|||||||
String text_of_node(const ASTNode&) const;
|
String text_of_node(const ASTNode&) const;
|
||||||
StringView text_of_token(const Cpp::Token& token) const;
|
StringView text_of_token(const Cpp::Token& token) const;
|
||||||
void print_tokens() const;
|
void print_tokens() const;
|
||||||
const Vector<String>& errors() const { return m_state.errors; }
|
const Vector<String>& errors() const { return m_errors; }
|
||||||
const Preprocessor::Definitions& preprocessor_definitions() const { return m_preprocessor_definitions; }
|
const Preprocessor::Definitions& preprocessor_definitions() const { return m_preprocessor_definitions; }
|
||||||
|
|
||||||
struct TodoEntry {
|
struct TodoEntry {
|
||||||
@ -147,7 +147,6 @@ private:
|
|||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
size_t token_index { 0 };
|
size_t token_index { 0 };
|
||||||
Vector<String> errors;
|
|
||||||
NonnullRefPtrVector<ASTNode> nodes;
|
NonnullRefPtrVector<ASTNode> nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -200,6 +199,7 @@ private:
|
|||||||
State m_state;
|
State m_state;
|
||||||
Vector<State> m_saved_states;
|
Vector<State> m_saved_states;
|
||||||
RefPtr<TranslationUnit> m_root_node;
|
RefPtr<TranslationUnit> m_root_node;
|
||||||
|
Vector<String> m_errors;
|
||||||
|
|
||||||
Vector<TokenAndPreprocessorDefinition> m_replaced_preprocessor_tokens;
|
Vector<TokenAndPreprocessorDefinition> m_replaced_preprocessor_tokens;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user