xref: /llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.cpp (revision 0642cd768b80665585c8500bed2933a3b99123dc)
177374d3bSMed Ismail Bennani //===-- ScriptedPythonInterface.cpp ---------------------------------------===//
277374d3bSMed Ismail Bennani //
377374d3bSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
477374d3bSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
577374d3bSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
677374d3bSMed Ismail Bennani //
777374d3bSMed Ismail Bennani //===----------------------------------------------------------------------===//
877374d3bSMed Ismail Bennani 
977374d3bSMed Ismail Bennani #include "lldb/Host/Config.h"
1077374d3bSMed Ismail Bennani #include "lldb/Utility/Log.h"
1177374d3bSMed Ismail Bennani #include "lldb/lldb-enumerations.h"
1277374d3bSMed Ismail Bennani 
1377374d3bSMed Ismail Bennani #if LLDB_ENABLE_PYTHON
1477374d3bSMed Ismail Bennani 
15e8504cb0SMed Ismail Bennani // LLDB Python header must be included first
16e8504cb0SMed Ismail Bennani #include "../lldb-python.h"
17e8504cb0SMed Ismail Bennani 
1877374d3bSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h"
1977374d3bSMed Ismail Bennani #include "ScriptedPythonInterface.h"
2077374d3bSMed Ismail Bennani #include <optional>
2177374d3bSMed Ismail Bennani 
2277374d3bSMed Ismail Bennani using namespace lldb;
2377374d3bSMed Ismail Bennani using namespace lldb_private;
2477374d3bSMed Ismail Bennani 
2577374d3bSMed Ismail Bennani ScriptedPythonInterface::ScriptedPythonInterface(
2677374d3bSMed Ismail Bennani     ScriptInterpreterPythonImpl &interpreter)
2777374d3bSMed Ismail Bennani     : ScriptedInterface(), m_interpreter(interpreter) {}
2877374d3bSMed Ismail Bennani 
2977374d3bSMed Ismail Bennani template <>
3077374d3bSMed Ismail Bennani StructuredData::ArraySP
3177374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<StructuredData::ArraySP>(
3277374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
3377374d3bSMed Ismail Bennani   python::PythonList result_list(python::PyRefType::Borrowed, p.get());
3477374d3bSMed Ismail Bennani   return result_list.CreateStructuredArray();
3577374d3bSMed Ismail Bennani }
3677374d3bSMed Ismail Bennani 
3777374d3bSMed Ismail Bennani template <>
3877374d3bSMed Ismail Bennani StructuredData::DictionarySP
3977374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
4077374d3bSMed Ismail Bennani     StructuredData::DictionarySP>(python::PythonObject &p, Status &error) {
4177374d3bSMed Ismail Bennani   python::PythonDictionary result_dict(python::PyRefType::Borrowed, p.get());
4277374d3bSMed Ismail Bennani   return result_dict.CreateStructuredDictionary();
4377374d3bSMed Ismail Bennani }
4477374d3bSMed Ismail Bennani 
4577374d3bSMed Ismail Bennani template <>
4677374d3bSMed Ismail Bennani Status ScriptedPythonInterface::ExtractValueFromPythonObject<Status>(
4777374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
4877374d3bSMed Ismail Bennani   if (lldb::SBError *sb_error = reinterpret_cast<lldb::SBError *>(
4977374d3bSMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBError(p.get())))
5077374d3bSMed Ismail Bennani     return m_interpreter.GetStatusFromSBError(*sb_error);
51*0642cd76SAdrian Prantl   error =
52*0642cd76SAdrian Prantl       Status::FromErrorString("Couldn't cast lldb::SBError to lldb::Status.");
5377374d3bSMed Ismail Bennani 
5477374d3bSMed Ismail Bennani   return {};
5577374d3bSMed Ismail Bennani }
5677374d3bSMed Ismail Bennani 
5777374d3bSMed Ismail Bennani template <>
589a9ec228SMed Ismail Bennani Event *ScriptedPythonInterface::ExtractValueFromPythonObject<Event *>(
599a9ec228SMed Ismail Bennani     python::PythonObject &p, Status &error) {
609a9ec228SMed Ismail Bennani   if (lldb::SBEvent *sb_event = reinterpret_cast<lldb::SBEvent *>(
619a9ec228SMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBEvent(p.get())))
629a9ec228SMed Ismail Bennani     return m_interpreter.GetOpaqueTypeFromSBEvent(*sb_event);
63*0642cd76SAdrian Prantl   error = Status::FromErrorString(
64*0642cd76SAdrian Prantl       "Couldn't cast lldb::SBEvent to lldb_private::Event.");
659a9ec228SMed Ismail Bennani 
669a9ec228SMed Ismail Bennani   return nullptr;
679a9ec228SMed Ismail Bennani }
689a9ec228SMed Ismail Bennani 
699a9ec228SMed Ismail Bennani template <>
706cb45aeaSMed Ismail Bennani lldb::StreamSP
716cb45aeaSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::StreamSP>(
729a9ec228SMed Ismail Bennani     python::PythonObject &p, Status &error) {
739a9ec228SMed Ismail Bennani   if (lldb::SBStream *sb_stream = reinterpret_cast<lldb::SBStream *>(
749a9ec228SMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBStream(p.get())))
759a9ec228SMed Ismail Bennani     return m_interpreter.GetOpaqueTypeFromSBStream(*sb_stream);
76*0642cd76SAdrian Prantl   error = Status::FromErrorString(
77*0642cd76SAdrian Prantl       "Couldn't cast lldb::SBStream to lldb_private::Stream.");
789a9ec228SMed Ismail Bennani 
799a9ec228SMed Ismail Bennani   return nullptr;
809a9ec228SMed Ismail Bennani }
819a9ec228SMed Ismail Bennani 
829a9ec228SMed Ismail Bennani template <>
8377374d3bSMed Ismail Bennani lldb::DataExtractorSP
8477374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::DataExtractorSP>(
8577374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
8677374d3bSMed Ismail Bennani   lldb::SBData *sb_data = reinterpret_cast<lldb::SBData *>(
8777374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBData(p.get()));
8877374d3bSMed Ismail Bennani 
8977374d3bSMed Ismail Bennani   if (!sb_data) {
90*0642cd76SAdrian Prantl     error = Status::FromErrorStringWithFormat(
9177374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBData to lldb::DataExtractorSP.");
9277374d3bSMed Ismail Bennani     return nullptr;
9377374d3bSMed Ismail Bennani   }
9477374d3bSMed Ismail Bennani 
9577374d3bSMed Ismail Bennani   return m_interpreter.GetDataExtractorFromSBData(*sb_data);
9677374d3bSMed Ismail Bennani }
9777374d3bSMed Ismail Bennani 
9877374d3bSMed Ismail Bennani template <>
9977374d3bSMed Ismail Bennani lldb::BreakpointSP
10077374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::BreakpointSP>(
10177374d3bSMed Ismail Bennani     python::PythonObject &p, Status &error) {
10277374d3bSMed Ismail Bennani   lldb::SBBreakpoint *sb_breakpoint = reinterpret_cast<lldb::SBBreakpoint *>(
10377374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBBreakpoint(p.get()));
10477374d3bSMed Ismail Bennani 
10577374d3bSMed Ismail Bennani   if (!sb_breakpoint) {
106*0642cd76SAdrian Prantl     error = Status::FromErrorStringWithFormat(
10777374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBBreakpoint to lldb::BreakpointSP.");
10877374d3bSMed Ismail Bennani     return nullptr;
10977374d3bSMed Ismail Bennani   }
11077374d3bSMed Ismail Bennani 
11177374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBBreakpoint(*sb_breakpoint);
11277374d3bSMed Ismail Bennani }
11377374d3bSMed Ismail Bennani 
11477374d3bSMed Ismail Bennani template <>
11577374d3bSMed Ismail Bennani lldb::ProcessAttachInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
11677374d3bSMed Ismail Bennani     lldb::ProcessAttachInfoSP>(python::PythonObject &p, Status &error) {
11777374d3bSMed Ismail Bennani   lldb::SBAttachInfo *sb_attach_info = reinterpret_cast<lldb::SBAttachInfo *>(
11877374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBAttachInfo(p.get()));
11977374d3bSMed Ismail Bennani 
12077374d3bSMed Ismail Bennani   if (!sb_attach_info) {
121*0642cd76SAdrian Prantl     error = Status::FromErrorStringWithFormat(
12277374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBAttachInfo to lldb::ProcessAttachInfoSP.");
12377374d3bSMed Ismail Bennani     return nullptr;
12477374d3bSMed Ismail Bennani   }
12577374d3bSMed Ismail Bennani 
12677374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBAttachInfo(*sb_attach_info);
12777374d3bSMed Ismail Bennani }
12877374d3bSMed Ismail Bennani 
12977374d3bSMed Ismail Bennani template <>
13077374d3bSMed Ismail Bennani lldb::ProcessLaunchInfoSP ScriptedPythonInterface::ExtractValueFromPythonObject<
13177374d3bSMed Ismail Bennani     lldb::ProcessLaunchInfoSP>(python::PythonObject &p, Status &error) {
13277374d3bSMed Ismail Bennani   lldb::SBLaunchInfo *sb_launch_info = reinterpret_cast<lldb::SBLaunchInfo *>(
13377374d3bSMed Ismail Bennani       python::LLDBSWIGPython_CastPyObjectToSBLaunchInfo(p.get()));
13477374d3bSMed Ismail Bennani 
13577374d3bSMed Ismail Bennani   if (!sb_launch_info) {
136*0642cd76SAdrian Prantl     error = Status::FromErrorStringWithFormat(
13777374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBLaunchInfo to lldb::ProcessLaunchInfoSP.");
13877374d3bSMed Ismail Bennani     return nullptr;
13977374d3bSMed Ismail Bennani   }
14077374d3bSMed Ismail Bennani 
14177374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBLaunchInfo(*sb_launch_info);
14277374d3bSMed Ismail Bennani }
14377374d3bSMed Ismail Bennani 
14477374d3bSMed Ismail Bennani template <>
14577374d3bSMed Ismail Bennani std::optional<MemoryRegionInfo>
14677374d3bSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
14777374d3bSMed Ismail Bennani     std::optional<MemoryRegionInfo>>(python::PythonObject &p, Status &error) {
14877374d3bSMed Ismail Bennani 
14977374d3bSMed Ismail Bennani   lldb::SBMemoryRegionInfo *sb_mem_reg_info =
15077374d3bSMed Ismail Bennani       reinterpret_cast<lldb::SBMemoryRegionInfo *>(
15177374d3bSMed Ismail Bennani           python::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get()));
15277374d3bSMed Ismail Bennani 
15377374d3bSMed Ismail Bennani   if (!sb_mem_reg_info) {
154*0642cd76SAdrian Prantl     error = Status::FromErrorStringWithFormat(
15577374d3bSMed Ismail Bennani         "Couldn't cast lldb::SBMemoryRegionInfo to lldb::MemoryRegionInfoSP.");
15677374d3bSMed Ismail Bennani     return {};
15777374d3bSMed Ismail Bennani   }
15877374d3bSMed Ismail Bennani 
15977374d3bSMed Ismail Bennani   return m_interpreter.GetOpaqueTypeFromSBMemoryRegionInfo(*sb_mem_reg_info);
16077374d3bSMed Ismail Bennani }
16177374d3bSMed Ismail Bennani 
16277374d3bSMed Ismail Bennani #endif
163