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