1//===-- ScriptedPlatformPythonInterface.cpp -------------------------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include "lldb/Host/Config.h" 10#include "lldb/Utility/Log.h" 11#include "lldb/Utility/Status.h" 12#include "lldb/lldb-enumerations.h" 13 14#if LLDB_ENABLE_PYTHON 15 16// LLDB Python header must be included first 17#include "lldb-python.h" 18 19#include "SWIGPythonBridge.h" 20#include "ScriptInterpreterPythonImpl.h" 21#include "ScriptedPlatformPythonInterface.h" 22 23using namespace lldb; 24using namespace lldb_private; 25using namespace lldb_private::python; 26using Locker = ScriptInterpreterPythonImpl::Locker; 27 28ScriptedPlatformPythonInterface::ScriptedPlatformPythonInterface( 29 ScriptInterpreterPythonImpl &interpreter) 30 : ScriptedPlatformInterface(), ScriptedPythonInterface(interpreter) {} 31 32StructuredData::GenericSP ScriptedPlatformPythonInterface::CreatePluginObject( 33 llvm::StringRef class_name, ExecutionContext &exe_ctx, 34 StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 35 if (class_name.empty()) 36 return {}; 37 38 StructuredDataImpl args_impl(args_sp); 39 std::string error_string; 40 41 Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN, 42 Locker::FreeLock); 43 44 lldb::ExecutionContextRefSP exe_ctx_ref_sp = 45 std::make_shared<ExecutionContextRef>(exe_ctx); 46 47 PythonObject ret_val = LLDBSwigPythonCreateScriptedObject( 48 class_name.str().c_str(), m_interpreter.GetDictionaryName(), 49 exe_ctx_ref_sp, args_impl, error_string); 50 51 m_object_instance_sp = 52 StructuredData::GenericSP(new StructuredPythonObject(std::move(ret_val))); 53 54 return m_object_instance_sp; 55} 56 57StructuredData::DictionarySP ScriptedPlatformPythonInterface::ListProcesses() { 58 Status error; 59 StructuredData::DictionarySP dict_sp = 60 Dispatch<StructuredData::DictionarySP>("list_processes", error); 61 62 if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 63 return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 64 LLVM_PRETTY_FUNCTION, 65 llvm::Twine("Null or invalid object (" + 66 llvm::Twine(error.AsCString()) + llvm::Twine(").")) 67 .str(), 68 error); 69 } 70 71 return dict_sp; 72} 73 74StructuredData::DictionarySP 75ScriptedPlatformPythonInterface::GetProcessInfo(lldb::pid_t pid) { 76 Status error; 77 StructuredData::DictionarySP dict_sp = 78 Dispatch<StructuredData::DictionarySP>("get_process_info", error, pid); 79 80 if (!dict_sp || !dict_sp->IsValid() || error.Fail()) { 81 return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>( 82 LLVM_PRETTY_FUNCTION, 83 llvm::Twine("Null or invalid object (" + 84 llvm::Twine(error.AsCString()) + llvm::Twine(").")) 85 .str(), 86 error); 87 } 88 89 return dict_sp; 90} 91 92Status ScriptedPlatformPythonInterface::AttachToProcess( 93 ProcessAttachInfoSP attach_info) { 94 // FIXME: Pass `attach_info` to method call 95 return GetStatusFromMethod("attach_to_process"); 96} 97 98Status ScriptedPlatformPythonInterface::LaunchProcess( 99 ProcessLaunchInfoSP launch_info) { 100 // FIXME: Pass `launch_info` to method call 101 return GetStatusFromMethod("launch_process"); 102} 103 104Status ScriptedPlatformPythonInterface::KillProcess(lldb::pid_t pid) { 105 return GetStatusFromMethod("kill_process", pid); 106} 107 108#endif // LLDB_ENABLE_PYTHON 109