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