Browse Source

Shell: Avoid moving AK::Function instances while inside them

Ali Mohammad Pur 4 năm trước cách đây
mục cha
commit
fdfa5c0bc7
2 tập tin đã thay đổi với 5 bổ sung5 xóa
  1. 2 2
      Userland/Shell/Parser.cpp
  2. 3 3
      Userland/Shell/Parser.h

+ 2 - 2
Userland/Shell/Parser.cpp

@@ -2037,7 +2037,7 @@ bool Parser::parse_heredoc_entries()
             // until we find a line that contains the key
             auto end_condition = move(m_end_condition);
             found_key = false;
-            set_end_condition([this, end = record.end, &found_key] {
+            set_end_condition(make<Function<bool()>>([this, end = record.end, &found_key] {
                 if (found_key)
                     return true;
                 auto offset = current_position();
@@ -2060,7 +2060,7 @@ bool Parser::parse_heredoc_entries()
                 }
                 restore_to(offset.offset, offset.line);
                 return false;
-            });
+            }));
 
             auto expr = parse_doublequoted_string_inner();
             set_end_condition(move(end_condition));

+ 3 - 3
Userland/Shell/Parser.h

@@ -94,10 +94,10 @@ private:
     template<typename A, typename... Args>
     NonnullRefPtr<A> create(Args... args);
 
-    void set_end_condition(Function<bool()> condition) { m_end_condition = move(condition); }
+    void set_end_condition(OwnPtr<Function<bool()>> condition) { m_end_condition = move(condition); }
     bool at_end() const
     {
-        if (m_end_condition && m_end_condition())
+        if (m_end_condition && (*m_end_condition)())
             return true;
         return m_input.length() <= m_offset;
     }
@@ -159,7 +159,7 @@ private:
     Vector<size_t> m_rule_start_offsets;
     Vector<AST::Position::Line> m_rule_start_lines;
 
-    Function<bool()> m_end_condition;
+    OwnPtr<Function<bool()>> m_end_condition;
     Vector<HeredocInitiationRecord> m_heredoc_initiations;
     Vector<char> m_extra_chars_not_allowed_in_barewords;
     bool m_is_in_brace_expansion_spec { false };