1//===-- ScriptedThreadPlanPythonInterface.cpp -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Core/PluginManager.h"
10#include "lldb/Host/Config.h"
11#include "lldb/Utility/Log.h"
12#include "lldb/lldb-enumerations.h"
13
14#if LLDB_ENABLE_PYTHON
15
16// clang-format off
17// LLDB Python header must be included first
18#include "../lldb-python.h"
19//clang-format on
20
21#include "../SWIGPythonBridge.h"
22#include "../ScriptInterpreterPythonImpl.h"
23#include "ScriptedThreadPlanPythonInterface.h"
24
25using namespace lldb;
26using namespace lldb_private;
27using namespace lldb_private::python;
28
29ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface(
30 ScriptInterpreterPythonImpl &interpreter)
31 : ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {}
32
33llvm::Expected<StructuredData::GenericSP>
34ScriptedThreadPlanPythonInterface::CreatePluginObject(
35 const llvm::StringRef class_name, lldb::ThreadPlanSP thread_plan_sp,
36 const StructuredDataImpl &args_sp) {
37 return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj: nullptr,
38 args: thread_plan_sp, args: args_sp);
39}
40
41llvm::Expected<bool>
42ScriptedThreadPlanPythonInterface::ExplainsStop(Event *event) {
43 Status error;
44 StructuredData::ObjectSP obj = Dispatch(method_name: "explains_stop", error, args&: event);
45
46 if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
47 error)) {
48 if (!obj)
49 return false;
50 return error.ToError();
51 }
52
53 return obj->GetBooleanValue();
54}
55
56llvm::Expected<bool>
57ScriptedThreadPlanPythonInterface::ShouldStop(Event *event) {
58 Status error;
59 StructuredData::ObjectSP obj = Dispatch(method_name: "should_stop", error, args&: event);
60
61 if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
62 error)) {
63 if (!obj)
64 return false;
65 return error.ToError();
66 }
67
68 return obj->GetBooleanValue();
69}
70
71llvm::Expected<bool> ScriptedThreadPlanPythonInterface::IsStale() {
72 Status error;
73 StructuredData::ObjectSP obj = Dispatch(method_name: "is_stale", error);
74
75 if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
76 error)) {
77 if (!obj)
78 return false;
79 return error.ToError();
80 }
81
82 return obj->GetBooleanValue();
83}
84
85lldb::StateType ScriptedThreadPlanPythonInterface::GetRunState() {
86 Status error;
87 StructuredData::ObjectSP obj = Dispatch(method_name: "should_step", error);
88
89 if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
90 error))
91 return lldb::eStateStepping;
92
93 return static_cast<lldb::StateType>(obj->GetUnsignedIntegerValue(
94 fail_value: static_cast<uint32_t>(lldb::eStateStepping)));
95}
96
97llvm::Error
98ScriptedThreadPlanPythonInterface::GetStopDescription(lldb::StreamSP &stream) {
99 Status error;
100 Dispatch(method_name: "stop_description", error, args&: stream);
101
102 if (error.Fail())
103 return error.ToError();
104
105 return llvm::Error::success();
106}
107
108void ScriptedThreadPlanPythonInterface::Initialize() {
109 const std::vector<llvm::StringRef> ci_usages = {
110 "thread step-scripted -C <script-name> [-k key -v value ...]"};
111 const std::vector<llvm::StringRef> api_usages = {
112 "SBThread.StepUsingScriptedThreadPlan"};
113 PluginManager::RegisterPlugin(
114 name: GetPluginNameStatic(),
115 description: llvm::StringRef("Alter thread stepping logic and stop reason"),
116 create_callback: CreateInstance, language: eScriptLanguagePython, usages: {ci_usages, api_usages});
117}
118
119void ScriptedThreadPlanPythonInterface::Terminate() {
120 PluginManager::UnregisterPlugin(create_callback: CreateInstance);
121}
122
123#endif
124

source code of lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp