Author: Jim Ingham Date: 2021-07-27T18:58:56-07:00 New Revision: 3c4547692368239fca21ec294a5a406ea5a44889
URL: https://github.com/llvm/llvm-project/commit/3c4547692368239fca21ec294a5a406ea5a44889 DIFF: https://github.com/llvm/llvm-project/commit/3c4547692368239fca21ec294a5a406ea5a44889.diff LOG: Fix a thinko in the parsing of substitutions in CommandObjectRegexCommand. The old code incorrectly calculated the start position for the search for the third (and subsequent) instance of a particular substitution pattern (e.g. %1). I also added a few test cases for this parsing covering this failure. Added: lldb/test/API/commands/command/regex/TestRegexCommand.py lldb/test/API/commands/command/regex/echo_command.py Modified: lldb/source/Commands/CommandObjectRegexCommand.cpp Removed: ################################################################################ diff --git a/lldb/source/Commands/CommandObjectRegexCommand.cpp b/lldb/source/Commands/CommandObjectRegexCommand.cpp index be0f84d8142c5..46295421834a8 100644 --- a/lldb/source/Commands/CommandObjectRegexCommand.cpp +++ b/lldb/source/Commands/CommandObjectRegexCommand.cpp @@ -43,7 +43,7 @@ bool CommandObjectRegexCommand::DoExecute(llvm::StringRef command, percent_var, idx)) != std::string::npos;) { new_command.erase(percent_var_idx, percent_var_len); new_command.insert(percent_var_idx, match_str); - idx += percent_var_idx + match_str.size(); + idx = percent_var_idx + match_str.size(); } } } diff --git a/lldb/test/API/commands/command/regex/TestRegexCommand.py b/lldb/test/API/commands/command/regex/TestRegexCommand.py new file mode 100644 index 0000000000000..5a70dc919f7f8 --- /dev/null +++ b/lldb/test/API/commands/command/regex/TestRegexCommand.py @@ -0,0 +1,31 @@ +""" +This tests some simple examples of parsing regex commands +""" + +import os +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + + +class TestCommandRegexParsing(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + NO_DEBUG_INFO_TESTCASE = True + + def test_sample_rename_this(self): + """Try out some simple regex commands, make sure they parse correctly.""" + self.runCmd("command regex one-substitution 's/(.+)/echo-cmd %1-first %1-second %1-third/'") + self.expect("one-substitution ASTRING", + substrs = ["ASTRING-first", "ASTRING-second", "ASTRING-third"]) + + self.runCmd("command regex two-substitution 's/([^ ]+) ([^ ]+)/echo-cmd %1-first %2-second %1-third %2-fourth/'") + self.expect("two-substitution ASTRING BSTRING", + substrs = ["ASTRING-first", "BSTRING-second", "ASTRING-third", "BSTRING-fourth"]) + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + self.runCmd("command script import " + os.path.join(self.getSourceDir(), "echo_command.py")) + self.runCmd("command script add echo-cmd -f echo_command.echo_command") diff --git a/lldb/test/API/commands/command/regex/echo_command.py b/lldb/test/API/commands/command/regex/echo_command.py new file mode 100644 index 0000000000000..cc2d7ebce2d57 --- /dev/null +++ b/lldb/test/API/commands/command/regex/echo_command.py @@ -0,0 +1,6 @@ +import lldb + +def echo_command(debugger, args, result, dict): + result.Print(args+'\n') + result.SetStatus(lldb.eReturnStatusSuccessFinishResult) + return True _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits