diff --git a/lldb/examples/python/scripted_process/scripted_process.py b/lldb/examples/python/scripted_process/scripted_process.py --- a/lldb/examples/python/scripted_process/scripted_process.py +++ b/lldb/examples/python/scripted_process/scripted_process.py @@ -161,30 +161,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 diff --git a/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h b/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h --- a/lldb/include/lldb/Interpreter/ScriptedProcessInterface.h +++ b/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."); diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.h b/lldb/source/Plugins/Process/scripted/ScriptedProcess.h --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.h +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.h @@ -98,8 +98,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, diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp @@ -150,22 +150,15 @@ Status ScriptedProcess::DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) { - /* FIXME: This doesn't reflect how lldb actually launches a process. - In reality, it attaches to debugserver, then resume the process. */ + LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s launching process", __FUNCTION__); + + /* MARK: This doesn't reflect how lldb actually launches a process. + In reality, it attaches to debugserver, then resume the process. + That's not true in all cases. If debugserver is remote, lldb + asks debugserver to launch the process for it. */ Status error = GetInterface().Launch(); - SetPrivateState(eStateRunning); - - if (error.Fail()) - return error; - - // TODO: Fetch next state from stopped event queue then send stop event - // const StateType state = SetThreadStopInfo(response); - // if (state != eStateInvalid) { - // SetPrivateState(state); - SetPrivateState(eStateStopped); - - return {}; + return error; } void ScriptedProcess::DidLaunch() { m_pid = GetInterface().GetProcessID(); } @@ -177,25 +170,9 @@ } Status ScriptedProcess::DoResume() { - Log *log = GetLog(LLDBLog::Process); - // FIXME: Fetch data from thread. - const StateType thread_resume_state = eStateRunning; - LLDB_LOGF(log, "ScriptedProcess::%s thread_resume_state = %s", __FUNCTION__, - StateAsCString(thread_resume_state)); - - bool resume = (thread_resume_state == eStateRunning); - assert(thread_resume_state == eStateRunning && "invalid thread resume state"); + LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s resuming process", __FUNCTION__); - Status error; - if (resume) { - LLDB_LOGF(log, "ScriptedProcess::%s sending resume", __FUNCTION__); - - SetPrivateState(eStateRunning); - SetPrivateState(eStateStopped); - error = GetInterface().Resume(); - } - - return error; + return GetInterface().Resume(); } Status ScriptedProcess::DoAttach(const ProcessAttachInfo &attach_info) { @@ -226,19 +203,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(); } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h +++ b/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 {}; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h +++ b/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; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ b/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 diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h +++ b/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) {