aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Target/ThreadPlanPython.cpp
diff options
context:
space:
mode:
authorMed Ismail Bennani <ismail@bennani.ma>2023-10-30 16:52:17 -0700
committerGitHub <noreply@github.com>2023-10-30 16:52:17 -0700
commit4b3cd379cce3f455bf3c8677ca7a5be6e708a4ce (patch)
tree4d1348946d3a079d0c929de12280dd804854aad7 /lldb/source/Target/ThreadPlanPython.cpp
parentc2f642d90d33a4e6c987b52e22eca4221c86c601 (diff)
downloadllvm-4b3cd379cce3f455bf3c8677ca7a5be6e708a4ce.zip
llvm-4b3cd379cce3f455bf3c8677ca7a5be6e708a4ce.tar.gz
llvm-4b3cd379cce3f455bf3c8677ca7a5be6e708a4ce.tar.bz2
[lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan (#70392)
This patch makes ScriptedThreadPlan conforming to the ScriptedInterface & ScriptedPythonInterface facilities by introducing 2 ScriptedThreadPlanInterface & ScriptedThreadPlanPythonInterface classes. This allows us to get rid of every ScriptedThreadPlan-specific SWIG method and re-use the same affordances as other scripting offordances, like Scripted{Process,Thread,Platform} & OperatingSystem. To do so, this adds new transformer methods for `ThreadPlan`, `Stream` & `Event`, to allow the bijection between C++ objects and their python counterparts. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
Diffstat (limited to 'lldb/source/Target/ThreadPlanPython.cpp')
-rw-r--r--lldb/source/Target/ThreadPlanPython.cpp97
1 files changed, 54 insertions, 43 deletions
diff --git a/lldb/source/Target/ThreadPlanPython.cpp b/lldb/source/Target/ThreadPlanPython.cpp
index d6de6b3..48b3e3a 100644
--- a/lldb/source/Target/ThreadPlanPython.cpp
+++ b/lldb/source/Target/ThreadPlanPython.cpp
@@ -32,6 +32,23 @@ ThreadPlanPython::ThreadPlanPython(Thread &thread, const char *class_name,
eVoteNoOpinion, eVoteNoOpinion),
m_class_name(class_name), m_args_data(args_data), m_did_push(false),
m_stop_others(false) {
+ ScriptInterpreter *interpreter = GetScriptInterpreter();
+ if (!interpreter) {
+ SetPlanComplete(false);
+ // FIXME: error handling
+ return;
+ }
+
+ m_interface = interpreter->CreateScriptedThreadPlanInterface();
+ if (!m_interface) {
+ SetPlanComplete(false);
+ // FIXME: error handling
+ // error.SetErrorStringWithFormat(
+ // "ThreadPlanPython::%s () - ERROR: %s", __FUNCTION__,
+ // "Script interpreter couldn't create Scripted Thread Plan Interface");
+ return;
+ }
+
SetIsControllingPlan(true);
SetOkayToDiscard(true);
SetPrivate(false);
@@ -60,13 +77,14 @@ void ThreadPlanPython::DidPush() {
// We set up the script side in DidPush, so that it can push other plans in
// the constructor, and doesn't have to care about the details of DidPush.
m_did_push = true;
- if (!m_class_name.empty()) {
- ScriptInterpreter *script_interp = GetScriptInterpreter();
- if (script_interp) {
- m_implementation_sp = script_interp->CreateScriptedThreadPlan(
- m_class_name.c_str(), m_args_data, m_error_str,
- this->shared_from_this());
- }
+ if (m_interface) {
+ auto obj_or_err = m_interface->CreatePluginObject(
+ m_class_name, this->shared_from_this(), m_args_data);
+ if (!obj_or_err) {
+ m_error_str = llvm::toString(obj_or_err.takeError());
+ SetPlanComplete(false);
+ } else
+ m_implementation_sp = *obj_or_err;
}
}
@@ -77,14 +95,13 @@ bool ThreadPlanPython::ShouldStop(Event *event_ptr) {
bool should_stop = true;
if (m_implementation_sp) {
- ScriptInterpreter *script_interp = GetScriptInterpreter();
- if (script_interp) {
- bool script_error;
- should_stop = script_interp->ScriptedThreadPlanShouldStop(
- m_implementation_sp, event_ptr, script_error);
- if (script_error)
- SetPlanComplete(false);
- }
+ auto should_stop_or_err = m_interface->ShouldStop(event_ptr);
+ if (!should_stop_or_err) {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Thread), should_stop_or_err.takeError(),
+ "Can't call ScriptedThreadPlan::ShouldStop.");
+ SetPlanComplete(false);
+ } else
+ should_stop = *should_stop_or_err;
}
return should_stop;
}
@@ -96,14 +113,13 @@ bool ThreadPlanPython::IsPlanStale() {
bool is_stale = true;
if (m_implementation_sp) {
- ScriptInterpreter *script_interp = GetScriptInterpreter();
- if (script_interp) {
- bool script_error;
- is_stale = script_interp->ScriptedThreadPlanIsStale(m_implementation_sp,
- script_error);
- if (script_error)
- SetPlanComplete(false);
- }
+ auto is_stale_or_err = m_interface->IsStale();
+ if (!is_stale_or_err) {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Thread), is_stale_or_err.takeError(),
+ "Can't call ScriptedThreadPlan::IsStale.");
+ SetPlanComplete(false);
+ } else
+ is_stale = *is_stale_or_err;
}
return is_stale;
}
@@ -115,14 +131,14 @@ bool ThreadPlanPython::DoPlanExplainsStop(Event *event_ptr) {
bool explains_stop = true;
if (m_implementation_sp) {
- ScriptInterpreter *script_interp = GetScriptInterpreter();
- if (script_interp) {
- bool script_error;
- explains_stop = script_interp->ScriptedThreadPlanExplainsStop(
- m_implementation_sp, event_ptr, script_error);
- if (script_error)
- SetPlanComplete(false);
- }
+ auto explains_stop_or_error = m_interface->ExplainsStop(event_ptr);
+ if (!explains_stop_or_error) {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Thread),
+ explains_stop_or_error.takeError(),
+ "Can't call ScriptedThreadPlan::ExplainsStop.");
+ SetPlanComplete(false);
+ } else
+ explains_stop = *explains_stop_or_error;
}
return explains_stop;
}
@@ -150,14 +166,8 @@ lldb::StateType ThreadPlanPython::GetPlanRunState() {
LLDB_LOGF(log, "%s called on Python Thread Plan: %s )", LLVM_PRETTY_FUNCTION,
m_class_name.c_str());
lldb::StateType run_state = eStateRunning;
- if (m_implementation_sp) {
- ScriptInterpreter *script_interp = GetScriptInterpreter();
- if (script_interp) {
- bool script_error;
- run_state = script_interp->ScriptedThreadPlanGetRunState(
- m_implementation_sp, script_error);
- }
- }
+ if (m_implementation_sp)
+ run_state = m_interface->GetRunState();
return run_state;
}
@@ -168,12 +178,13 @@ void ThreadPlanPython::GetDescription(Stream *s, lldb::DescriptionLevel level) {
if (m_implementation_sp) {
ScriptInterpreter *script_interp = GetScriptInterpreter();
if (script_interp) {
- bool script_error;
- bool added_desc = script_interp->ScriptedThreadPlanGetStopDescription(
- m_implementation_sp, s, script_error);
- if (script_error || !added_desc)
+ auto desc_or_err = m_interface->GetStopDescription(s);
+ if (!desc_or_err || !*desc_or_err) {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Thread), desc_or_err.takeError(),
+ "Can't call ScriptedThreadPlan::GetStopDescription.");
s->Printf("Python thread plan implemented by class %s.",
m_class_name.c_str());
+ }
}
return;
}