[Lldb-commits] [lldb] 36eab46 - [lldb/Interpreter] Add `interpreter.repeat-previous-command` setting
Med Ismail Bennani via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 5 10:33:48 PST 2021
Author: Med Ismail Bennani
Date: 2021-03-05T19:33:32+01:00
New Revision: 36eab4634f4cd4594e6d1409a66bc8f2d8fda04f
URL: https://github.com/llvm/llvm-project/commit/36eab4634f4cd4594e6d1409a66bc8f2d8fda04f
DIFF: https://github.com/llvm/llvm-project/commit/36eab4634f4cd4594e6d1409a66bc8f2d8fda04f.diff
LOG: [lldb/Interpreter] Add `interpreter.repeat-previous-command` setting
This patch introduces a new interpreter setting to prevent LLDB from
re-executing the previous command when passing an empty command.
This can be very useful when performing actions that requires a long
time to complete.
To preserve the original behaviour, the setting defaults to `true`.
rdar://74983516
Differential Revision: https://reviews.llvm.org/D97999
Signed-off-by: Med Ismail Bennani <medismail.bennani at gmail.com>
Added:
Modified:
lldb/include/lldb/Interpreter/CommandInterpreter.h
lldb/source/Interpreter/CommandInterpreter.cpp
lldb/source/Interpreter/InterpreterProperties.td
lldb/test/API/commands/settings/TestSettings.py
Removed:
################################################################################
diff --git a/lldb/include/lldb/Interpreter/CommandInterpreter.h b/lldb/include/lldb/Interpreter/CommandInterpreter.h
index 7f897bf20185..5b5f145b7e25 100644
--- a/lldb/include/lldb/Interpreter/CommandInterpreter.h
+++ b/lldb/include/lldb/Interpreter/CommandInterpreter.h
@@ -504,6 +504,8 @@ class CommandInterpreter : public Broadcaster,
bool GetEchoCommentCommands() const;
void SetEchoCommentCommands(bool enable);
+ bool GetRepeatPreviousCommand() const;
+
const CommandObject::CommandMap &GetUserCommands() const {
return m_user_dict;
}
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index b0ff634f0365..eeef14bf36c2 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -223,6 +223,12 @@ bool CommandInterpreter::GetSpaceReplPrompts() const {
nullptr, idx, g_interpreter_properties[idx].default_uint_value != 0);
}
+bool CommandInterpreter::GetRepeatPreviousCommand() const {
+ const uint32_t idx = ePropertyRepeatPreviousCommand;
+ return m_collection_sp->GetPropertyAtIndexAsBoolean(
+ nullptr, idx, g_interpreter_properties[idx].default_uint_value != 0);
+}
+
void CommandInterpreter::Initialize() {
LLDB_SCOPED_TIMER();
@@ -1695,6 +1701,11 @@ bool CommandInterpreter::HandleCommand(const char *command_line,
}
if (empty_command) {
+ if (!GetRepeatPreviousCommand()) {
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
+ return true;
+ }
+
if (m_command_history.IsEmpty()) {
result.AppendError("empty command");
result.SetStatus(eReturnStatusFailed);
diff --git a/lldb/source/Interpreter/InterpreterProperties.td b/lldb/source/Interpreter/InterpreterProperties.td
index e5346d14a6e1..1148c1b01def 100644
--- a/lldb/source/Interpreter/InterpreterProperties.td
+++ b/lldb/source/Interpreter/InterpreterProperties.td
@@ -29,4 +29,8 @@ let Definition = "interpreter" in {
Global,
DefaultTrue,
Desc<"If true, commands will be echoed even if they are pure comment lines.">;
+ def RepeatPreviousCommand: Property<"repeat-previous-command", "Boolean">,
+ Global,
+ DefaultTrue,
+ Desc<"If true, LLDB will repeat the previous command if no command was passed to the interpreter. If false, LLDB won't repeat the previous command but only return a new prompt.">;
}
diff --git a/lldb/test/API/commands/settings/TestSettings.py b/lldb/test/API/commands/settings/TestSettings.py
index c3cfdabe75de..7eab23a195bb 100644
--- a/lldb/test/API/commands/settings/TestSettings.py
+++ b/lldb/test/API/commands/settings/TestSettings.py
@@ -25,6 +25,42 @@ def test_apropos_should_also_search_settings_description(self):
"environment variables",
"executable's environment"])
+ def test_set_interpreter_repeat_prev_command(self):
+ """Test the `interpreter.repeat-previous-command` setting."""
+ self.build()
+
+ exe = self.getBuildArtifact("a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+ setting = "interpreter.repeat-previous-command"
+
+ def cleanup(setting):
+ self.runCmd(
+ "settings clear %s" %
+ setting, check=False)
+
+ # Execute the cleanup function during test case tear down.
+ self.addTearDownHook(cleanup(setting))
+
+ # First, check for the setting default value.
+ self.expect("setting show %s" % setting,
+ substrs=["interpreter.repeat-previous-command (boolean) = true"])
+
+ # Then, invert the setting, and check that was set correctly
+ self.runCmd("setting set %s false" % setting)
+ self.expect("setting show %s" % setting,
+ substrs=["interpreter.repeat-previous-command (boolean) = false"])
+
+
+ ci = self.dbg.GetCommandInterpreter()
+ self.assertTrue(ci.IsValid(), "Invalid command interpreter.")
+ # Now, test the functionnality
+ res = lldb.SBCommandReturnObject()
+ ci.HandleCommand('breakpoint set -n main', res)
+ self.assertTrue(res.Succeeded(), "Command failed.")
+ ci.HandleCommand('', res)
+ self.assertTrue(res.Succeeded(), "Empty command failed.")
+ self.assertEqual(self.dbg.GetSelectedTarget().GetNumBreakpoints(), 1)
+
def test_append_target_env_vars(self):
"""Test that 'append target.run-args' works."""
# Append the env-vars.
More information about the lldb-commits
mailing list