diff --git a/lldb/examples/python/scripted_process/scripted_process.py b/lldb/examples/python/scripted_process/scripted_process.py index 8b3c16153e286..044aee1338808 100644 --- a/lldb/examples/python/scripted_process/scripted_process.py +++ b/lldb/examples/python/scripted_process/scripted_process.py @@ -160,24 +160,30 @@ def attach(self, attach_info): """ return lldb.SBError() - def resume(self, should_stop=True): + def resume(self): """ Simulate the scripted process resume. - Args: - should_stop (bool): If True, resume will also + Returns: + lldb.SBError: An `lldb.SBError` with error code 0. + """ + return lldb.SBError() + + @abstractmethod + def should_stop(self): + """ Check if the scripted process plugin should produce the stop event. + + Returns: + bool: True if scripted process should broadcast a stop event. + False otherwise. + """ + pass + + def stop(self): + """ Trigger the scripted process stop. Returns: lldb.SBError: An `lldb.SBError` with error code 0. """ - process = self.target.GetProcess() - if not process: - error = lldb.SBError() - error.SetErrorString("Invalid process.") - return error - - process.ForceScriptedState(lldb.eStateRunning); - if (should_stop): - process.ForceScriptedState(lldb.eStateStopped); return lldb.SBError() @abstractmethod diff --git a/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h b/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h index 977a8d923c355..ba4743077e029 100644 --- a/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h +++ b/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h @@ -38,6 +38,10 @@ class ScriptedProcessInterface : virtual public ScriptedInterface { virtual Status Resume() { return Status("ScriptedProcess did not resume"); } + virtual bool ShouldStop() { return true; } + + virtual Status Stop() { return Status("ScriptedProcess did not stop"); } + virtual std::optional GetMemoryRegionContainingAddress(lldb::addr_t address, Status &error) { error.SetErrorString("ScriptedProcess have no memory region."); diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp index e26d5f3a2d7cf..4fd7a46804de6 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp @@ -187,6 +187,8 @@ Status ScriptedProcess::DoResume() { if (resume) { LLDB_LOGF(log, "ScriptedProcess::%s sending resume", __FUNCTION__); + SetPrivateState(eStateRunning); + SetPrivateState(eStateStopped); error = GetInterface().Resume(); } @@ -221,6 +223,19 @@ void ScriptedProcess::DidAttach(ArchSpec &process_arch) { process_arch = GetArchitecture(); } +Status ScriptedProcess::DoStop() { + Log *log = GetLog(LLDBLog::Process); + + if (GetInterface().ShouldStop()) { + SetPrivateState(eStateStopped); + LLDB_LOGF(log, "ScriptedProcess::%s Immediate stop", __FUNCTION__); + return {}; + } + + LLDB_LOGF(log, "ScriptedProcess::%s Delayed stop", __FUNCTION__); + return GetInterface().Stop(); +} + Status ScriptedProcess::DoDestroy() { return Status(); } bool ScriptedProcess::IsAlive() { return GetInterface().IsAlive(); } diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.h b/lldb/source/Plugins/Process/scripted/ScriptedProcess.h index d72c19a19720f..44a514a096d3a 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.h +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.h @@ -94,6 +94,8 @@ class ScriptedProcess : public Process { ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const ScriptedMetadata &scripted_metadata, Status &error); + Status DoStop(); + void Clear(); bool DoUpdateThreadList(ThreadList &old_thread_list, diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h index 33092209b1778..365d499bead86 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h @@ -201,7 +201,6 @@ template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; -template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp index 0c6f30841dfae..cffa3bda3ab03 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp @@ -80,8 +80,21 @@ Status ScriptedProcessPythonInterface::Launch() { } Status ScriptedProcessPythonInterface::Resume() { - // When calling ScriptedProcess.Resume from lldb we should always stop. - return GetStatusFromMethod("resume", /*should_stop=*/true); + return GetStatusFromMethod("resume"); +} + +bool ScriptedProcessPythonInterface::ShouldStop() { + Status error; + StructuredData::ObjectSP obj = Dispatch("is_alive", error); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) + return {}; + + return obj->GetBooleanValue(); +} + +Status ScriptedProcessPythonInterface::Stop() { + return GetStatusFromMethod("stop"); } std::optional diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h index d1fedfe68fd5f..b7b12b93a002b 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h @@ -37,6 +37,10 @@ class ScriptedProcessPythonInterface : public ScriptedProcessInterface, Status Resume() override; + bool ShouldStop() override; + + Status Stop() override; + std::optional GetMemoryRegionContainingAddress(lldb::addr_t address, Status &error) override; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h index 31757a20a9dcb..a015bd106b5c6 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h @@ -113,11 +113,6 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { return {object}; } - python::PythonObject Transform(bool arg) { - // Boolean arguments need to be turned into python objects. - return python::PythonBoolean(arg); - } - python::PythonObject Transform(Status arg) { return python::ToSWIGWrapper(arg); } @@ -146,15 +141,6 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { original_arg = ExtractValueFromPythonObject(transformed_arg, error); } - template <> - void ReverseTransform(bool &original_arg, - python::PythonObject transformed_arg, Status &error) { - python::PythonBoolean boolean_arg = python::PythonBoolean( - python::PyRefType::Borrowed, transformed_arg.get()); - if (boolean_arg.IsValid()) - original_arg = boolean_arg.GetValue(); - } - template auto TransformTuple(const std::tuple &args, std::index_sequence) {