xref: /llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp (revision 77374d3b53cee7829ba70b13abf33e0d63d9d256)
1*77374d3bSMed Ismail Bennani //===-- ScriptedPythonInterface.cpp ---------------------------------------===//
2*77374d3bSMed Ismail Bennani //
3*77374d3bSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*77374d3bSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
5*77374d3bSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*77374d3bSMed Ismail Bennani //
7*77374d3bSMed Ismail Bennani //===----------------------------------------------------------------------===//
8*77374d3bSMed Ismail Bennani 
9*77374d3bSMed Ismail Bennani #include "lldb/Host/Config.h"
10*77374d3bSMed Ismail Bennani #include "lldb/Utility/Log.h"
11*77374d3bSMed Ismail Bennani #include "lldb/lldb-enumerations.h"
12*77374d3bSMed Ismail Bennani 
13*77374d3bSMed Ismail Bennani #if LLDB_ENABLE_PYTHON
14*77374d3bSMed Ismail Bennani 
15*77374d3bSMed Ismail Bennani // LLDB Python header must be included first
16*77374d3bSMed Ismail Bennani #include "../lldb-python.h"
17*77374d3bSMed Ismail Bennani 
18*77374d3bSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h"
19*77374d3bSMed Ismail Bennani #include "ScriptedPythonInterface.h"
20*77374d3bSMed Ismail Bennani #include <optional>
21*77374d3bSMed Ismail Bennani 
22*77374d3bSMed Ismail Bennani using namespace lldb;
23*77374d3bSMed Ismail Bennani using namespace lldb_private;
24*77374d3bSMed Ismail Bennani 
25*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ScriptedPythonInterface(
26*77374d3bSMed Ismail Bennani     ScriptInterpreterPythonImpl &interpreter)
27*77374d3bSMed Ismail Bennani     : ScriptedInterface(), m_interpreter(interpreter) {}
28*77374d3bSMed Ismail Bennani 
29*77374d3bSMed Ismail Bennani template <>
30*77374d3bSMed Ismail Bennani StructuredData::ArraySP
31*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<StructuredData::ArraySP>(
32*77374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
33*77374d3bSMed Ismail Bennani   python::PythonList result_list(python::PyRefType::Borrowed, p.get());
34*77374d3bSMed Ismail Bennani   return result_list.CreateStructuredArray();
35*77374d3bSMed Ismail Bennani }
36*77374d3bSMed Ismail Bennani 
37*77374d3bSMed Ismail Bennani template <>
38*77374d3bSMed Ismail Bennani StructuredData::DictionarySP
39*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
40*77374d3bSMed Ismail Bennani     StructuredData::DictionarySP>(python::PythonObject &p, Status &error) {
41*77374d3bSMed Ismail Bennani   python::PythonDictionary result_dict(python::PyRefType::Borrowed, p.get());
42*77374d3bSMed Ismail Bennani   return result_dict.CreateStructuredDictionary();
43*77374d3bSMed Ismail Bennani }
44*77374d3bSMed Ismail Bennani 
45*77374d3bSMed Ismail Bennani template <>
46*77374d3bSMed Ismail Bennani Status ScriptedPythonInterface::ExtractValueFromPythonObject<Status>(
47*77374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
48*77374d3bSMed Ismail Bennani   if (lldb::SBError *sb_error = reinterpret_cast<lldb::SBError *>(
49*77374d3bSMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBError(p.get())))
50*77374d3bSMed Ismail Bennani     return m_interpreter.GetStatusFromSBError(*sb_error);
51*77374d3bSMed Ismail Bennani   else
52*77374d3bSMed Ismail Bennani     error.SetErrorString("Couldn't cast lldb::SBError to lldb::Status.");
53*77374d3bSMed Ismail Bennani 
54*77374d3bSMed Ismail Bennani   return {};
55*77374d3bSMed Ismail Bennani }
56*77374d3bSMed Ismail Bennani 
57*77374d3bSMed Ismail Bennani template <>
58*77374d3bSMed Ismail Bennani lldb::DataExtractorSP
59*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::DataExtractorSP>(
60*77374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
61*77374d3bSMed Ismail Bennani   lldb::SBData *sb_data = reinterpret_cast<lldb::SBData *>(
62*77374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBData(p.get()));
63*77374d3bSMed Ismail Bennani 
64*77374d3bSMed Ismail Bennani   if (!sb_data) {
65*77374d3bSMed Ismail Bennani     error.SetErrorString(
66*77374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBData to lldb::DataExtractorSP.");
67*77374d3bSMed Ismail Bennani     return nullptr;
68*77374d3bSMed Ismail Bennani   }
69*77374d3bSMed Ismail Bennani 
70*77374d3bSMed Ismail Bennani   return m_interpreter.GetDataExtractorFromSBData(*sb_data);
71*77374d3bSMed Ismail Bennani }
72*77374d3bSMed Ismail Bennani 
73*77374d3bSMed Ismail Bennani template <>
74*77374d3bSMed Ismail Bennani lldb::BreakpointSP
75*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::BreakpointSP>(
76*77374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
77*77374d3bSMed Ismail Bennani   lldb::SBBreakpoint *sb_breakpoint = reinterpret_cast<lldb::SBBreakpoint *>(
78*77374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBBreakpoint(p.get()));
79*77374d3bSMed Ismail Bennani 
80*77374d3bSMed Ismail Bennani   if (!sb_breakpoint) {
81*77374d3bSMed Ismail Bennani     error.SetErrorString(
82*77374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBBreakpoint to lldb::BreakpointSP.");
83*77374d3bSMed Ismail Bennani     return nullptr;
84*77374d3bSMed Ismail Bennani   }
85*77374d3bSMed Ismail Bennani 
86*77374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBBreakpoint(*sb_breakpoint);
87*77374d3bSMed Ismail Bennani }
88*77374d3bSMed Ismail Bennani 
89*77374d3bSMed Ismail Bennani template <>
90*77374d3bSMed Ismail Bennani lldb::ProcessAttachInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
91*77374d3bSMed Ismail Bennani     lldb::ProcessAttachInfoSP>(python::PythonObject &p, Status &error) {
92*77374d3bSMed Ismail Bennani   lldb::SBAttachInfo *sb_attach_info = reinterpret_cast<lldb::SBAttachInfo *>(
93*77374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBAttachInfo(p.get()));
94*77374d3bSMed Ismail Bennani 
95*77374d3bSMed Ismail Bennani   if (!sb_attach_info) {
96*77374d3bSMed Ismail Bennani     error.SetErrorString(
97*77374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBAttachInfo to lldb::ProcessAttachInfoSP.");
98*77374d3bSMed Ismail Bennani     return nullptr;
99*77374d3bSMed Ismail Bennani   }
100*77374d3bSMed Ismail Bennani 
101*77374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBAttachInfo(*sb_attach_info);
102*77374d3bSMed Ismail Bennani }
103*77374d3bSMed Ismail Bennani 
104*77374d3bSMed Ismail Bennani template <>
105*77374d3bSMed Ismail Bennani lldb::ProcessLaunchInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
106*77374d3bSMed Ismail Bennani     lldb::ProcessLaunchInfoSP>(python::PythonObject &p, Status &error) {
107*77374d3bSMed Ismail Bennani   lldb::SBLaunchInfo *sb_launch_info = reinterpret_cast<lldb::SBLaunchInfo *>(
108*77374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBLaunchInfo(p.get()));
109*77374d3bSMed Ismail Bennani 
110*77374d3bSMed Ismail Bennani   if (!sb_launch_info) {
111*77374d3bSMed Ismail Bennani     error.SetErrorString(
112*77374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBLaunchInfo to lldb::ProcessLaunchInfoSP.");
113*77374d3bSMed Ismail Bennani     return nullptr;
114*77374d3bSMed Ismail Bennani   }
115*77374d3bSMed Ismail Bennani 
116*77374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBLaunchInfo(*sb_launch_info);
117*77374d3bSMed Ismail Bennani }
118*77374d3bSMed Ismail Bennani 
119*77374d3bSMed Ismail Bennani template <>
120*77374d3bSMed Ismail Bennani std::optional<MemoryRegionInfo>
121*77374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
122*77374d3bSMed Ismail Bennani     std::optional<MemoryRegionInfo>>(python::PythonObject &p, Status &error) {
123*77374d3bSMed Ismail Bennani 
124*77374d3bSMed Ismail Bennani   lldb::SBMemoryRegionInfo *sb_mem_reg_info =
125*77374d3bSMed Ismail Bennani       reinterpret_cast<lldb::SBMemoryRegionInfo *>(
126*77374d3bSMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get()));
127*77374d3bSMed Ismail Bennani 
128*77374d3bSMed Ismail Bennani   if (!sb_mem_reg_info) {
129*77374d3bSMed Ismail Bennani     error.SetErrorString(
130*77374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBMemoryRegionInfo to lldb::MemoryRegionInfoSP.");
131*77374d3bSMed Ismail Bennani     return {};
132*77374d3bSMed Ismail Bennani   }
133*77374d3bSMed Ismail Bennani 
134*77374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBMemoryRegionInfo(*sb_mem_reg_info);
135*77374d3bSMed Ismail Bennani }
136*77374d3bSMed Ismail Bennani 
137*77374d3bSMed Ismail Bennani #endif
138