diff options
| author | jimingham <jingham@apple.com> | 2024-07-03 10:39:34 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-03 10:39:34 -0700 |
| commit | 77d131eddb6ca9060c844fae9cb78779fa70c8f0 (patch) | |
| tree | f540d78500a8a832a701db3e25b8a53dc91d0fac /lldb/bindings/python | |
| parent | 94471e6d238acab291b5b652fc18f17c4815cc7d (diff) | |
| download | llvm-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.swig | 22 |
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( |
