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