1*f6aab3d8Srobert //===-- ScriptedPythonInterface.cpp ---------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert
9*f6aab3d8Srobert #include "lldb/Host/Config.h"
10*f6aab3d8Srobert #include "lldb/Utility/Log.h"
11*f6aab3d8Srobert #include "lldb/lldb-enumerations.h"
12*f6aab3d8Srobert
13*f6aab3d8Srobert #if LLDB_ENABLE_PYTHON
14*f6aab3d8Srobert
15*f6aab3d8Srobert // LLDB Python header must be included first
16*f6aab3d8Srobert #include "lldb-python.h"
17*f6aab3d8Srobert
18*f6aab3d8Srobert #include "SWIGPythonBridge.h"
19*f6aab3d8Srobert #include "ScriptInterpreterPythonImpl.h"
20*f6aab3d8Srobert #include "ScriptedPythonInterface.h"
21*f6aab3d8Srobert #include <optional>
22*f6aab3d8Srobert
23*f6aab3d8Srobert using namespace lldb;
24*f6aab3d8Srobert using namespace lldb_private;
25*f6aab3d8Srobert
ScriptedPythonInterface(ScriptInterpreterPythonImpl & interpreter)26*f6aab3d8Srobert ScriptedPythonInterface::ScriptedPythonInterface(
27*f6aab3d8Srobert ScriptInterpreterPythonImpl &interpreter)
28*f6aab3d8Srobert : ScriptedInterface(), m_interpreter(interpreter) {}
29*f6aab3d8Srobert
30*f6aab3d8Srobert template <>
31*f6aab3d8Srobert StructuredData::ArraySP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)32*f6aab3d8Srobert ScriptedPythonInterface::ExtractValueFromPythonObject<StructuredData::ArraySP>(
33*f6aab3d8Srobert python::PythonObject &p, Status &error) {
34*f6aab3d8Srobert python::PythonList result_list(python::PyRefType::Borrowed, p.get());
35*f6aab3d8Srobert return result_list.CreateStructuredArray();
36*f6aab3d8Srobert }
37*f6aab3d8Srobert
38*f6aab3d8Srobert template <>
39*f6aab3d8Srobert StructuredData::DictionarySP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)40*f6aab3d8Srobert ScriptedPythonInterface::ExtractValueFromPythonObject<
41*f6aab3d8Srobert StructuredData::DictionarySP>(python::PythonObject &p, Status &error) {
42*f6aab3d8Srobert python::PythonDictionary result_dict(python::PyRefType::Borrowed, p.get());
43*f6aab3d8Srobert return result_dict.CreateStructuredDictionary();
44*f6aab3d8Srobert }
45*f6aab3d8Srobert
46*f6aab3d8Srobert template <>
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)47*f6aab3d8Srobert Status ScriptedPythonInterface::ExtractValueFromPythonObject<Status>(
48*f6aab3d8Srobert python::PythonObject &p, Status &error) {
49*f6aab3d8Srobert if (lldb::SBError *sb_error = reinterpret_cast<lldb::SBError *>(
50*f6aab3d8Srobert LLDBSWIGPython_CastPyObjectToSBError(p.get())))
51*f6aab3d8Srobert return m_interpreter.GetStatusFromSBError(*sb_error);
52*f6aab3d8Srobert else
53*f6aab3d8Srobert error.SetErrorString("Couldn't cast lldb::SBError to lldb::Status.");
54*f6aab3d8Srobert
55*f6aab3d8Srobert return {};
56*f6aab3d8Srobert }
57*f6aab3d8Srobert
58*f6aab3d8Srobert template <>
59*f6aab3d8Srobert lldb::DataExtractorSP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)60*f6aab3d8Srobert ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::DataExtractorSP>(
61*f6aab3d8Srobert python::PythonObject &p, Status &error) {
62*f6aab3d8Srobert lldb::SBData *sb_data = reinterpret_cast<lldb::SBData *>(
63*f6aab3d8Srobert LLDBSWIGPython_CastPyObjectToSBData(p.get()));
64*f6aab3d8Srobert
65*f6aab3d8Srobert if (!sb_data) {
66*f6aab3d8Srobert error.SetErrorString(
67*f6aab3d8Srobert "Couldn't cast lldb::SBData to lldb::DataExtractorSP.");
68*f6aab3d8Srobert return nullptr;
69*f6aab3d8Srobert }
70*f6aab3d8Srobert
71*f6aab3d8Srobert return m_interpreter.GetDataExtractorFromSBData(*sb_data);
72*f6aab3d8Srobert }
73*f6aab3d8Srobert
74*f6aab3d8Srobert template <>
75*f6aab3d8Srobert std::optional<MemoryRegionInfo>
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)76*f6aab3d8Srobert ScriptedPythonInterface::ExtractValueFromPythonObject<
77*f6aab3d8Srobert std::optional<MemoryRegionInfo>>(python::PythonObject &p, Status &error) {
78*f6aab3d8Srobert
79*f6aab3d8Srobert lldb::SBMemoryRegionInfo *sb_mem_reg_info =
80*f6aab3d8Srobert reinterpret_cast<lldb::SBMemoryRegionInfo *>(
81*f6aab3d8Srobert LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get()));
82*f6aab3d8Srobert
83*f6aab3d8Srobert if (!sb_mem_reg_info) {
84*f6aab3d8Srobert error.SetErrorString(
85*f6aab3d8Srobert "Couldn't cast lldb::SBMemoryRegionInfo to lldb::MemoryRegionInfoSP.");
86*f6aab3d8Srobert return {};
87*f6aab3d8Srobert }
88*f6aab3d8Srobert
89*f6aab3d8Srobert return m_interpreter.GetOpaqueTypeFromSBMemoryRegionInfo(*sb_mem_reg_info);
90*f6aab3d8Srobert }
91*f6aab3d8Srobert
92*f6aab3d8Srobert #endif
93