aboutsummaryrefslogtreecommitdiff
path: root/lldb/bindings/python
diff options
context:
space:
mode:
authorjimingham <jingham@apple.com>2024-07-03 10:39:34 -0700
committerGitHub <noreply@github.com>2024-07-03 10:39:34 -0700
commit77d131eddb6ca9060c844fae9cb78779fa70c8f0 (patch)
treef540d78500a8a832a701db3e25b8a53dc91d0fac /lldb/bindings/python
parent94471e6d238acab291b5b652fc18f17c4815cc7d (diff)
downloadllvm-77d131eddb6ca9060c844fae9cb78779fa70c8f0.tar.gz
llvm-77d131eddb6ca9060c844fae9cb78779fa70c8f0.tar.bz2
llvm-77d131eddb6ca9060c844fae9cb78779fa70c8f0.zip
Add the ability for Script based commands to specify their "repeat command" (#94823)
Among other things, returning an empty string as the repeat command disables auto-repeat, which can be useful for state-changing commands. There's one remaining refinement to this setup, which is that for parsed script commands, it should be possible to change an option value, or add a new option value that wasn't originally specified, then ask lldb "make this back into a command string". That would make doing fancy things with repeat commands easier. That capability isn't present in the lldb_private side either, however. So that's for a next iteration. I haven't added this to the docs on adding commands yet. I wanted to make sure this was an acceptable approach before I spend the time to do that.
Diffstat (limited to 'lldb/bindings/python')
-rw-r--r--lldb/bindings/python/python-wrapper.swig22
1 files changed, 22 insertions, 0 deletions
diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig
index 7915f7c4b207..8f050643fa68 100644
--- a/lldb/bindings/python/python-wrapper.swig
+++ b/lldb/bindings/python/python-wrapper.swig
@@ -728,6 +728,28 @@ bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommandObject(
return true;
}
+std::optional<std::string>
+lldb_private::python::SWIGBridge::LLDBSwigPythonGetRepeatCommandForScriptedCommand(PyObject *implementor,
+ std::string &command) {
+ PyErr_Cleaner py_err_cleaner(true);
+
+ PythonObject self(PyRefType::Borrowed, implementor);
+ auto pfunc = self.ResolveName<PythonCallable>("get_repeat_command");
+ // If not implemented, repeat the exact command.
+ if (!pfunc.IsAllocated())
+ return std::nullopt;
+
+ PythonString command_str(command);
+ PythonObject result = pfunc(command_str);
+
+ // A return of None is the equivalent of nullopt - means repeat
+ // the command as is:
+ if (result.IsNone())
+ return std::nullopt;
+
+ return result.Str().GetString().str();
+}
+
#include "lldb/Interpreter/CommandReturnObject.h"
bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallParsedCommandObject(