12c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===//
22c1f46dcSZachary Turner //
32c1f46dcSZachary Turner //                     The LLVM Compiler Infrastructure
42c1f46dcSZachary Turner //
52c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source
62c1f46dcSZachary Turner // License. See LICENSE.TXT for details.
72c1f46dcSZachary Turner //
82c1f46dcSZachary Turner //===----------------------------------------------------------------------===//
92c1f46dcSZachary Turner 
102c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
112c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
122c1f46dcSZachary Turner 
13d68983e3SPavel Labath #ifdef LLDB_DISABLE_PYTHON
14d68983e3SPavel Labath 
15d68983e3SPavel Labath // Python is disabled in this build
16d68983e3SPavel Labath 
17d68983e3SPavel Labath #else
18d68983e3SPavel Labath 
19edb35d95SEugene Zelenko // C Includes
20edb35d95SEugene Zelenko // C++ Includes
21edb35d95SEugene Zelenko #include <memory>
22edb35d95SEugene Zelenko #include <string>
23edb35d95SEugene Zelenko #include <vector>
24edb35d95SEugene Zelenko 
25edb35d95SEugene Zelenko // Other libraries and framework includes
26edb35d95SEugene Zelenko // Project includes
272c1f46dcSZachary Turner #include "PythonDataObjects.h"
28f7e07256SJim Ingham #include "lldb/Breakpoint/BreakpointOptions.h"
292c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h"
302c1f46dcSZachary Turner #include "lldb/Host/Terminal.h"
31b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h"
32b9c1b51eSKate Stone #include "lldb/lldb-private.h"
332c1f46dcSZachary Turner 
342c1f46dcSZachary Turner class IOHandlerPythonInterpreter;
352c1f46dcSZachary Turner 
362c1f46dcSZachary Turner namespace lldb_private {
372c1f46dcSZachary Turner 
38b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter,
39b9c1b51eSKate Stone                                 public IOHandlerDelegateMultiline {
402c1f46dcSZachary Turner public:
41f7e07256SJim Ingham   class CommandDataPython : public BreakpointOptions::CommandData {
42f7e07256SJim Ingham   public:
43f7e07256SJim Ingham     CommandDataPython() : BreakpointOptions::CommandData() {
44f7e07256SJim Ingham       interpreter = lldb::eScriptLanguagePython;
45f7e07256SJim Ingham     }
46f7e07256SJim Ingham   };
47f7e07256SJim Ingham 
48c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3
49c5b41d67SZachary Turner   typedef PyObject *(*SWIGInitCallback)(void);
50c5b41d67SZachary Turner #else
512c1f46dcSZachary Turner   typedef void (*SWIGInitCallback)(void);
52c5b41d67SZachary Turner #endif
532c1f46dcSZachary Turner 
54b9c1b51eSKate Stone   typedef bool (*SWIGBreakpointCallbackFunction)(
55b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
562c1f46dcSZachary Turner       const lldb::StackFrameSP &frame_sp,
572c1f46dcSZachary Turner       const lldb::BreakpointLocationSP &bp_loc_sp);
582c1f46dcSZachary Turner 
59b9c1b51eSKate Stone   typedef bool (*SWIGWatchpointCallbackFunction)(
60b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
61b9c1b51eSKate Stone       const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp);
622c1f46dcSZachary Turner 
63b9c1b51eSKate Stone   typedef bool (*SWIGPythonTypeScriptCallbackFunction)(
64b9c1b51eSKate Stone       const char *python_function_name, void *session_dictionary,
65b9c1b51eSKate Stone       const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper,
66b9c1b51eSKate Stone       const lldb::TypeSummaryOptionsSP &options, std::string &retval);
672c1f46dcSZachary Turner 
68b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateSyntheticProvider)(
69b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
702c1f46dcSZachary Turner       const lldb::ValueObjectSP &valobj_sp);
712c1f46dcSZachary Turner 
72b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateCommandObject)(
73b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
742c1f46dcSZachary Turner       const lldb::DebuggerSP debugger_sp);
752c1f46dcSZachary Turner 
76b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateScriptedThreadPlan)(
77b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
782c1f46dcSZachary Turner       const lldb::ThreadPlanSP &thread_plan_sp);
792c1f46dcSZachary Turner 
80b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallThreadPlan)(void *implementor,
81b9c1b51eSKate Stone                                            const char *method_name,
82b9c1b51eSKate Stone                                            Event *event_sp, bool &got_error);
832c1f46dcSZachary Turner 
84*3815e702SJim Ingham   typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)(
85*3815e702SJim Ingham       const char *python_class_name, const char *session_dictionary_name,
86*3815e702SJim Ingham       lldb_private::StructuredDataImpl *args_impl,
87*3815e702SJim Ingham       lldb::BreakpointSP &bkpt_sp);
88*3815e702SJim Ingham 
89*3815e702SJim Ingham   typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor,
90*3815e702SJim Ingham                                           const char *method_name,
91*3815e702SJim Ingham                                           lldb_private::SymbolContext *sym_ctx);
92*3815e702SJim Ingham 
932c1f46dcSZachary Turner   typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name,
942c1f46dcSZachary Turner                                             const char *session_dictionary_name,
952c1f46dcSZachary Turner                                             const lldb::ProcessSP &process_sp);
962c1f46dcSZachary Turner 
97b9c1b51eSKate Stone   typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor,
98b9c1b51eSKate Stone                                                    uint32_t max);
99edb35d95SEugene Zelenko 
1002c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx);
101edb35d95SEugene Zelenko 
102b9c1b51eSKate Stone   typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor,
103b9c1b51eSKate Stone                                                    const char *child_name);
104edb35d95SEugene Zelenko 
1052c1f46dcSZachary Turner   typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data);
106edb35d95SEugene Zelenko 
107b9c1b51eSKate Stone   typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)(
108b9c1b51eSKate Stone       void *data);
109edb35d95SEugene Zelenko 
1102c1f46dcSZachary Turner   typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data);
111edb35d95SEugene Zelenko 
1122c1f46dcSZachary Turner   typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data);
113edb35d95SEugene Zelenko 
1142c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor);
1152c1f46dcSZachary Turner 
116b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommand)(
117b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
118b9c1b51eSKate Stone       lldb::DebuggerSP &debugger, const char *args,
1192c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1202c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1212c1f46dcSZachary Turner 
122b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommandObject)(
123b9c1b51eSKate Stone       void *implementor, lldb::DebuggerSP &debugger, const char *args,
1242c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1252c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1262c1f46dcSZachary Turner 
1272c1f46dcSZachary Turner   typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name,
1282c1f46dcSZachary Turner                                            const char *session_dictionary_name,
1292c1f46dcSZachary Turner                                            lldb::DebuggerSP &debugger);
1302c1f46dcSZachary Turner 
131b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Process)(
132b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
133b9c1b51eSKate Stone       lldb::ProcessSP &process, std::string &output);
134edb35d95SEugene Zelenko 
135b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Thread)(
136b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
137b9c1b51eSKate Stone       lldb::ThreadSP &thread, std::string &output);
1382c1f46dcSZachary Turner 
139b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Target)(
140b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
141b9c1b51eSKate Stone       lldb::TargetSP &target, std::string &output);
1422c1f46dcSZachary Turner 
143b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Frame)(
144b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
145b9c1b51eSKate Stone       lldb::StackFrameSP &frame, std::string &output);
1462c1f46dcSZachary Turner 
147b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Value)(
148b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
149b9c1b51eSKate Stone       lldb::ValueObjectSP &value, std::string &output);
1502c1f46dcSZachary Turner 
151b9c1b51eSKate Stone   typedef void *(*SWIGPython_GetDynamicSetting)(
152b9c1b51eSKate Stone       void *module, const char *setting, const lldb::TargetSP &target_sp);
1532c1f46dcSZachary Turner 
1542c1f46dcSZachary Turner   friend class ::IOHandlerPythonInterpreter;
1552c1f46dcSZachary Turner 
1562c1f46dcSZachary Turner   ScriptInterpreterPython(CommandInterpreter &interpreter);
1572c1f46dcSZachary Turner 
158280eb8abSPavel Labath   ~ScriptInterpreterPython() override;
1592c1f46dcSZachary Turner 
160b9c1b51eSKate Stone   bool Interrupt() override;
1612c1f46dcSZachary Turner 
162b9c1b51eSKate Stone   bool ExecuteOneLine(
1634d51a902SRaphael Isemann       llvm::StringRef command, CommandReturnObject *result,
1642c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1652c1f46dcSZachary Turner 
166b9c1b51eSKate Stone   void ExecuteInterpreterLoop() override;
1672c1f46dcSZachary Turner 
168b9c1b51eSKate Stone   bool ExecuteOneLineWithReturn(
1694d51a902SRaphael Isemann       llvm::StringRef in_string,
1704d51a902SRaphael Isemann       ScriptInterpreter::ScriptReturnType return_type, void *ret_value,
1712c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1722c1f46dcSZachary Turner 
17397206d57SZachary Turner   lldb_private::Status ExecuteMultipleLines(
174b9c1b51eSKate Stone       const char *in_string,
1752c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1762c1f46dcSZachary Turner 
17797206d57SZachary Turner   Status
1782c1f46dcSZachary Turner   ExportFunctionDefinitionToInterpreter(StringList &function_def) override;
1792c1f46dcSZachary Turner 
180b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(StringList &input, std::string &output,
181b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1822c1f46dcSZachary Turner 
183b9c1b51eSKate Stone   bool GenerateTypeSynthClass(StringList &input, std::string &output,
184b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1852c1f46dcSZachary Turner 
186b9c1b51eSKate Stone   bool GenerateTypeSynthClass(const char *oneliner, std::string &output,
187b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1882c1f46dcSZachary Turner 
1892c1f46dcSZachary Turner   // use this if the function code is just a one-liner script
190b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(const char *oneliner, std::string &output,
191b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1922c1f46dcSZachary Turner 
193b9c1b51eSKate Stone   bool GenerateScriptAliasFunction(StringList &input,
194b9c1b51eSKate Stone                                    std::string &output) override;
1952c1f46dcSZachary Turner 
196b9c1b51eSKate Stone   StructuredData::ObjectSP
197b9c1b51eSKate Stone   CreateSyntheticScriptedProvider(const char *class_name,
198b9c1b51eSKate Stone                                   lldb::ValueObjectSP valobj) override;
1992c1f46dcSZachary Turner 
200b9c1b51eSKate Stone   StructuredData::GenericSP
201b9c1b51eSKate Stone   CreateScriptCommandObject(const char *class_name) override;
2022c1f46dcSZachary Turner 
203b9c1b51eSKate Stone   StructuredData::ObjectSP
204b9c1b51eSKate Stone   CreateScriptedThreadPlan(const char *class_name,
205b9c1b51eSKate Stone                            lldb::ThreadPlanSP thread_plan) override;
2062c1f46dcSZachary Turner 
207b9c1b51eSKate Stone   bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
208b9c1b51eSKate Stone                                       Event *event,
209b9c1b51eSKate Stone                                       bool &script_error) override;
210edb35d95SEugene Zelenko 
211b9c1b51eSKate Stone   bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
212b9c1b51eSKate Stone                                     Event *event, bool &script_error) override;
213edb35d95SEugene Zelenko 
214b9c1b51eSKate Stone   bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
215b9c1b51eSKate Stone                                  bool &script_error) override;
216c915a7d2SJim Ingham 
217b9c1b51eSKate Stone   lldb::StateType
218b9c1b51eSKate Stone   ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
219b9c1b51eSKate Stone                                 bool &script_error) override;
2202c1f46dcSZachary Turner 
221b9c1b51eSKate Stone   StructuredData::GenericSP
222*3815e702SJim Ingham   CreateScriptedBreakpointResolver(const char *class_name,
223*3815e702SJim Ingham                                    StructuredDataImpl *args_data,
224*3815e702SJim Ingham                                    lldb::BreakpointSP &bkpt_sp) override;
225*3815e702SJim Ingham   bool
226*3815e702SJim Ingham   ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP
227*3815e702SJim Ingham                                                implementor_sp,
228*3815e702SJim Ingham                                            SymbolContext *sym_ctx) override;
229*3815e702SJim Ingham 
230*3815e702SJim Ingham   lldb::SearchDepth
231*3815e702SJim Ingham   ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP
232*3815e702SJim Ingham                                             implementor_sp) override;
233*3815e702SJim Ingham 
234*3815e702SJim Ingham   StructuredData::GenericSP
235b9c1b51eSKate Stone   OSPlugin_CreatePluginObject(const char *class_name,
236b9c1b51eSKate Stone                               lldb::ProcessSP process_sp) override;
2372c1f46dcSZachary Turner 
238b9c1b51eSKate Stone   StructuredData::DictionarySP
239b9c1b51eSKate Stone   OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2402c1f46dcSZachary Turner 
241b9c1b51eSKate Stone   StructuredData::ArraySP
242b9c1b51eSKate Stone   OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2432c1f46dcSZachary Turner 
244b9c1b51eSKate Stone   StructuredData::StringSP
245b9c1b51eSKate Stone   OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp,
246b9c1b51eSKate Stone                                lldb::tid_t thread_id) override;
2472c1f46dcSZachary Turner 
248b9c1b51eSKate Stone   StructuredData::DictionarySP
249b9c1b51eSKate Stone   OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp,
250b9c1b51eSKate Stone                         lldb::tid_t tid, lldb::addr_t context) override;
2512c1f46dcSZachary Turner 
252b9c1b51eSKate Stone   StructuredData::ObjectSP
253b9c1b51eSKate Stone   LoadPluginModule(const FileSpec &file_spec,
25497206d57SZachary Turner                    lldb_private::Status &error) override;
2552c1f46dcSZachary Turner 
256b9c1b51eSKate Stone   StructuredData::DictionarySP
257b9c1b51eSKate Stone   GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target,
258b9c1b51eSKate Stone                      const char *setting_name,
25997206d57SZachary Turner                      lldb_private::Status &error) override;
2602c1f46dcSZachary Turner 
261b9c1b51eSKate Stone   size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor,
262b9c1b51eSKate Stone                               uint32_t max) override;
2632c1f46dcSZachary Turner 
264b9c1b51eSKate Stone   lldb::ValueObjectSP
265b9c1b51eSKate Stone   GetChildAtIndex(const StructuredData::ObjectSP &implementor,
266b9c1b51eSKate Stone                   uint32_t idx) override;
2672c1f46dcSZachary Turner 
268b9c1b51eSKate Stone   int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
269b9c1b51eSKate Stone                               const char *child_name) override;
2702c1f46dcSZachary Turner 
271b9c1b51eSKate Stone   bool UpdateSynthProviderInstance(
272b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2732c1f46dcSZachary Turner 
274b9c1b51eSKate Stone   bool MightHaveChildrenSynthProviderInstance(
275b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2762c1f46dcSZachary Turner 
277b9c1b51eSKate Stone   lldb::ValueObjectSP
278b9c1b51eSKate Stone   GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
279b9c1b51eSKate Stone 
280b9c1b51eSKate Stone   ConstString
281b9c1b51eSKate Stone   GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override;
2826eec8d6cSEnrico Granata 
2832c1f46dcSZachary Turner   bool
2844d51a902SRaphael Isemann   RunScriptBasedCommand(const char *impl_function, llvm::StringRef args,
2852c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2862c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
28797206d57SZachary Turner                         Status &error,
2882c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2892c1f46dcSZachary Turner 
2904d51a902SRaphael Isemann   bool RunScriptBasedCommand(
2914d51a902SRaphael Isemann       StructuredData::GenericSP impl_obj_sp, llvm::StringRef args,
2922c1f46dcSZachary Turner       ScriptedCommandSynchronicity synchronicity,
2934d51a902SRaphael Isemann       lldb_private::CommandReturnObject &cmd_retobj, Status &error,
2942c1f46dcSZachary Turner       const lldb_private::ExecutionContext &exe_ctx) override;
2952c1f46dcSZachary Turner 
29697206d57SZachary Turner   Status GenerateFunction(const char *signature,
297b9c1b51eSKate Stone                           const StringList &input) override;
2982c1f46dcSZachary Turner 
29997206d57SZachary Turner   Status GenerateBreakpointCommandCallbackData(StringList &input,
300b9c1b51eSKate Stone                                                std::string &output) override;
3012c1f46dcSZachary Turner 
302b9c1b51eSKate Stone   bool GenerateWatchpointCommandCallbackData(StringList &input,
303b9c1b51eSKate Stone                                              std::string &output) override;
3042c1f46dcSZachary Turner 
3052c1f46dcSZachary Turner   //    static size_t
3062c1f46dcSZachary Turner   //    GenerateBreakpointOptionsCommandCallback (void *baton,
3072c1f46dcSZachary Turner   //                                              InputReader &reader,
308b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
309b9c1b51eSKate Stone   //                                              notification,
3102c1f46dcSZachary Turner   //                                              const char *bytes,
3112c1f46dcSZachary Turner   //                                              size_t bytes_len);
3122c1f46dcSZachary Turner   //
3132c1f46dcSZachary Turner   //    static size_t
3142c1f46dcSZachary Turner   //    GenerateWatchpointOptionsCommandCallback (void *baton,
3152c1f46dcSZachary Turner   //                                              InputReader &reader,
316b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
317b9c1b51eSKate Stone   //                                              notification,
3182c1f46dcSZachary Turner   //                                              const char *bytes,
3192c1f46dcSZachary Turner   //                                              size_t bytes_len);
3202c1f46dcSZachary Turner 
321b9c1b51eSKate Stone   static bool BreakpointCallbackFunction(void *baton,
3222c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3232c1f46dcSZachary Turner                                          lldb::user_id_t break_id,
3242c1f46dcSZachary Turner                                          lldb::user_id_t break_loc_id);
3252c1f46dcSZachary Turner 
326b9c1b51eSKate Stone   static bool WatchpointCallbackFunction(void *baton,
3272c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3282c1f46dcSZachary Turner                                          lldb::user_id_t watch_id);
3292c1f46dcSZachary Turner 
330b9c1b51eSKate Stone   bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj,
331b9c1b51eSKate Stone                           StructuredData::ObjectSP &callee_wrapper_sp,
332b9c1b51eSKate Stone                           const TypeSummaryOptions &options,
333b9c1b51eSKate Stone                           std::string &retval) override;
3342c1f46dcSZachary Turner 
335b9c1b51eSKate Stone   void Clear() override;
3362c1f46dcSZachary Turner 
337b9c1b51eSKate Stone   bool GetDocumentationForItem(const char *item, std::string &dest) override;
3382c1f46dcSZachary Turner 
339b9c1b51eSKate Stone   bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
340b9c1b51eSKate Stone                                     std::string &dest) override;
3412c1f46dcSZachary Turner 
3422c1f46dcSZachary Turner   uint32_t
3432c1f46dcSZachary Turner   GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override;
3442c1f46dcSZachary Turner 
345b9c1b51eSKate Stone   bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
346b9c1b51eSKate Stone                                    std::string &dest) override;
3472c1f46dcSZachary Turner 
348b9c1b51eSKate Stone   bool CheckObjectExists(const char *name) override {
3492c1f46dcSZachary Turner     if (!name || !name[0])
3502c1f46dcSZachary Turner       return false;
3512c1f46dcSZachary Turner     std::string temp;
3522c1f46dcSZachary Turner     return GetDocumentationForItem(name, temp);
3532c1f46dcSZachary Turner   }
3542c1f46dcSZachary Turner 
355b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Process *process,
35697206d57SZachary Turner                               std::string &output, Status &error) override;
357b9c1b51eSKate Stone 
358b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Thread *thread,
35997206d57SZachary Turner                               std::string &output, Status &error) override;
360b9c1b51eSKate Stone 
361b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Target *target,
36297206d57SZachary Turner                               std::string &output, Status &error) override;
363b9c1b51eSKate Stone 
364b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame,
36597206d57SZachary Turner                               std::string &output, Status &error) override;
366b9c1b51eSKate Stone 
367b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value,
36897206d57SZachary Turner                               std::string &output, Status &error) override;
3692c1f46dcSZachary Turner 
3702c1f46dcSZachary Turner   bool
371b9c1b51eSKate Stone   LoadScriptingModule(const char *filename, bool can_reload, bool init_session,
37297206d57SZachary Turner                       lldb_private::Status &error,
3732c1f46dcSZachary Turner                       StructuredData::ObjectSP *module_sp = nullptr) override;
3742c1f46dcSZachary Turner 
375b9c1b51eSKate Stone   bool IsReservedWord(const char *word) override;
3762c1f46dcSZachary Turner 
377b9c1b51eSKate Stone   std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override;
3782c1f46dcSZachary Turner 
379b9c1b51eSKate Stone   void CollectDataForBreakpointCommandCallback(
380b9c1b51eSKate Stone       std::vector<BreakpointOptions *> &bp_options_vec,
3812c1f46dcSZachary Turner       CommandReturnObject &result) override;
3822c1f46dcSZachary Turner 
3832c1f46dcSZachary Turner   void
3842c1f46dcSZachary Turner   CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options,
3852c1f46dcSZachary Turner                                           CommandReturnObject &result) override;
3862c1f46dcSZachary Turner 
3872c1f46dcSZachary Turner   /// Set the callback body text into the callback for the breakpoint.
38897206d57SZachary Turner   Status SetBreakpointCommandCallback(BreakpointOptions *bp_options,
3892c1f46dcSZachary Turner                                       const char *callback_body) override;
3902c1f46dcSZachary Turner 
391b9c1b51eSKate Stone   void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options,
3922c1f46dcSZachary Turner                                             const char *function_name) override;
3932c1f46dcSZachary Turner 
394f7e07256SJim Ingham   /// This one is for deserialization:
39597206d57SZachary Turner   Status SetBreakpointCommandCallback(
396f7e07256SJim Ingham       BreakpointOptions *bp_options,
397f7e07256SJim Ingham       std::unique_ptr<BreakpointOptions::CommandData> &data_up) override;
398f7e07256SJim Ingham 
3992c1f46dcSZachary Turner   /// Set a one-liner as the callback for the watchpoint.
400b9c1b51eSKate Stone   void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
4012c1f46dcSZachary Turner                                     const char *oneliner) override;
4022c1f46dcSZachary Turner 
403b9c1b51eSKate Stone   StringList ReadCommandInputFromUser(FILE *in_file);
4042c1f46dcSZachary Turner 
4052c1f46dcSZachary Turner   void ResetOutputFileHandle(FILE *new_fh) override;
4062c1f46dcSZachary Turner 
407b9c1b51eSKate Stone   static void InitializePrivate();
408ba456807SPavel Labath 
409b9c1b51eSKate Stone   static void InitializeInterpreter(
410b9c1b51eSKate Stone       SWIGInitCallback python_swig_init_callback,
4112c1f46dcSZachary Turner       SWIGBreakpointCallbackFunction swig_breakpoint_callback,
4122c1f46dcSZachary Turner       SWIGWatchpointCallbackFunction swig_watchpoint_callback,
4132c1f46dcSZachary Turner       SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
4142c1f46dcSZachary Turner       SWIGPythonCreateSyntheticProvider swig_synthetic_script,
4152c1f46dcSZachary Turner       SWIGPythonCreateCommandObject swig_create_cmd,
4162c1f46dcSZachary Turner       SWIGPythonCalculateNumChildren swig_calc_children,
4172c1f46dcSZachary Turner       SWIGPythonGetChildAtIndex swig_get_child_index,
4182c1f46dcSZachary Turner       SWIGPythonGetIndexOfChildWithName swig_get_index_child,
4192c1f46dcSZachary Turner       SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue,
4202c1f46dcSZachary Turner       SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
4212c1f46dcSZachary Turner       SWIGPythonUpdateSynthProviderInstance swig_update_provider,
422b9c1b51eSKate Stone       SWIGPythonMightHaveChildrenSynthProviderInstance
423b9c1b51eSKate Stone           swig_mighthavechildren_provider,
4242c1f46dcSZachary Turner       SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
4252c1f46dcSZachary Turner       SWIGPythonCallCommand swig_call_command,
4262c1f46dcSZachary Turner       SWIGPythonCallCommandObject swig_call_command_object,
4272c1f46dcSZachary Turner       SWIGPythonCallModuleInit swig_call_module_init,
4282c1f46dcSZachary Turner       SWIGPythonCreateOSPlugin swig_create_os_plugin,
4292c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
4302c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
4312c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
4322c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
4332c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
4342c1f46dcSZachary Turner       SWIGPython_GetDynamicSetting swig_plugin_get,
4352c1f46dcSZachary Turner       SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
436*3815e702SJim Ingham       SWIGPythonCallThreadPlan swig_call_thread_plan,
437*3815e702SJim Ingham       SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script,
438*3815e702SJim Ingham       SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver);
4392c1f46dcSZachary Turner 
440b9c1b51eSKate Stone   const char *GetDictionaryName() { return m_dictionary_name.c_str(); }
4412c1f46dcSZachary Turner 
442b9c1b51eSKate Stone   PyThreadState *GetThreadState() { return m_command_thread_state; }
4432c1f46dcSZachary Turner 
444b9c1b51eSKate Stone   void SetThreadState(PyThreadState *s) {
4452c1f46dcSZachary Turner     if (s)
4462c1f46dcSZachary Turner       m_command_thread_state = s;
4472c1f46dcSZachary Turner   }
4482c1f46dcSZachary Turner 
4492c1f46dcSZachary Turner   //----------------------------------------------------------------------
4502c1f46dcSZachary Turner   // IOHandlerDelegate
4512c1f46dcSZachary Turner   //----------------------------------------------------------------------
452b9c1b51eSKate Stone   void IOHandlerActivated(IOHandler &io_handler) override;
4532c1f46dcSZachary Turner 
454b9c1b51eSKate Stone   void IOHandlerInputComplete(IOHandler &io_handler,
455b9c1b51eSKate Stone                               std::string &data) override;
4562c1f46dcSZachary Turner 
4572c1f46dcSZachary Turner   //------------------------------------------------------------------
4582c1f46dcSZachary Turner   // Static Functions
4592c1f46dcSZachary Turner   //------------------------------------------------------------------
460b9c1b51eSKate Stone   static void Initialize();
4612c1f46dcSZachary Turner 
462b9c1b51eSKate Stone   static void Terminate();
4632c1f46dcSZachary Turner 
4642c1f46dcSZachary Turner   static lldb::ScriptInterpreterSP
4652c1f46dcSZachary Turner   CreateInstance(CommandInterpreter &interpreter);
4662c1f46dcSZachary Turner 
467b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
4682c1f46dcSZachary Turner 
469b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
4702c1f46dcSZachary Turner 
4712df331b0SPavel Labath   static FileSpec GetPythonDir();
4722df331b0SPavel Labath 
4732c1f46dcSZachary Turner   //------------------------------------------------------------------
4742c1f46dcSZachary Turner   // PluginInterface protocol
4752c1f46dcSZachary Turner   //------------------------------------------------------------------
476b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
4772c1f46dcSZachary Turner 
478b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
4792c1f46dcSZachary Turner 
480b9c1b51eSKate Stone   class Locker : public ScriptInterpreterLocker {
4812c1f46dcSZachary Turner   public:
482b9c1b51eSKate Stone     enum OnEntry {
4832c1f46dcSZachary Turner       AcquireLock = 0x0001,
4842c1f46dcSZachary Turner       InitSession = 0x0002,
4852c1f46dcSZachary Turner       InitGlobals = 0x0004,
4862c1f46dcSZachary Turner       NoSTDIN = 0x0008
4872c1f46dcSZachary Turner     };
4882c1f46dcSZachary Turner 
489b9c1b51eSKate Stone     enum OnLeave {
4902c1f46dcSZachary Turner       FreeLock = 0x0001,
491b9c1b51eSKate Stone       FreeAcquiredLock = 0x0002, // do not free the lock if we already held it
492b9c1b51eSKate Stone                                  // when calling constructor
4932c1f46dcSZachary Turner       TearDownSession = 0x0004
4942c1f46dcSZachary Turner     };
4952c1f46dcSZachary Turner 
496edb35d95SEugene Zelenko     Locker(ScriptInterpreterPython *py_interpreter = nullptr,
4972c1f46dcSZachary Turner            uint16_t on_entry = AcquireLock | InitSession,
498b9c1b51eSKate Stone            uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr,
499b9c1b51eSKate Stone            FILE *out = nullptr, FILE *err = nullptr);
5002c1f46dcSZachary Turner 
501280eb8abSPavel Labath     ~Locker() override;
5022c1f46dcSZachary Turner 
5032c1f46dcSZachary Turner   private:
504b9c1b51eSKate Stone     bool DoAcquireLock();
5052c1f46dcSZachary Turner 
506b9c1b51eSKate Stone     bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
5072c1f46dcSZachary Turner 
508b9c1b51eSKate Stone     bool DoFreeLock();
5092c1f46dcSZachary Turner 
510b9c1b51eSKate Stone     bool DoTearDownSession();
5112c1f46dcSZachary Turner 
512b9c1b51eSKate Stone     static void ReleasePythonLock();
5132c1f46dcSZachary Turner 
5142c1f46dcSZachary Turner     bool m_teardown_session;
5152c1f46dcSZachary Turner     ScriptInterpreterPython *m_python_interpreter;
5162c1f46dcSZachary Turner     //    	FILE*                    m_tmp_fh;
5172c1f46dcSZachary Turner     PyGILState_STATE m_GILState;
5182c1f46dcSZachary Turner   };
519edb35d95SEugene Zelenko 
5202c1f46dcSZachary Turner protected:
521b9c1b51eSKate Stone   class SynchronicityHandler {
522edb35d95SEugene Zelenko   private:
523edb35d95SEugene Zelenko     lldb::DebuggerSP m_debugger_sp;
524edb35d95SEugene Zelenko     ScriptedCommandSynchronicity m_synch_wanted;
525edb35d95SEugene Zelenko     bool m_old_asynch;
526edb35d95SEugene Zelenko 
527edb35d95SEugene Zelenko   public:
528b9c1b51eSKate Stone     SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity);
529edb35d95SEugene Zelenko 
530edb35d95SEugene Zelenko     ~SynchronicityHandler();
531edb35d95SEugene Zelenko   };
5329c40264fSZachary Turner 
533b9c1b51eSKate Stone   enum class AddLocation { Beginning, End };
5342c1f46dcSZachary Turner 
5352c1f46dcSZachary Turner   static void AddToSysPath(AddLocation location, std::string path);
5362c1f46dcSZachary Turner 
5372df331b0SPavel Labath   static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path);
5382df331b0SPavel Labath   static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path);
5392df331b0SPavel Labath   static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path);
5402df331b0SPavel Labath 
541b9c1b51eSKate Stone   bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
542edb35d95SEugene Zelenko 
543b9c1b51eSKate Stone   void LeaveSession();
544edb35d95SEugene Zelenko 
545b9c1b51eSKate Stone   void SaveTerminalState(int fd);
546edb35d95SEugene Zelenko 
547b9c1b51eSKate Stone   void RestoreTerminalState();
548edb35d95SEugene Zelenko 
549b9c1b51eSKate Stone   uint32_t IsExecutingPython() const { return m_lock_count > 0; }
5502c1f46dcSZachary Turner 
551b9c1b51eSKate Stone   uint32_t IncrementLockCount() { return ++m_lock_count; }
5522c1f46dcSZachary Turner 
553b9c1b51eSKate Stone   uint32_t DecrementLockCount() {
5542c1f46dcSZachary Turner     if (m_lock_count > 0)
5552c1f46dcSZachary Turner       --m_lock_count;
5562c1f46dcSZachary Turner     return m_lock_count;
5572c1f46dcSZachary Turner   }
5582c1f46dcSZachary Turner 
5592c1f46dcSZachary Turner   enum ActiveIOHandler {
5602c1f46dcSZachary Turner     eIOHandlerNone,
5612c1f46dcSZachary Turner     eIOHandlerBreakpoint,
5622c1f46dcSZachary Turner     eIOHandlerWatchpoint
5632c1f46dcSZachary Turner   };
564f8b22f8fSZachary Turner 
565f8b22f8fSZachary Turner   PythonObject &GetMainModule();
5662c1f46dcSZachary Turner 
567b9c1b51eSKate Stone   PythonDictionary &GetSessionDictionary();
5682c1f46dcSZachary Turner 
569b9c1b51eSKate Stone   PythonDictionary &GetSysModuleDictionary();
5702c1f46dcSZachary Turner 
571b9c1b51eSKate Stone   bool GetEmbeddedInterpreterModuleObjects();
5722c1f46dcSZachary Turner 
57323502721SJason Molenda   bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file,
574b9c1b51eSKate Stone                     const char *mode);
575a31baf08SGreg Clayton 
57623502721SJason Molenda   PythonFile m_saved_stdin;
57723502721SJason Molenda   PythonFile m_saved_stdout;
57823502721SJason Molenda   PythonFile m_saved_stderr;
5792c1f46dcSZachary Turner   PythonObject m_main_module;
5802c1f46dcSZachary Turner   PythonObject m_lldb_module;
5812c1f46dcSZachary Turner   PythonDictionary m_session_dict;
5822c1f46dcSZachary Turner   PythonDictionary m_sys_module_dict;
5832c1f46dcSZachary Turner   PythonObject m_run_one_line_function;
5842c1f46dcSZachary Turner   PythonObject m_run_one_line_str_global;
5852c1f46dcSZachary Turner   std::string m_dictionary_name;
5862c1f46dcSZachary Turner   TerminalState m_terminal_state;
5872c1f46dcSZachary Turner   ActiveIOHandler m_active_io_handler;
5882c1f46dcSZachary Turner   bool m_session_is_active;
5892c1f46dcSZachary Turner   bool m_pty_slave_is_open;
5902c1f46dcSZachary Turner   bool m_valid_session;
5912c1f46dcSZachary Turner   uint32_t m_lock_count;
5922c1f46dcSZachary Turner   PyThreadState *m_command_thread_state;
5932c1f46dcSZachary Turner };
594edb35d95SEugene Zelenko 
5952c1f46dcSZachary Turner } // namespace lldb_private
5962c1f46dcSZachary Turner 
597d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON
598d68983e3SPavel Labath 
599280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
600