diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h --- a/lldb/include/lldb/Target/Thread.h +++ b/lldb/include/lldb/Target/Thread.h @@ -1244,7 +1244,7 @@ // the stop info was checked against // the stop info override const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread - ///for easy UI/command line access. + /// for easy UI/command line access. lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this ///thread's current register state. lldb::StateType m_state; ///< The state of our process. 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 @@ -329,7 +329,7 @@ } lldb::ThreadSP thread_sp = - std::make_shared(*this, error, val->GetAsGeneric()); + ScriptedThread::Create(*this, error, val->GetAsGeneric()); if (!thread_sp || error.Fail()) return GetInterface().ErrorWithMessage(LLVM_PRETTY_FUNCTION, diff --git a/lldb/source/Plugins/Process/scripted/ScriptedThread.h b/lldb/source/Plugins/Process/scripted/ScriptedThread.h --- a/lldb/source/Plugins/Process/scripted/ScriptedThread.h +++ b/lldb/source/Plugins/Process/scripted/ScriptedThread.h @@ -26,8 +26,14 @@ class ScriptedThread : public lldb_private::Thread { public: - ScriptedThread(ScriptedProcess &process, Status &error, - StructuredData::Generic *script_object = nullptr); + static std::shared_ptr + Create(ScriptedProcess &process, Status &error, + StructuredData::Generic *script_object = nullptr); + + ScriptedThread(ScriptedProcess &process, + lldb::ScriptedThreadInterfaceSP interface_sp, Status &error, + lldb::tid_t tid, + StructuredData::GenericSP script_object_sp = nullptr); ~ScriptedThread() override; @@ -61,8 +67,8 @@ const ScriptedProcess &m_scripted_process; lldb::ScriptedThreadInterfaceSP m_scripted_thread_interface_sp = nullptr; + lldb_private::StructuredData::GenericSP m_script_object_sp = nullptr; std::shared_ptr m_register_info_sp = nullptr; - lldb_private::StructuredData::ObjectSP m_script_object_sp = nullptr; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp --- a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp @@ -28,52 +28,61 @@ lldbassert(GetInterface() && "Invalid Scripted Thread Interface."); } -ScriptedThread::ScriptedThread(ScriptedProcess &process, Status &error, - StructuredData::Generic *script_object) - : Thread(process, LLDB_INVALID_THREAD_ID), m_scripted_process(process), - m_scripted_thread_interface_sp( - m_scripted_process.GetInterface().CreateScriptedThreadInterface()) { +std::shared_ptr +ScriptedThread::Create(ScriptedProcess &process, Status &error, + StructuredData::Generic *script_object) { if (!process.IsValid()) { error.SetErrorString("Invalid scripted process"); - return; + return nullptr; } process.CheckInterpreterAndScriptObject(); - auto scripted_thread_interface = GetInterface(); - if (!scripted_thread_interface) { - error.SetErrorString("Failed to get scripted thread interface."); - return; - } + auto scripted_thread_interface = + process.GetInterface().CreateScriptedThreadInterface(); + if (!scripted_thread_interface) + return process.GetInterface() + .ErrorWithMessage>( + LLVM_PRETTY_FUNCTION, "Failed to create scripted thread interface.", + error); llvm::Optional class_name = process.GetInterface().GetScriptedThreadPluginName(); - if (!class_name || class_name->empty()) { - error.SetErrorString("Failed to get scripted thread class name."); - return; - } + if (!class_name || class_name->empty()) + return process.GetInterface() + .ErrorWithMessage>( + LLVM_PRETTY_FUNCTION, "Failed to get scripted thread class name.", + error); ExecutionContext exe_ctx(process); - - m_script_object_sp = scripted_thread_interface->CreatePluginObject( - class_name->c_str(), exe_ctx, process.m_scripted_process_info.GetArgsSP(), - script_object); - - if (!m_script_object_sp) { - error.SetErrorString("Failed to create script object"); - return; - } - - if (!m_script_object_sp->IsValid()) { - m_script_object_sp = nullptr; - error.SetErrorString("Created script object is invalid"); - return; - } + StructuredData::GenericSP owned_script_object_sp = + scripted_thread_interface->CreatePluginObject( + class_name->c_str(), exe_ctx, + process.m_scripted_process_info.GetArgsSP(), script_object); + + if (!owned_script_object_sp) + return process.GetInterface() + .ErrorWithMessage>( + LLVM_PRETTY_FUNCTION, "Failed to create script object", error); + if (!owned_script_object_sp->IsValid()) + return process.GetInterface() + .ErrorWithMessage>( + LLVM_PRETTY_FUNCTION, "Created script object is invalid", error); lldb::tid_t tid = scripted_thread_interface->GetThreadID(); - SetID(tid); + + return std::make_shared(process, scripted_thread_interface, + error, tid, owned_script_object_sp); } +ScriptedThread::ScriptedThread(ScriptedProcess &process, + ScriptedThreadInterfaceSP interface_sp, + Status &error, lldb::tid_t tid, + StructuredData::GenericSP script_object_sp) + : Thread(process, tid), m_scripted_process(process), + m_scripted_thread_interface_sp(interface_sp), + m_script_object_sp(script_object_sp) {} + ScriptedThread::~ScriptedThread() { DestroyThread(); } const char *ScriptedThread::GetName() {