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