13925204cSMed Ismail Bennani //===-- ScriptedPythonInterface.cpp ---------------------------------------===//
23925204cSMed Ismail Bennani //
33925204cSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43925204cSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
53925204cSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63925204cSMed Ismail Bennani //
73925204cSMed Ismail Bennani //===----------------------------------------------------------------------===//
83925204cSMed Ismail Bennani
93925204cSMed Ismail Bennani #include "lldb/Host/Config.h"
103925204cSMed Ismail Bennani #include "lldb/Utility/Log.h"
113925204cSMed Ismail Bennani #include "lldb/lldb-enumerations.h"
123925204cSMed Ismail Bennani
133925204cSMed Ismail Bennani #if LLDB_ENABLE_PYTHON
143925204cSMed Ismail Bennani
153925204cSMed Ismail Bennani // LLDB Python header must be included first
163925204cSMed Ismail Bennani #include "lldb-python.h"
173925204cSMed Ismail Bennani
183925204cSMed Ismail Bennani #include "SWIGPythonBridge.h"
193925204cSMed Ismail Bennani #include "ScriptInterpreterPythonImpl.h"
203925204cSMed Ismail Bennani #include "ScriptedPythonInterface.h"
213925204cSMed Ismail Bennani
223925204cSMed Ismail Bennani using namespace lldb;
233925204cSMed Ismail Bennani using namespace lldb_private;
243925204cSMed Ismail Bennani
ScriptedPythonInterface(ScriptInterpreterPythonImpl & interpreter)253925204cSMed Ismail Bennani ScriptedPythonInterface::ScriptedPythonInterface(
263925204cSMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter)
273925204cSMed Ismail Bennani : ScriptedInterface(), m_interpreter(interpreter) {}
283925204cSMed Ismail Bennani
293925204cSMed Ismail Bennani Status
GetStatusFromMethod(llvm::StringRef method_name)303925204cSMed Ismail Bennani ScriptedPythonInterface::GetStatusFromMethod(llvm::StringRef method_name) {
313925204cSMed Ismail Bennani Status error;
323925204cSMed Ismail Bennani Dispatch<Status>(method_name, error);
333925204cSMed Ismail Bennani
343925204cSMed Ismail Bennani return error;
353925204cSMed Ismail Bennani }
363925204cSMed Ismail Bennani
375f6f33daSMed Ismail Bennani template <>
38*70665844SMed Ismail Bennani StructuredData::ArraySP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)39*70665844SMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<StructuredData::ArraySP>(
40*70665844SMed Ismail Bennani python::PythonObject &p, Status &error) {
41*70665844SMed Ismail Bennani python::PythonList result_list(python::PyRefType::Borrowed, p.get());
42*70665844SMed Ismail Bennani return result_list.CreateStructuredArray();
43*70665844SMed Ismail Bennani }
44*70665844SMed Ismail Bennani
45*70665844SMed Ismail Bennani template <>
4659d8dd79SMed Ismail Bennani StructuredData::DictionarySP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)4759d8dd79SMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
4859d8dd79SMed Ismail Bennani StructuredData::DictionarySP>(python::PythonObject &p, Status &error) {
4959d8dd79SMed Ismail Bennani python::PythonDictionary result_dict(python::PyRefType::Borrowed, p.get());
5059d8dd79SMed Ismail Bennani return result_dict.CreateStructuredDictionary();
5159d8dd79SMed Ismail Bennani }
5259d8dd79SMed Ismail Bennani
5359d8dd79SMed Ismail Bennani template <>
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)545f6f33daSMed Ismail Bennani Status ScriptedPythonInterface::ExtractValueFromPythonObject<Status>(
555f6f33daSMed Ismail Bennani python::PythonObject &p, Status &error) {
565f6f33daSMed Ismail Bennani if (lldb::SBError *sb_error = reinterpret_cast<lldb::SBError *>(
575f6f33daSMed Ismail Bennani LLDBSWIGPython_CastPyObjectToSBError(p.get())))
585f6f33daSMed Ismail Bennani error = m_interpreter.GetStatusFromSBError(*sb_error);
595f6f33daSMed Ismail Bennani else
605f6f33daSMed Ismail Bennani error.SetErrorString("Couldn't cast lldb::SBError to lldb::Status.");
615f6f33daSMed Ismail Bennani
625f6f33daSMed Ismail Bennani return error;
635f6f33daSMed Ismail Bennani }
645f6f33daSMed Ismail Bennani
655f6f33daSMed Ismail Bennani template <>
665f6f33daSMed Ismail Bennani lldb::DataExtractorSP
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)675f6f33daSMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<lldb::DataExtractorSP>(
685f6f33daSMed Ismail Bennani python::PythonObject &p, Status &error) {
695f6f33daSMed Ismail Bennani lldb::SBData *sb_data = reinterpret_cast<lldb::SBData *>(
705f6f33daSMed Ismail Bennani LLDBSWIGPython_CastPyObjectToSBData(p.get()));
715f6f33daSMed Ismail Bennani
725f6f33daSMed Ismail Bennani if (!sb_data) {
73a758c9f7SMed Ismail Bennani error.SetErrorString(
74a758c9f7SMed Ismail Bennani "Couldn't cast lldb::SBData to lldb::DataExtractorSP.");
755f6f33daSMed Ismail Bennani return nullptr;
765f6f33daSMed Ismail Bennani }
775f6f33daSMed Ismail Bennani
785f6f33daSMed Ismail Bennani return m_interpreter.GetDataExtractorFromSBData(*sb_data);
795f6f33daSMed Ismail Bennani }
805f6f33daSMed Ismail Bennani
81a758c9f7SMed Ismail Bennani template <>
82a758c9f7SMed Ismail Bennani llvm::Optional<MemoryRegionInfo>
ExtractValueFromPythonObject(python::PythonObject & p,Status & error)83a758c9f7SMed Ismail Bennani ScriptedPythonInterface::ExtractValueFromPythonObject<
84a758c9f7SMed Ismail Bennani llvm::Optional<MemoryRegionInfo>>(python::PythonObject &p, Status &error) {
85a758c9f7SMed Ismail Bennani
86a758c9f7SMed Ismail Bennani lldb::SBMemoryRegionInfo *sb_mem_reg_info =
87a758c9f7SMed Ismail Bennani reinterpret_cast<lldb::SBMemoryRegionInfo *>(
88a758c9f7SMed Ismail Bennani LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get()));
89a758c9f7SMed Ismail Bennani
90a758c9f7SMed Ismail Bennani if (!sb_mem_reg_info) {
91a758c9f7SMed Ismail Bennani error.SetErrorString(
92a758c9f7SMed Ismail Bennani "Couldn't cast lldb::SBMemoryRegionInfo to lldb::MemoryRegionInfoSP.");
93a758c9f7SMed Ismail Bennani return {};
94a758c9f7SMed Ismail Bennani }
95a758c9f7SMed Ismail Bennani
96a758c9f7SMed Ismail Bennani return m_interpreter.GetOpaqueTypeFromSBMemoryRegionInfo(*sb_mem_reg_info);
97a758c9f7SMed Ismail Bennani }
98a758c9f7SMed Ismail Bennani
993925204cSMed Ismail Bennani #endif
100