15f757f3fSDimitry Andric //===-- ScriptedPlatformPythonInterface.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/Utility/Status.h" 125f757f3fSDimitry Andric #include "lldb/lldb-enumerations.h" 135f757f3fSDimitry Andric 145f757f3fSDimitry Andric #if LLDB_ENABLE_PYTHON 155f757f3fSDimitry Andric 165f757f3fSDimitry Andric // LLDB Python header must be included first 175f757f3fSDimitry Andric #include "../lldb-python.h" 185f757f3fSDimitry Andric 195f757f3fSDimitry Andric #include "../SWIGPythonBridge.h" 205f757f3fSDimitry Andric #include "../ScriptInterpreterPythonImpl.h" 215f757f3fSDimitry Andric #include "ScriptedPlatformPythonInterface.h" 225f757f3fSDimitry Andric 23*0fca6ea1SDimitry Andric #include "lldb/Target/ExecutionContext.h" 24*0fca6ea1SDimitry Andric 255f757f3fSDimitry Andric using namespace lldb; 265f757f3fSDimitry Andric using namespace lldb_private; 275f757f3fSDimitry Andric using namespace lldb_private::python; 285f757f3fSDimitry Andric using Locker = ScriptInterpreterPythonImpl::Locker; 295f757f3fSDimitry Andric 305f757f3fSDimitry Andric ScriptedPlatformPythonInterface::ScriptedPlatformPythonInterface( 315f757f3fSDimitry Andric ScriptInterpreterPythonImpl &interpreter) 325f757f3fSDimitry Andric : ScriptedPlatformInterface(), ScriptedPythonInterface(interpreter) {} 335f757f3fSDimitry Andric 345f757f3fSDimitry Andric llvm::Expected<StructuredData::GenericSP> 355f757f3fSDimitry Andric ScriptedPlatformPythonInterface::CreatePluginObject( 365f757f3fSDimitry Andric llvm::StringRef class_name, ExecutionContext &exe_ctx, 375f757f3fSDimitry Andric StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 385f757f3fSDimitry Andric ExecutionContextRefSP exe_ctx_ref_sp = 395f757f3fSDimitry Andric std::make_shared<ExecutionContextRef>(exe_ctx); 405f757f3fSDimitry Andric StructuredDataImpl sd_impl(args_sp); 415f757f3fSDimitry Andric return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, 425f757f3fSDimitry Andric exe_ctx_ref_sp, sd_impl); 435f757f3fSDimitry Andric } 445f757f3fSDimitry Andric 455f757f3fSDimitry Andric StructuredData::DictionarySP ScriptedPlatformPythonInterface::ListProcesses() { 465f757f3fSDimitry Andric Status error; 475f757f3fSDimitry Andric StructuredData::DictionarySP dict_sp = 485f757f3fSDimitry Andric Dispatch<StructuredData::DictionarySP>("list_processes", error); 495f757f3fSDimitry Andric 505f757f3fSDimitry Andric if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 515f757f3fSDimitry Andric return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 525f757f3fSDimitry Andric LLVM_PRETTY_FUNCTION, 535f757f3fSDimitry Andric llvm::Twine("Null or invalid object (" + 545f757f3fSDimitry Andric llvm::Twine(error.AsCString()) + llvm::Twine(").")) 555f757f3fSDimitry Andric .str(), 565f757f3fSDimitry Andric error); 575f757f3fSDimitry Andric } 585f757f3fSDimitry Andric 595f757f3fSDimitry Andric return dict_sp; 605f757f3fSDimitry Andric } 615f757f3fSDimitry Andric 625f757f3fSDimitry Andric StructuredData::DictionarySP 635f757f3fSDimitry Andric ScriptedPlatformPythonInterface::GetProcessInfo(lldb::pid_t pid) { 645f757f3fSDimitry Andric Status error; 655f757f3fSDimitry Andric StructuredData::DictionarySP dict_sp = 665f757f3fSDimitry Andric Dispatch<StructuredData::DictionarySP>("get_process_info", error, pid); 675f757f3fSDimitry Andric 685f757f3fSDimitry Andric if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 695f757f3fSDimitry Andric return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 705f757f3fSDimitry Andric LLVM_PRETTY_FUNCTION, 715f757f3fSDimitry Andric llvm::Twine("Null or invalid object (" + 725f757f3fSDimitry Andric llvm::Twine(error.AsCString()) + llvm::Twine(").")) 735f757f3fSDimitry Andric .str(), 745f757f3fSDimitry Andric error); 755f757f3fSDimitry Andric } 765f757f3fSDimitry Andric 775f757f3fSDimitry Andric return dict_sp; 785f757f3fSDimitry Andric } 795f757f3fSDimitry Andric 805f757f3fSDimitry Andric Status ScriptedPlatformPythonInterface::AttachToProcess( 815f757f3fSDimitry Andric ProcessAttachInfoSP attach_info) { 825f757f3fSDimitry Andric // FIXME: Pass `attach_info` to method call 835f757f3fSDimitry Andric return GetStatusFromMethod("attach_to_process"); 845f757f3fSDimitry Andric } 855f757f3fSDimitry Andric 865f757f3fSDimitry Andric Status ScriptedPlatformPythonInterface::LaunchProcess( 875f757f3fSDimitry Andric ProcessLaunchInfoSP launch_info) { 885f757f3fSDimitry Andric // FIXME: Pass `launch_info` to method call 895f757f3fSDimitry Andric return GetStatusFromMethod("launch_process"); 905f757f3fSDimitry Andric } 915f757f3fSDimitry Andric 925f757f3fSDimitry Andric Status ScriptedPlatformPythonInterface::KillProcess(lldb::pid_t pid) { 935f757f3fSDimitry Andric return GetStatusFromMethod("kill_process", pid); 945f757f3fSDimitry Andric } 955f757f3fSDimitry Andric 965f757f3fSDimitry Andric #endif // LLDB_ENABLE_PYTHON 97