124 lines · cpp
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-exception6//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_PYTHON15 16// clang-format off17// LLDB Python header must be included first18#include "../lldb-python.h"19//clang-format on20 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, nullptr,38 thread_plan_sp, args_sp);39}40 41llvm::Expected<bool>42ScriptedThreadPlanPythonInterface::ExplainsStop(Event *event) {43 Status error;44 StructuredData::ObjectSP obj = Dispatch("explains_stop", error, 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("should_stop", error, 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("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("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 static_cast<uint32_t>(lldb::eStateStepping)));95}96 97llvm::Error98ScriptedThreadPlanPythonInterface::GetStopDescription(lldb::StreamSP &stream) {99 Status error;100 Dispatch("stop_description", error, 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 GetPluginNameStatic(),115 llvm::StringRef("Alter thread stepping logic and stop reason"),116 CreateInstance, eScriptLanguagePython, {ci_usages, api_usages});117}118 119void ScriptedThreadPlanPythonInterface::Terminate() {120 PluginManager::UnregisterPlugin(CreateInstance);121}122 123#endif124