Index: lldb/examples/python/scripted_process/scripted_process.py =================================================================== --- lldb/examples/python/scripted_process/scripted_process.py +++ lldb/examples/python/scripted_process/scripted_process.py @@ -160,30 +160,25 @@ """ return lldb.SBError() - def resume(self): + def resume(self, should_stop=True): """ Simulate the scripted process resume. - 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. + Args: + should_stop (bool): If True, resume will also force the process + state to stopped after running it. 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 Index: lldb/include/lldb/Interpreter/ScriptedProcessInterface.h =================================================================== --- lldb/include/lldb/Interpreter/ScriptedProcessInterface.h +++ lldb/include/lldb/Interpreter/ScriptedProcessInterface.h @@ -38,10 +38,6 @@ 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."); Index: lldb/source/Plugins/Process/scripted/ScriptedProcess.h =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedProcess.h +++ lldb/source/Plugins/Process/scripted/ScriptedProcess.h @@ -96,8 +96,6 @@ 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, Index: lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp =================================================================== --- lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp +++ lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp @@ -187,8 +187,6 @@ if (resume) { LLDB_LOGF(log, "ScriptedProcess::%s sending resume", __FUNCTION__); - SetPrivateState(eStateRunning); - SetPrivateState(eStateStopped); error = GetInterface().Resume(); } @@ -223,19 +221,6 @@ 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(); } Index: lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h +++ lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h @@ -201,6 +201,7 @@ template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; +template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; template <> struct PythonFormat : PassthroughFormat {}; Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h @@ -37,10 +37,6 @@ Status Resume() override; - bool ShouldStop() override; - - Status Stop() override; - std::optional GetMemoryRegionContainingAddress(lldb::addr_t address, Status &error) override; Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp @@ -81,21 +81,8 @@ } Status ScriptedProcessPythonInterface::Resume() { - 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"); + // When calling ScriptedProcess.Resume from lldb we should always stop. + return GetStatusFromMethod("resume", /*should_stop=*/true); } std::optional Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h @@ -113,6 +113,11 @@ 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); } @@ -141,6 +146,19 @@ 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(); + else + error.SetErrorString( + llvm::formatv("{}: Invalid boolean argument.", LLVM_PRETTY_FUNCTION) + .str()); + } + template auto TransformTuple(const std::tuple &args, std::index_sequence) {