فهرست منبع

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.
Itamar 4 سال پیش
والد
کامیت
eb6a15d52b
2فایلهای تغییر یافته به همراه7 افزوده شده و 3 حذف شده
  1. 5 1
      Userland/Libraries/LibCpp/Parser.cpp
  2. 2 2
      Userland/Libraries/LibCpp/Parser.h

+ 5 - 1
Userland/Libraries/LibCpp/Parser.cpp

@@ -894,6 +894,10 @@ Vector<Token> Parser::tokens_in_range(Position start, Position end) const
 void Parser::error(StringView message)
 {
     LOG_SCOPE();
+
+    if (!m_saved_states.is_empty())
+        return;
+    
     if (message.is_null() || message.is_empty())
         message = "<empty>";
     String formatted_message;
@@ -907,7 +911,7 @@ void Parser::error(StringView message)
             m_tokens[m_state.token_index].start().column);
     }
 
-    m_state.errors.append(formatted_message);
+    m_errors.append(formatted_message);
 }
 
 bool Parser::match_expression()

+ 2 - 2
Userland/Libraries/LibCpp/Parser.h

@@ -33,7 +33,7 @@ public:
     String text_of_node(const ASTNode&) const;
     StringView text_of_token(const Cpp::Token& token) 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; }
 
     struct TodoEntry {
@@ -147,7 +147,6 @@ private:
 
     struct State {
         size_t token_index { 0 };
-        Vector<String> errors;
         NonnullRefPtrVector<ASTNode> nodes;
     };
 
@@ -200,6 +199,7 @@ private:
     State m_state;
     Vector<State> m_saved_states;
     RefPtr<TranslationUnit> m_root_node;
+    Vector<String> m_errors;
 
     Vector<TokenAndPreprocessorDefinition> m_replaced_preprocessor_tokens;
 };