mib updated this revision to Diff 400803.
mib edited the summary of this revision.
mib added a comment.
Rebase and address @labath comments.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D117076/new/
https://reviews.llvm.org/D117076
Files:
lldb/include/lldb/Target/Thread.h
lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
lldb/source/Plugins/Process/scripted/ScriptedThread.h
Index: lldb/source/Plugins/Process/scripted/ScriptedThread.h
===================================================================
--- lldb/source/Plugins/Process/scripted/ScriptedThread.h
+++ lldb/source/Plugins/Process/scripted/ScriptedThread.h
@@ -25,12 +25,18 @@
namespace lldb_private {
class ScriptedThread : public lldb_private::Thread {
+
public:
- ScriptedThread(ScriptedProcess &process, Status &error,
- StructuredData::Generic *script_object = nullptr);
+ ScriptedThread(ScriptedProcess &process,
+ lldb::ScriptedThreadInterfaceSP interface_sp, lldb::tid_t tid,
+ StructuredData::GenericSP script_object_sp = nullptr);
~ScriptedThread() override;
+ static llvm::Expected<std::shared_ptr<ScriptedThread>>
+ Create(ScriptedProcess &process,
+ StructuredData::Generic *script_object = nullptr);
+
lldb::RegisterContextSP GetRegisterContext() override;
lldb::RegisterContextSP
@@ -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<DynamicRegisterInfo> m_register_info_sp = nullptr;
- lldb_private::StructuredData::ObjectSP m_script_object_sp = nullptr;
};
} // namespace lldb_private
Index: lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
===================================================================
--- lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
+++ lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
@@ -28,52 +28,57 @@
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()) {
- if (!process.IsValid()) {
- error.SetErrorString("Invalid scripted process");
- return;
- }
+llvm::Expected<std::shared_ptr<ScriptedThread>>
+ScriptedThread::Create(ScriptedProcess &process,
+ StructuredData::Generic *script_object) {
+ if (!process.IsValid())
+ return llvm::make_error<llvm::StringError>("Invalid scripted process.",
+ llvm::inconvertibleErrorCode());
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 llvm::make_error<llvm::StringError>(
+ "Failed to create scripted thread interface.",
+ llvm::inconvertibleErrorCode());
llvm::Optional<std::string> 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 llvm::make_error<llvm::StringError>(
+ "Failed to get scripted thread class name.",
+ llvm::inconvertibleErrorCode());
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 llvm::make_error<llvm::StringError>(
+ "Failed to create script object.", llvm::inconvertibleErrorCode());
+ if (!owned_script_object_sp->IsValid())
+ return llvm::make_error<llvm::StringError>(
+ "Failed to get scripted thread class name.",
+ llvm::inconvertibleErrorCode());
lldb::tid_t tid = scripted_thread_interface->GetThreadID();
- SetID(tid);
+
+ return std::make_shared<ScriptedThread>(process, scripted_thread_interface,
+ tid, owned_script_object_sp);
}
+ScriptedThread::ScriptedThread(ScriptedProcess &process,
+ ScriptedThreadInterfaceSP interface_sp,
+ 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() {
Index: lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
===================================================================
--- lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
+++ lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
@@ -328,12 +328,17 @@
return true;
}
- lldb::ThreadSP thread_sp =
- std::make_shared<ScriptedThread>(*this, error, val->GetAsGeneric());
+ auto thread_or_error = ScriptedThread::Create(*this, val->GetAsGeneric());
- if (!thread_sp || error.Fail())
- return GetInterface().ErrorWithMessage<bool>(LLVM_PRETTY_FUNCTION,
- error.AsCString(), error);
+ if (!thread_or_error)
+ return GetInterface().ErrorWithMessage<bool>(
+ LLVM_PRETTY_FUNCTION, toString(thread_or_error.takeError()), error);
+
+ ThreadSP thread_sp = thread_or_error.get();
+
+ if (!thread_sp)
+ return GetInterface().ErrorWithMessage<bool>(
+ LLVM_PRETTY_FUNCTION, "Couldn't initialize thread.", error);
RegisterContextSP reg_ctx_sp = thread_sp->GetRegisterContext();
if (!reg_ctx_sp)
Index: lldb/include/lldb/Target/Thread.h
===================================================================
--- lldb/include/lldb/Target/Thread.h
+++ 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.
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits