1*0fca6ea1SDimitry Andric //===-- ScriptedThreadPlanPythonInterface.cpp -----------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric 
9*0fca6ea1SDimitry Andric #include "lldb/Host/Config.h"
10*0fca6ea1SDimitry Andric #include "lldb/Utility/Log.h"
11*0fca6ea1SDimitry Andric #include "lldb/lldb-enumerations.h"
12*0fca6ea1SDimitry Andric 
13*0fca6ea1SDimitry Andric #if LLDB_ENABLE_PYTHON
14*0fca6ea1SDimitry Andric 
15*0fca6ea1SDimitry Andric // LLDB Python header must be included first
16*0fca6ea1SDimitry Andric #include "../lldb-python.h"
17*0fca6ea1SDimitry Andric 
18*0fca6ea1SDimitry Andric #include "../SWIGPythonBridge.h"
19*0fca6ea1SDimitry Andric #include "../ScriptInterpreterPythonImpl.h"
20*0fca6ea1SDimitry Andric #include "ScriptedThreadPlanPythonInterface.h"
21*0fca6ea1SDimitry Andric 
22*0fca6ea1SDimitry Andric using namespace lldb;
23*0fca6ea1SDimitry Andric using namespace lldb_private;
24*0fca6ea1SDimitry Andric using namespace lldb_private::python;
25*0fca6ea1SDimitry Andric 
26*0fca6ea1SDimitry Andric ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface(
27*0fca6ea1SDimitry Andric     ScriptInterpreterPythonImpl &interpreter)
28*0fca6ea1SDimitry Andric     : ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {}
29*0fca6ea1SDimitry Andric 
30*0fca6ea1SDimitry Andric llvm::Expected<StructuredData::GenericSP>
31*0fca6ea1SDimitry Andric ScriptedThreadPlanPythonInterface::CreatePluginObject(
32*0fca6ea1SDimitry Andric     const llvm::StringRef class_name, lldb::ThreadPlanSP thread_plan_sp,
33*0fca6ea1SDimitry Andric     const StructuredDataImpl &args_sp) {
34*0fca6ea1SDimitry Andric   return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr,
35*0fca6ea1SDimitry Andric                                                      thread_plan_sp, args_sp);
36*0fca6ea1SDimitry Andric }
37*0fca6ea1SDimitry Andric 
38*0fca6ea1SDimitry Andric llvm::Expected<bool>
39*0fca6ea1SDimitry Andric ScriptedThreadPlanPythonInterface::ExplainsStop(Event *event) {
40*0fca6ea1SDimitry Andric   Status error;
41*0fca6ea1SDimitry Andric   StructuredData::ObjectSP obj = Dispatch("explains_stop", error, event);
42*0fca6ea1SDimitry Andric 
43*0fca6ea1SDimitry Andric   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
44*0fca6ea1SDimitry Andric                                                     error)) {
45*0fca6ea1SDimitry Andric     if (!obj)
46*0fca6ea1SDimitry Andric       return false;
47*0fca6ea1SDimitry Andric     return error.ToError();
48*0fca6ea1SDimitry Andric   }
49*0fca6ea1SDimitry Andric 
50*0fca6ea1SDimitry Andric   return obj->GetBooleanValue();
51*0fca6ea1SDimitry Andric }
52*0fca6ea1SDimitry Andric 
53*0fca6ea1SDimitry Andric llvm::Expected<bool>
54*0fca6ea1SDimitry Andric ScriptedThreadPlanPythonInterface::ShouldStop(Event *event) {
55*0fca6ea1SDimitry Andric   Status error;
56*0fca6ea1SDimitry Andric   StructuredData::ObjectSP obj = Dispatch("should_stop", error, event);
57*0fca6ea1SDimitry Andric 
58*0fca6ea1SDimitry Andric   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
59*0fca6ea1SDimitry Andric                                                     error)) {
60*0fca6ea1SDimitry Andric     if (!obj)
61*0fca6ea1SDimitry Andric       return false;
62*0fca6ea1SDimitry Andric     return error.ToError();
63*0fca6ea1SDimitry Andric   }
64*0fca6ea1SDimitry Andric 
65*0fca6ea1SDimitry Andric   return obj->GetBooleanValue();
66*0fca6ea1SDimitry Andric }
67*0fca6ea1SDimitry Andric 
68*0fca6ea1SDimitry Andric llvm::Expected<bool> ScriptedThreadPlanPythonInterface::IsStale() {
69*0fca6ea1SDimitry Andric   Status error;
70*0fca6ea1SDimitry Andric   StructuredData::ObjectSP obj = Dispatch("is_stale", error);
71*0fca6ea1SDimitry Andric 
72*0fca6ea1SDimitry Andric   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
73*0fca6ea1SDimitry Andric                                                     error)) {
74*0fca6ea1SDimitry Andric     if (!obj)
75*0fca6ea1SDimitry Andric       return false;
76*0fca6ea1SDimitry Andric     return error.ToError();
77*0fca6ea1SDimitry Andric   }
78*0fca6ea1SDimitry Andric 
79*0fca6ea1SDimitry Andric   return obj->GetBooleanValue();
80*0fca6ea1SDimitry Andric }
81*0fca6ea1SDimitry Andric 
82*0fca6ea1SDimitry Andric lldb::StateType ScriptedThreadPlanPythonInterface::GetRunState() {
83*0fca6ea1SDimitry Andric   Status error;
84*0fca6ea1SDimitry Andric   StructuredData::ObjectSP obj = Dispatch("should_step", error);
85*0fca6ea1SDimitry Andric 
86*0fca6ea1SDimitry Andric   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
87*0fca6ea1SDimitry Andric                                                     error))
88*0fca6ea1SDimitry Andric     return lldb::eStateStepping;
89*0fca6ea1SDimitry Andric 
90*0fca6ea1SDimitry Andric   return static_cast<lldb::StateType>(obj->GetUnsignedIntegerValue(
91*0fca6ea1SDimitry Andric       static_cast<uint32_t>(lldb::eStateStepping)));
92*0fca6ea1SDimitry Andric }
93*0fca6ea1SDimitry Andric 
94*0fca6ea1SDimitry Andric llvm::Error
95*0fca6ea1SDimitry Andric ScriptedThreadPlanPythonInterface::GetStopDescription(lldb::StreamSP &stream) {
96*0fca6ea1SDimitry Andric   Status error;
97*0fca6ea1SDimitry Andric   Dispatch("stop_description", error, stream);
98*0fca6ea1SDimitry Andric 
99*0fca6ea1SDimitry Andric   if (error.Fail())
100*0fca6ea1SDimitry Andric     return error.ToError();
101*0fca6ea1SDimitry Andric 
102*0fca6ea1SDimitry Andric   return llvm::Error::success();
103*0fca6ea1SDimitry Andric }
104*0fca6ea1SDimitry Andric 
105*0fca6ea1SDimitry Andric #endif
106