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