Author: Walter Erquinigo Date: 2024-02-28T11:43:36-05:00 New Revision: cd344a4c20e295d49f8163ec9a0656c1061a6e42
URL: https://github.com/llvm/llvm-project/commit/cd344a4c20e295d49f8163ec9a0656c1061a6e42 DIFF: https://github.com/llvm/llvm-project/commit/cd344a4c20e295d49f8163ec9a0656c1061a6e42.diff LOG: [LLDB] Fix completion of space-only lines in the REPL on Linux (#83203) https://github.com/modularml/mojo/issues/1796 discovered that if you try to complete a space-only line in the REPL on Linux, LLDB crashes. I suspect that editline doesn't behave the same way on linux and on darwin, because I can't replicate this on darwin. Adding a boundary check in the completion code prevents the crash from happening. Added: Modified: lldb/source/Host/common/Editline.cpp lldb/test/API/repl/clang/TestClangREPL.py Removed: ################################################################################ diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp index ce707e530d008b..e66271e8a6ee99 100644 --- a/lldb/source/Host/common/Editline.cpp +++ b/lldb/source/Host/common/Editline.cpp @@ -1029,8 +1029,11 @@ unsigned char Editline::TabCommand(int ch) { case CompletionMode::Normal: { std::string to_add = completion.GetCompletion(); // Terminate the current argument with a quote if it started with a quote. - if (!request.GetParsedLine().empty() && request.GetParsedArg().IsQuoted()) + Args &parsedLine = request.GetParsedLine(); + if (!parsedLine.empty() && request.GetCursorIndex() < parsedLine.size() && + request.GetParsedArg().IsQuoted()) { to_add.push_back(request.GetParsedArg().GetQuoteChar()); + } to_add.push_back(' '); el_deletestr(m_editline, request.GetCursorArgumentPrefix().size()); el_insertstr(m_editline, to_add.c_str()); diff --git a/lldb/test/API/repl/clang/TestClangREPL.py b/lldb/test/API/repl/clang/TestClangREPL.py index 0b67955a7833c6..c37557fb94735d 100644 --- a/lldb/test/API/repl/clang/TestClangREPL.py +++ b/lldb/test/API/repl/clang/TestClangREPL.py @@ -1,7 +1,6 @@ -import lldb from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * from lldbsuite.test.lldbpexpect import PExpectTest +from lldbsuite.test.lldbtest import * class TestCase(PExpectTest): @@ -17,13 +16,7 @@ def expect_repl(self, expr, substrs=[]): self.current_repl_line_number += 1 self.child.expect_exact(str(self.current_repl_line_number) + ">") - # PExpect uses many timeouts internally and doesn't play well - # under ASAN on a loaded machine.. - @skipIfAsan - @skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot - @skipIfEditlineSupportMissing - def test_basic_completion(self): - """Test that we can complete a simple multiline expression""" + def start_repl(self): self.build() self.current_repl_line_number = 1 @@ -41,6 +34,14 @@ def test_basic_completion(self): self.child.send("expression --repl -l c --\n") self.child.expect_exact("1>") + # PExpect uses many timeouts internally and doesn't play well + # under ASAN on a loaded machine.. + @skipIfAsan + @skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot + @skipIfEditlineSupportMissing + def test_basic_completion(self): + """Test that we can complete a simple multiline expression""" + self.start_repl() # Try evaluating a simple expression. self.expect_repl("3 + 3", substrs=["(int) $0 = 6"]) @@ -54,3 +55,16 @@ def test_basic_completion(self): self.expect_repl("$persistent + 10", substrs=["(long) $2 = 17"]) self.quit() + + # PExpect uses many timeouts internally and doesn't play well + # under ASAN on a loaded machine.. + @skipIfAsan + @skipIf(oslist=["linux"], archs=["arm", "aarch64"]) # Randomly fails on buildbot + @skipIfEditlineSupportMissing + def test_completion_with_space_only_line(self): + """Test that we don't crash when completing lines with spaces only""" + self.start_repl() + + self.child.send(" ") + self.child.send("\t") + self.expect_repl("3 + 3", substrs=["(int) $0 = 6"]) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits