15f757f3fSDimitry Andric //===-- ScriptedPythonInterface.cpp ---------------------------------------===//
25f757f3fSDimitry Andric //
35f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f757f3fSDimitry Andric //
75f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
85f757f3fSDimitry Andric 
95f757f3fSDimitry Andric #include "lldb/Host/Config.h"
105f757f3fSDimitry Andric #include "lldb/Utility/Log.h"
115f757f3fSDimitry Andric #include "lldb/lldb-enumerations.h"
125f757f3fSDimitry Andric 
135f757f3fSDimitry Andric #if LLDB_ENABLE_PYTHON
145f757f3fSDimitry Andric 
155f757f3fSDimitry Andric // LLDB Python header must be included first
165f757f3fSDimitry Andric #include "../lldb-python.h"
175f757f3fSDimitry Andric 
185f757f3fSDimitry Andric #include "../ScriptInterpreterPythonImpl.h"
195f757f3fSDimitry Andric #include "ScriptedPythonInterface.h"
205f757f3fSDimitry Andric #include <optional>
215f757f3fSDimitry Andric 
225f757f3fSDimitry Andric using namespace lldb;
235f757f3fSDimitry Andric using namespace lldb_private;
245f757f3fSDimitry Andric 
255f757f3fSDimitry Andric ScriptedPythonInterface::ScriptedPythonInterface(
265f757f3fSDimitry Andric     ScriptInterpreterPythonImpl &interpreter)
275f757f3fSDimitry Andric     : ScriptedInterface(), m_interpreter(interpreter) {}
285f757f3fSDimitry Andric 
295f757f3fSDimitry Andric template <>
305f757f3fSDimitry Andric StructuredData::ArraySP
315f757f3fSDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<StructuredData::ArraySP>(
325f757f3fSDimitry Andric     python::PythonObject &p, Status &error) {
335f757f3fSDimitry Andric   python::PythonList result_list(python::PyRefType::Borrowed, p.get());
345f757f3fSDimitry Andric   return result_list.CreateStructuredArray();
355f757f3fSDimitry Andric }
365f757f3fSDimitry Andric 
375f757f3fSDimitry Andric template <>
385f757f3fSDimitry Andric StructuredData::DictionarySP
395f757f3fSDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<
405f757f3fSDimitry Andric     StructuredData::DictionarySP>(python::PythonObject &p, Status &error) {
415f757f3fSDimitry Andric   python::PythonDictionary result_dict(python::PyRefType::Borrowed, p.get());
425f757f3fSDimitry Andric   return result_dict.CreateStructuredDictionary();
435f757f3fSDimitry Andric }
445f757f3fSDimitry Andric 
455f757f3fSDimitry Andric template <>
465f757f3fSDimitry Andric Status ScriptedPythonInterface::ExtractValueFromPythonObject<Status>(
475f757f3fSDimitry Andric     python::PythonObject &p, Status &error) {
485f757f3fSDimitry Andric   if (lldb::SBError *sb_error = reinterpret_cast<lldb::SBError *>(
495f757f3fSDimitry Andric           python::LLDBSWIGPython_CastPyObjectToSBError(p.get())))
505f757f3fSDimitry Andric     return m_interpreter.GetStatusFromSBError(*sb_error);
515f757f3fSDimitry Andric   error.SetErrorString("Couldn't cast lldb::SBError to lldb::Status.");
525f757f3fSDimitry Andric 
535f757f3fSDimitry Andric   return {};
545f757f3fSDimitry Andric }
555f757f3fSDimitry Andric 
565f757f3fSDimitry Andric template <>
57*0fca6ea1SDimitry Andric Event *ScriptedPythonInterface::ExtractValueFromPythonObject<Event *>(
58*0fca6ea1SDimitry Andric     python::PythonObject &p, Status &error) {
59*0fca6ea1SDimitry Andric   if (lldb::SBEvent *sb_event = reinterpret_cast<lldb::SBEvent *>(
60*0fca6ea1SDimitry Andric           python::LLDBSWIGPython_CastPyObjectToSBEvent(p.get())))
61*0fca6ea1SDimitry Andric     return m_interpreter.GetOpaqueTypeFromSBEvent(*sb_event);
62*0fca6ea1SDimitry Andric   error.SetErrorString("Couldn't cast lldb::SBEvent to lldb_private::Event.");
63*0fca6ea1SDimitry Andric 
64*0fca6ea1SDimitry Andric   return nullptr;
65*0fca6ea1SDimitry Andric }
66*0fca6ea1SDimitry Andric 
67*0fca6ea1SDimitry Andric template <>
68*0fca6ea1SDimitry Andric lldb::StreamSP
69*0fca6ea1SDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::StreamSP>(
70*0fca6ea1SDimitry Andric     python::PythonObject &p, Status &error) {
71*0fca6ea1SDimitry Andric   if (lldb::SBStream *sb_stream = reinterpret_cast<lldb::SBStream *>(
72*0fca6ea1SDimitry Andric           python::LLDBSWIGPython_CastPyObjectToSBStream(p.get())))
73*0fca6ea1SDimitry Andric     return m_interpreter.GetOpaqueTypeFromSBStream(*sb_stream);
74*0fca6ea1SDimitry Andric   error.SetErrorString("Couldn't cast lldb::SBStream to lldb_private::Stream.");
75*0fca6ea1SDimitry Andric 
76*0fca6ea1SDimitry Andric   return nullptr;
77*0fca6ea1SDimitry Andric }
78*0fca6ea1SDimitry Andric 
79*0fca6ea1SDimitry Andric template <>
805f757f3fSDimitry Andric lldb::DataExtractorSP
815f757f3fSDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::DataExtractorSP>(
825f757f3fSDimitry Andric     python::PythonObject &p, Status &error) {
835f757f3fSDimitry Andric   lldb::SBData *sb_data = reinterpret_cast<lldb::SBData *>(
845f757f3fSDimitry Andric       python::LLDBSWIGPython_CastPyObjectToSBData(p.get()));
855f757f3fSDimitry Andric 
865f757f3fSDimitry Andric   if (!sb_data) {
875f757f3fSDimitry Andric     error.SetErrorString(
885f757f3fSDimitry Andric         "Couldn't cast lldb::SBData to lldb::DataExtractorSP.");
895f757f3fSDimitry Andric     return nullptr;
905f757f3fSDimitry Andric   }
915f757f3fSDimitry Andric 
925f757f3fSDimitry Andric   return m_interpreter.GetDataExtractorFromSBData(*sb_data);
935f757f3fSDimitry Andric }
945f757f3fSDimitry Andric 
955f757f3fSDimitry Andric template <>
965f757f3fSDimitry Andric lldb::BreakpointSP
975f757f3fSDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::BreakpointSP>(
985f757f3fSDimitry Andric     python::PythonObject &p, Status &error) {
995f757f3fSDimitry Andric   lldb::SBBreakpoint *sb_breakpoint = reinterpret_cast<lldb::SBBreakpoint *>(
1005f757f3fSDimitry Andric       python::LLDBSWIGPython_CastPyObjectToSBBreakpoint(p.get()));
1015f757f3fSDimitry Andric 
1025f757f3fSDimitry Andric   if (!sb_breakpoint) {
1035f757f3fSDimitry Andric     error.SetErrorString(
1045f757f3fSDimitry Andric         "Couldn't cast lldb::SBBreakpoint to lldb::BreakpointSP.");
1055f757f3fSDimitry Andric     return nullptr;
1065f757f3fSDimitry Andric   }
1075f757f3fSDimitry Andric 
1085f757f3fSDimitry Andric   return m_interpreter.GetOpaqueTypeFromSBBreakpoint(*sb_breakpoint);
1095f757f3fSDimitry Andric }
1105f757f3fSDimitry Andric 
1115f757f3fSDimitry Andric template <>
1125f757f3fSDimitry Andric lldb::ProcessAttachInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
1135f757f3fSDimitry Andric     lldb::ProcessAttachInfoSP>(python::PythonObject &p, Status &error) {
1145f757f3fSDimitry Andric   lldb::SBAttachInfo *sb_attach_info = reinterpret_cast<lldb::SBAttachInfo *>(
1155f757f3fSDimitry Andric       python::LLDBSWIGPython_CastPyObjectToSBAttachInfo(p.get()));
1165f757f3fSDimitry Andric 
1175f757f3fSDimitry Andric   if (!sb_attach_info) {
1185f757f3fSDimitry Andric     error.SetErrorString(
1195f757f3fSDimitry Andric         "Couldn't cast lldb::SBAttachInfo to lldb::ProcessAttachInfoSP.");
1205f757f3fSDimitry Andric     return nullptr;
1215f757f3fSDimitry Andric   }
1225f757f3fSDimitry Andric 
1235f757f3fSDimitry Andric   return m_interpreter.GetOpaqueTypeFromSBAttachInfo(*sb_attach_info);
1245f757f3fSDimitry Andric }
1255f757f3fSDimitry Andric 
1265f757f3fSDimitry Andric template <>
1275f757f3fSDimitry Andric lldb::ProcessLaunchInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
1285f757f3fSDimitry Andric     lldb::ProcessLaunchInfoSP>(python::PythonObject &p, Status &error) {
1295f757f3fSDimitry Andric   lldb::SBLaunchInfo *sb_launch_info = reinterpret_cast<lldb::SBLaunchInfo *>(
1305f757f3fSDimitry Andric       python::LLDBSWIGPython_CastPyObjectToSBLaunchInfo(p.get()));
1315f757f3fSDimitry Andric 
1325f757f3fSDimitry Andric   if (!sb_launch_info) {
1335f757f3fSDimitry Andric     error.SetErrorString(
1345f757f3fSDimitry Andric         "Couldn't cast lldb::SBLaunchInfo to lldb::ProcessLaunchInfoSP.");
1355f757f3fSDimitry Andric     return nullptr;
1365f757f3fSDimitry Andric   }
1375f757f3fSDimitry Andric 
1385f757f3fSDimitry Andric   return m_interpreter.GetOpaqueTypeFromSBLaunchInfo(*sb_launch_info);
1395f757f3fSDimitry Andric }
1405f757f3fSDimitry Andric 
1415f757f3fSDimitry Andric template <>
1425f757f3fSDimitry Andric std::optional<MemoryRegionInfo>
1435f757f3fSDimitry Andric ScriptedPythonInterface::ExtractValueFromPythonObject<
1445f757f3fSDimitry Andric     std::optional<MemoryRegionInfo>>(python::PythonObject &p, Status &error) {
1455f757f3fSDimitry Andric 
1465f757f3fSDimitry Andric   lldb::SBMemoryRegionInfo *sb_mem_reg_info =
1475f757f3fSDimitry Andric       reinterpret_cast<lldb::SBMemoryRegionInfo *>(
1485f757f3fSDimitry Andric           python::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get()));
1495f757f3fSDimitry Andric 
1505f757f3fSDimitry Andric   if (!sb_mem_reg_info) {
1515f757f3fSDimitry Andric     error.SetErrorString(
1525f757f3fSDimitry Andric         "Couldn't cast lldb::SBMemoryRegionInfo to lldb::MemoryRegionInfoSP.");
1535f757f3fSDimitry Andric     return {};
1545f757f3fSDimitry Andric   }
1555f757f3fSDimitry Andric 
1565f757f3fSDimitry Andric   return m_interpreter.GetOpaqueTypeFromSBMemoryRegionInfo(*sb_mem_reg_info);
1575f757f3fSDimitry Andric }
1585f757f3fSDimitry Andric 
1595f757f3fSDimitry Andric #endif
160