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