xref: /llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h (revision b9c1b51e45b845debb76d8658edabca70ca56079)
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 
132c1f46dcSZachary Turner #ifdef LLDB_DISABLE_PYTHON
142c1f46dcSZachary Turner 
152c1f46dcSZachary Turner // Python is disabled in this build
162c1f46dcSZachary Turner 
172c1f46dcSZachary Turner #else
182c1f46dcSZachary Turner 
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"
282c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h"
292c1f46dcSZachary Turner #include "lldb/Host/Terminal.h"
30*b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h"
31*b9c1b51eSKate Stone #include "lldb/lldb-private.h"
322c1f46dcSZachary Turner 
332c1f46dcSZachary Turner class IOHandlerPythonInterpreter;
342c1f46dcSZachary Turner 
352c1f46dcSZachary Turner namespace lldb_private {
362c1f46dcSZachary Turner 
37*b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter,
38*b9c1b51eSKate Stone                                 public IOHandlerDelegateMultiline {
392c1f46dcSZachary Turner public:
40c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3
41c5b41d67SZachary Turner   typedef PyObject *(*SWIGInitCallback)(void);
42c5b41d67SZachary Turner #else
432c1f46dcSZachary Turner   typedef void (*SWIGInitCallback)(void);
44c5b41d67SZachary Turner #endif
452c1f46dcSZachary Turner 
46*b9c1b51eSKate Stone   typedef bool (*SWIGBreakpointCallbackFunction)(
47*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
482c1f46dcSZachary Turner       const lldb::StackFrameSP &frame_sp,
492c1f46dcSZachary Turner       const lldb::BreakpointLocationSP &bp_loc_sp);
502c1f46dcSZachary Turner 
51*b9c1b51eSKate Stone   typedef bool (*SWIGWatchpointCallbackFunction)(
52*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
53*b9c1b51eSKate Stone       const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp);
542c1f46dcSZachary Turner 
55*b9c1b51eSKate Stone   typedef bool (*SWIGPythonTypeScriptCallbackFunction)(
56*b9c1b51eSKate Stone       const char *python_function_name, void *session_dictionary,
57*b9c1b51eSKate Stone       const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper,
58*b9c1b51eSKate Stone       const lldb::TypeSummaryOptionsSP &options, std::string &retval);
592c1f46dcSZachary Turner 
60*b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateSyntheticProvider)(
61*b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
622c1f46dcSZachary Turner       const lldb::ValueObjectSP &valobj_sp);
632c1f46dcSZachary Turner 
64*b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateCommandObject)(
65*b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
662c1f46dcSZachary Turner       const lldb::DebuggerSP debugger_sp);
672c1f46dcSZachary Turner 
68*b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateScriptedThreadPlan)(
69*b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
702c1f46dcSZachary Turner       const lldb::ThreadPlanSP &thread_plan_sp);
712c1f46dcSZachary Turner 
72*b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallThreadPlan)(void *implementor,
73*b9c1b51eSKate Stone                                            const char *method_name,
74*b9c1b51eSKate Stone                                            Event *event_sp, bool &got_error);
752c1f46dcSZachary Turner 
762c1f46dcSZachary Turner   typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name,
772c1f46dcSZachary Turner                                             const char *session_dictionary_name,
782c1f46dcSZachary Turner                                             const lldb::ProcessSP &process_sp);
792c1f46dcSZachary Turner 
80*b9c1b51eSKate Stone   typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor,
81*b9c1b51eSKate Stone                                                    uint32_t max);
82edb35d95SEugene Zelenko 
832c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx);
84edb35d95SEugene Zelenko 
85*b9c1b51eSKate Stone   typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor,
86*b9c1b51eSKate Stone                                                    const char *child_name);
87edb35d95SEugene Zelenko 
882c1f46dcSZachary Turner   typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data);
89edb35d95SEugene Zelenko 
90*b9c1b51eSKate Stone   typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)(
91*b9c1b51eSKate Stone       void *data);
92edb35d95SEugene Zelenko 
932c1f46dcSZachary Turner   typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data);
94edb35d95SEugene Zelenko 
952c1f46dcSZachary Turner   typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data);
96edb35d95SEugene Zelenko 
972c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor);
982c1f46dcSZachary Turner 
99*b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommand)(
100*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
101*b9c1b51eSKate Stone       lldb::DebuggerSP &debugger, const char *args,
1022c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1032c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1042c1f46dcSZachary Turner 
105*b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommandObject)(
106*b9c1b51eSKate Stone       void *implementor, lldb::DebuggerSP &debugger, const char *args,
1072c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1082c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1092c1f46dcSZachary Turner 
1102c1f46dcSZachary Turner   typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name,
1112c1f46dcSZachary Turner                                            const char *session_dictionary_name,
1122c1f46dcSZachary Turner                                            lldb::DebuggerSP &debugger);
1132c1f46dcSZachary Turner 
114*b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Process)(
115*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
116*b9c1b51eSKate Stone       lldb::ProcessSP &process, std::string &output);
117edb35d95SEugene Zelenko 
118*b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Thread)(
119*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
120*b9c1b51eSKate Stone       lldb::ThreadSP &thread, std::string &output);
1212c1f46dcSZachary Turner 
122*b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Target)(
123*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
124*b9c1b51eSKate Stone       lldb::TargetSP &target, std::string &output);
1252c1f46dcSZachary Turner 
126*b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Frame)(
127*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
128*b9c1b51eSKate Stone       lldb::StackFrameSP &frame, std::string &output);
1292c1f46dcSZachary Turner 
130*b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Value)(
131*b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
132*b9c1b51eSKate Stone       lldb::ValueObjectSP &value, std::string &output);
1332c1f46dcSZachary Turner 
134*b9c1b51eSKate Stone   typedef void *(*SWIGPython_GetDynamicSetting)(
135*b9c1b51eSKate Stone       void *module, const char *setting, const lldb::TargetSP &target_sp);
1362c1f46dcSZachary Turner 
1372c1f46dcSZachary Turner   friend class ::IOHandlerPythonInterpreter;
1382c1f46dcSZachary Turner 
1392c1f46dcSZachary Turner   ScriptInterpreterPython(CommandInterpreter &interpreter);
1402c1f46dcSZachary Turner 
141280eb8abSPavel Labath   ~ScriptInterpreterPython() override;
1422c1f46dcSZachary Turner 
143*b9c1b51eSKate Stone   bool Interrupt() override;
1442c1f46dcSZachary Turner 
145*b9c1b51eSKate Stone   bool ExecuteOneLine(
146*b9c1b51eSKate Stone       const char *command, CommandReturnObject *result,
1472c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1482c1f46dcSZachary Turner 
149*b9c1b51eSKate Stone   void ExecuteInterpreterLoop() override;
1502c1f46dcSZachary Turner 
151*b9c1b51eSKate Stone   bool ExecuteOneLineWithReturn(
152*b9c1b51eSKate Stone       const char *in_string, ScriptInterpreter::ScriptReturnType return_type,
1532c1f46dcSZachary Turner       void *ret_value,
1542c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1552c1f46dcSZachary Turner 
156*b9c1b51eSKate Stone   lldb_private::Error ExecuteMultipleLines(
157*b9c1b51eSKate Stone       const char *in_string,
1582c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1592c1f46dcSZachary Turner 
1602c1f46dcSZachary Turner   Error
1612c1f46dcSZachary Turner   ExportFunctionDefinitionToInterpreter(StringList &function_def) override;
1622c1f46dcSZachary Turner 
163*b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(StringList &input, std::string &output,
164*b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1652c1f46dcSZachary Turner 
166*b9c1b51eSKate Stone   bool GenerateTypeSynthClass(StringList &input, std::string &output,
167*b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1682c1f46dcSZachary Turner 
169*b9c1b51eSKate Stone   bool GenerateTypeSynthClass(const char *oneliner, std::string &output,
170*b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1712c1f46dcSZachary Turner 
1722c1f46dcSZachary Turner   // use this if the function code is just a one-liner script
173*b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(const char *oneliner, std::string &output,
174*b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1752c1f46dcSZachary Turner 
176*b9c1b51eSKate Stone   bool GenerateScriptAliasFunction(StringList &input,
177*b9c1b51eSKate Stone                                    std::string &output) override;
1782c1f46dcSZachary Turner 
179*b9c1b51eSKate Stone   StructuredData::ObjectSP
180*b9c1b51eSKate Stone   CreateSyntheticScriptedProvider(const char *class_name,
181*b9c1b51eSKate Stone                                   lldb::ValueObjectSP valobj) override;
1822c1f46dcSZachary Turner 
183*b9c1b51eSKate Stone   StructuredData::GenericSP
184*b9c1b51eSKate Stone   CreateScriptCommandObject(const char *class_name) override;
1852c1f46dcSZachary Turner 
186*b9c1b51eSKate Stone   StructuredData::ObjectSP
187*b9c1b51eSKate Stone   CreateScriptedThreadPlan(const char *class_name,
188*b9c1b51eSKate Stone                            lldb::ThreadPlanSP thread_plan) override;
1892c1f46dcSZachary Turner 
190*b9c1b51eSKate Stone   bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
191*b9c1b51eSKate Stone                                       Event *event,
192*b9c1b51eSKate Stone                                       bool &script_error) override;
193edb35d95SEugene Zelenko 
194*b9c1b51eSKate Stone   bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
195*b9c1b51eSKate Stone                                     Event *event, bool &script_error) override;
196edb35d95SEugene Zelenko 
197*b9c1b51eSKate Stone   bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
198*b9c1b51eSKate Stone                                  bool &script_error) override;
199c915a7d2SJim Ingham 
200*b9c1b51eSKate Stone   lldb::StateType
201*b9c1b51eSKate Stone   ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
202*b9c1b51eSKate Stone                                 bool &script_error) override;
2032c1f46dcSZachary Turner 
204*b9c1b51eSKate Stone   StructuredData::GenericSP
205*b9c1b51eSKate Stone   OSPlugin_CreatePluginObject(const char *class_name,
206*b9c1b51eSKate Stone                               lldb::ProcessSP process_sp) override;
2072c1f46dcSZachary Turner 
208*b9c1b51eSKate Stone   StructuredData::DictionarySP
209*b9c1b51eSKate Stone   OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2102c1f46dcSZachary Turner 
211*b9c1b51eSKate Stone   StructuredData::ArraySP
212*b9c1b51eSKate Stone   OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2132c1f46dcSZachary Turner 
214*b9c1b51eSKate Stone   StructuredData::StringSP
215*b9c1b51eSKate Stone   OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp,
216*b9c1b51eSKate Stone                                lldb::tid_t thread_id) override;
2172c1f46dcSZachary Turner 
218*b9c1b51eSKate Stone   StructuredData::DictionarySP
219*b9c1b51eSKate Stone   OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp,
220*b9c1b51eSKate Stone                         lldb::tid_t tid, lldb::addr_t context) override;
2212c1f46dcSZachary Turner 
222*b9c1b51eSKate Stone   StructuredData::ObjectSP
223*b9c1b51eSKate Stone   LoadPluginModule(const FileSpec &file_spec,
2242c1f46dcSZachary Turner                    lldb_private::Error &error) override;
2252c1f46dcSZachary Turner 
226*b9c1b51eSKate Stone   StructuredData::DictionarySP
227*b9c1b51eSKate Stone   GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target,
228*b9c1b51eSKate Stone                      const char *setting_name,
229*b9c1b51eSKate Stone                      lldb_private::Error &error) override;
2302c1f46dcSZachary Turner 
231*b9c1b51eSKate Stone   size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor,
232*b9c1b51eSKate Stone                               uint32_t max) override;
2332c1f46dcSZachary Turner 
234*b9c1b51eSKate Stone   lldb::ValueObjectSP
235*b9c1b51eSKate Stone   GetChildAtIndex(const StructuredData::ObjectSP &implementor,
236*b9c1b51eSKate Stone                   uint32_t idx) override;
2372c1f46dcSZachary Turner 
238*b9c1b51eSKate Stone   int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
239*b9c1b51eSKate Stone                               const char *child_name) override;
2402c1f46dcSZachary Turner 
241*b9c1b51eSKate Stone   bool UpdateSynthProviderInstance(
242*b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2432c1f46dcSZachary Turner 
244*b9c1b51eSKate Stone   bool MightHaveChildrenSynthProviderInstance(
245*b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2462c1f46dcSZachary Turner 
247*b9c1b51eSKate Stone   lldb::ValueObjectSP
248*b9c1b51eSKate Stone   GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
249*b9c1b51eSKate Stone 
250*b9c1b51eSKate Stone   ConstString
251*b9c1b51eSKate Stone   GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override;
2526eec8d6cSEnrico Granata 
2532c1f46dcSZachary Turner   bool
254*b9c1b51eSKate Stone   RunScriptBasedCommand(const char *impl_function, const char *args,
2552c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2562c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
2572c1f46dcSZachary Turner                         Error &error,
2582c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2592c1f46dcSZachary Turner 
2602c1f46dcSZachary Turner   bool
261*b9c1b51eSKate Stone   RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp, const char *args,
2622c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2632c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
2642c1f46dcSZachary Turner                         Error &error,
2652c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2662c1f46dcSZachary Turner 
267*b9c1b51eSKate Stone   Error GenerateFunction(const char *signature,
268*b9c1b51eSKate Stone                          const StringList &input) override;
2692c1f46dcSZachary Turner 
270*b9c1b51eSKate Stone   Error GenerateBreakpointCommandCallbackData(StringList &input,
271*b9c1b51eSKate Stone                                               std::string &output) override;
2722c1f46dcSZachary Turner 
273*b9c1b51eSKate Stone   bool GenerateWatchpointCommandCallbackData(StringList &input,
274*b9c1b51eSKate Stone                                              std::string &output) override;
2752c1f46dcSZachary Turner 
2762c1f46dcSZachary Turner   //    static size_t
2772c1f46dcSZachary Turner   //    GenerateBreakpointOptionsCommandCallback (void *baton,
2782c1f46dcSZachary Turner   //                                              InputReader &reader,
279*b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
280*b9c1b51eSKate Stone   //                                              notification,
2812c1f46dcSZachary Turner   //                                              const char *bytes,
2822c1f46dcSZachary Turner   //                                              size_t bytes_len);
2832c1f46dcSZachary Turner   //
2842c1f46dcSZachary Turner   //    static size_t
2852c1f46dcSZachary Turner   //    GenerateWatchpointOptionsCommandCallback (void *baton,
2862c1f46dcSZachary Turner   //                                              InputReader &reader,
287*b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
288*b9c1b51eSKate Stone   //                                              notification,
2892c1f46dcSZachary Turner   //                                              const char *bytes,
2902c1f46dcSZachary Turner   //                                              size_t bytes_len);
2912c1f46dcSZachary Turner 
292*b9c1b51eSKate Stone   static bool BreakpointCallbackFunction(void *baton,
2932c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
2942c1f46dcSZachary Turner                                          lldb::user_id_t break_id,
2952c1f46dcSZachary Turner                                          lldb::user_id_t break_loc_id);
2962c1f46dcSZachary Turner 
297*b9c1b51eSKate Stone   static bool WatchpointCallbackFunction(void *baton,
2982c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
2992c1f46dcSZachary Turner                                          lldb::user_id_t watch_id);
3002c1f46dcSZachary Turner 
301*b9c1b51eSKate Stone   bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj,
302*b9c1b51eSKate Stone                           StructuredData::ObjectSP &callee_wrapper_sp,
303*b9c1b51eSKate Stone                           const TypeSummaryOptions &options,
304*b9c1b51eSKate Stone                           std::string &retval) override;
3052c1f46dcSZachary Turner 
306*b9c1b51eSKate Stone   void Clear() override;
3072c1f46dcSZachary Turner 
308*b9c1b51eSKate Stone   bool GetDocumentationForItem(const char *item, std::string &dest) override;
3092c1f46dcSZachary Turner 
310*b9c1b51eSKate Stone   bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
311*b9c1b51eSKate Stone                                     std::string &dest) override;
3122c1f46dcSZachary Turner 
3132c1f46dcSZachary Turner   uint32_t
3142c1f46dcSZachary Turner   GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override;
3152c1f46dcSZachary Turner 
316*b9c1b51eSKate Stone   bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
317*b9c1b51eSKate Stone                                    std::string &dest) override;
3182c1f46dcSZachary Turner 
319*b9c1b51eSKate Stone   bool CheckObjectExists(const char *name) override {
3202c1f46dcSZachary Turner     if (!name || !name[0])
3212c1f46dcSZachary Turner       return false;
3222c1f46dcSZachary Turner     std::string temp;
3232c1f46dcSZachary Turner     return GetDocumentationForItem(name, temp);
3242c1f46dcSZachary Turner   }
3252c1f46dcSZachary Turner 
326*b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Process *process,
327*b9c1b51eSKate Stone                               std::string &output, Error &error) override;
328*b9c1b51eSKate Stone 
329*b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Thread *thread,
330*b9c1b51eSKate Stone                               std::string &output, Error &error) override;
331*b9c1b51eSKate Stone 
332*b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Target *target,
333*b9c1b51eSKate Stone                               std::string &output, Error &error) override;
334*b9c1b51eSKate Stone 
335*b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame,
336*b9c1b51eSKate Stone                               std::string &output, Error &error) override;
337*b9c1b51eSKate Stone 
338*b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value,
339*b9c1b51eSKate Stone                               std::string &output, Error &error) override;
3402c1f46dcSZachary Turner 
3412c1f46dcSZachary Turner   bool
342*b9c1b51eSKate Stone   LoadScriptingModule(const char *filename, bool can_reload, bool init_session,
343*b9c1b51eSKate Stone                       lldb_private::Error &error,
3442c1f46dcSZachary Turner                       StructuredData::ObjectSP *module_sp = nullptr) override;
3452c1f46dcSZachary Turner 
346*b9c1b51eSKate Stone   bool IsReservedWord(const char *word) override;
3472c1f46dcSZachary Turner 
348*b9c1b51eSKate Stone   std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override;
3492c1f46dcSZachary Turner 
350*b9c1b51eSKate Stone   void CollectDataForBreakpointCommandCallback(
351*b9c1b51eSKate Stone       std::vector<BreakpointOptions *> &bp_options_vec,
3522c1f46dcSZachary Turner       CommandReturnObject &result) override;
3532c1f46dcSZachary Turner 
3542c1f46dcSZachary Turner   void
3552c1f46dcSZachary Turner   CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options,
3562c1f46dcSZachary Turner                                           CommandReturnObject &result) override;
3572c1f46dcSZachary Turner 
3582c1f46dcSZachary Turner   /// Set the callback body text into the callback for the breakpoint.
359*b9c1b51eSKate Stone   Error SetBreakpointCommandCallback(BreakpointOptions *bp_options,
3602c1f46dcSZachary Turner                                      const char *callback_body) override;
3612c1f46dcSZachary Turner 
362*b9c1b51eSKate Stone   void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options,
3632c1f46dcSZachary Turner                                             const char *function_name) override;
3642c1f46dcSZachary Turner 
3652c1f46dcSZachary Turner   /// Set a one-liner as the callback for the watchpoint.
366*b9c1b51eSKate Stone   void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
3672c1f46dcSZachary Turner                                     const char *oneliner) override;
3682c1f46dcSZachary Turner 
369*b9c1b51eSKate Stone   StringList ReadCommandInputFromUser(FILE *in_file);
3702c1f46dcSZachary Turner 
3712c1f46dcSZachary Turner   void ResetOutputFileHandle(FILE *new_fh) override;
3722c1f46dcSZachary Turner 
373*b9c1b51eSKate Stone   static void InitializePrivate();
374ba456807SPavel Labath 
375*b9c1b51eSKate Stone   static void InitializeInterpreter(
376*b9c1b51eSKate Stone       SWIGInitCallback python_swig_init_callback,
3772c1f46dcSZachary Turner       SWIGBreakpointCallbackFunction swig_breakpoint_callback,
3782c1f46dcSZachary Turner       SWIGWatchpointCallbackFunction swig_watchpoint_callback,
3792c1f46dcSZachary Turner       SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
3802c1f46dcSZachary Turner       SWIGPythonCreateSyntheticProvider swig_synthetic_script,
3812c1f46dcSZachary Turner       SWIGPythonCreateCommandObject swig_create_cmd,
3822c1f46dcSZachary Turner       SWIGPythonCalculateNumChildren swig_calc_children,
3832c1f46dcSZachary Turner       SWIGPythonGetChildAtIndex swig_get_child_index,
3842c1f46dcSZachary Turner       SWIGPythonGetIndexOfChildWithName swig_get_index_child,
3852c1f46dcSZachary Turner       SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue,
3862c1f46dcSZachary Turner       SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
3872c1f46dcSZachary Turner       SWIGPythonUpdateSynthProviderInstance swig_update_provider,
388*b9c1b51eSKate Stone       SWIGPythonMightHaveChildrenSynthProviderInstance
389*b9c1b51eSKate Stone           swig_mighthavechildren_provider,
3902c1f46dcSZachary Turner       SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
3912c1f46dcSZachary Turner       SWIGPythonCallCommand swig_call_command,
3922c1f46dcSZachary Turner       SWIGPythonCallCommandObject swig_call_command_object,
3932c1f46dcSZachary Turner       SWIGPythonCallModuleInit swig_call_module_init,
3942c1f46dcSZachary Turner       SWIGPythonCreateOSPlugin swig_create_os_plugin,
3952c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
3962c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
3972c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
3982c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
3992c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
4002c1f46dcSZachary Turner       SWIGPython_GetDynamicSetting swig_plugin_get,
4012c1f46dcSZachary Turner       SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
4022c1f46dcSZachary Turner       SWIGPythonCallThreadPlan swig_call_thread_plan);
4032c1f46dcSZachary Turner 
404*b9c1b51eSKate Stone   const char *GetDictionaryName() { return m_dictionary_name.c_str(); }
4052c1f46dcSZachary Turner 
406*b9c1b51eSKate Stone   PyThreadState *GetThreadState() { return m_command_thread_state; }
4072c1f46dcSZachary Turner 
408*b9c1b51eSKate Stone   void SetThreadState(PyThreadState *s) {
4092c1f46dcSZachary Turner     if (s)
4102c1f46dcSZachary Turner       m_command_thread_state = s;
4112c1f46dcSZachary Turner   }
4122c1f46dcSZachary Turner 
4132c1f46dcSZachary Turner   //----------------------------------------------------------------------
4142c1f46dcSZachary Turner   // IOHandlerDelegate
4152c1f46dcSZachary Turner   //----------------------------------------------------------------------
416*b9c1b51eSKate Stone   void IOHandlerActivated(IOHandler &io_handler) override;
4172c1f46dcSZachary Turner 
418*b9c1b51eSKate Stone   void IOHandlerInputComplete(IOHandler &io_handler,
419*b9c1b51eSKate Stone                               std::string &data) override;
4202c1f46dcSZachary Turner 
4212c1f46dcSZachary Turner   //------------------------------------------------------------------
4222c1f46dcSZachary Turner   // Static Functions
4232c1f46dcSZachary Turner   //------------------------------------------------------------------
424*b9c1b51eSKate Stone   static void Initialize();
4252c1f46dcSZachary Turner 
426*b9c1b51eSKate Stone   static void Terminate();
4272c1f46dcSZachary Turner 
4282c1f46dcSZachary Turner   static lldb::ScriptInterpreterSP
4292c1f46dcSZachary Turner   CreateInstance(CommandInterpreter &interpreter);
4302c1f46dcSZachary Turner 
431*b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
4322c1f46dcSZachary Turner 
433*b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
4342c1f46dcSZachary Turner 
4352c1f46dcSZachary Turner   //------------------------------------------------------------------
4362c1f46dcSZachary Turner   // PluginInterface protocol
4372c1f46dcSZachary Turner   //------------------------------------------------------------------
438*b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
4392c1f46dcSZachary Turner 
440*b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
4412c1f46dcSZachary Turner 
442*b9c1b51eSKate Stone   class Locker : public ScriptInterpreterLocker {
4432c1f46dcSZachary Turner   public:
444*b9c1b51eSKate Stone     enum OnEntry {
4452c1f46dcSZachary Turner       AcquireLock = 0x0001,
4462c1f46dcSZachary Turner       InitSession = 0x0002,
4472c1f46dcSZachary Turner       InitGlobals = 0x0004,
4482c1f46dcSZachary Turner       NoSTDIN = 0x0008
4492c1f46dcSZachary Turner     };
4502c1f46dcSZachary Turner 
451*b9c1b51eSKate Stone     enum OnLeave {
4522c1f46dcSZachary Turner       FreeLock = 0x0001,
453*b9c1b51eSKate Stone       FreeAcquiredLock = 0x0002, // do not free the lock if we already held it
454*b9c1b51eSKate Stone                                  // when calling constructor
4552c1f46dcSZachary Turner       TearDownSession = 0x0004
4562c1f46dcSZachary Turner     };
4572c1f46dcSZachary Turner 
458edb35d95SEugene Zelenko     Locker(ScriptInterpreterPython *py_interpreter = nullptr,
4592c1f46dcSZachary Turner            uint16_t on_entry = AcquireLock | InitSession,
460*b9c1b51eSKate Stone            uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr,
461*b9c1b51eSKate Stone            FILE *out = nullptr, FILE *err = nullptr);
4622c1f46dcSZachary Turner 
463280eb8abSPavel Labath     ~Locker() override;
4642c1f46dcSZachary Turner 
4652c1f46dcSZachary Turner   private:
466*b9c1b51eSKate Stone     bool DoAcquireLock();
4672c1f46dcSZachary Turner 
468*b9c1b51eSKate Stone     bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
4692c1f46dcSZachary Turner 
470*b9c1b51eSKate Stone     bool DoFreeLock();
4712c1f46dcSZachary Turner 
472*b9c1b51eSKate Stone     bool DoTearDownSession();
4732c1f46dcSZachary Turner 
474*b9c1b51eSKate Stone     static void ReleasePythonLock();
4752c1f46dcSZachary Turner 
4762c1f46dcSZachary Turner     bool m_teardown_session;
4772c1f46dcSZachary Turner     ScriptInterpreterPython *m_python_interpreter;
4782c1f46dcSZachary Turner     //    	FILE*                    m_tmp_fh;
4792c1f46dcSZachary Turner     PyGILState_STATE m_GILState;
4802c1f46dcSZachary Turner   };
481edb35d95SEugene Zelenko 
4822c1f46dcSZachary Turner protected:
483*b9c1b51eSKate Stone   class SynchronicityHandler {
484edb35d95SEugene Zelenko   private:
485edb35d95SEugene Zelenko     lldb::DebuggerSP m_debugger_sp;
486edb35d95SEugene Zelenko     ScriptedCommandSynchronicity m_synch_wanted;
487edb35d95SEugene Zelenko     bool m_old_asynch;
488edb35d95SEugene Zelenko 
489edb35d95SEugene Zelenko   public:
490*b9c1b51eSKate Stone     SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity);
491edb35d95SEugene Zelenko 
492edb35d95SEugene Zelenko     ~SynchronicityHandler();
493edb35d95SEugene Zelenko   };
4949c40264fSZachary Turner 
495*b9c1b51eSKate Stone   enum class AddLocation { Beginning, End };
4962c1f46dcSZachary Turner 
4972c1f46dcSZachary Turner   static void AddToSysPath(AddLocation location, std::string path);
4982c1f46dcSZachary Turner 
499*b9c1b51eSKate Stone   bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
500edb35d95SEugene Zelenko 
501*b9c1b51eSKate Stone   void LeaveSession();
502edb35d95SEugene Zelenko 
503*b9c1b51eSKate Stone   void SaveTerminalState(int fd);
504edb35d95SEugene Zelenko 
505*b9c1b51eSKate Stone   void RestoreTerminalState();
506edb35d95SEugene Zelenko 
507*b9c1b51eSKate Stone   uint32_t IsExecutingPython() const { return m_lock_count > 0; }
5082c1f46dcSZachary Turner 
509*b9c1b51eSKate Stone   uint32_t IncrementLockCount() { return ++m_lock_count; }
5102c1f46dcSZachary Turner 
511*b9c1b51eSKate Stone   uint32_t DecrementLockCount() {
5122c1f46dcSZachary Turner     if (m_lock_count > 0)
5132c1f46dcSZachary Turner       --m_lock_count;
5142c1f46dcSZachary Turner     return m_lock_count;
5152c1f46dcSZachary Turner   }
5162c1f46dcSZachary Turner 
5172c1f46dcSZachary Turner   enum ActiveIOHandler {
5182c1f46dcSZachary Turner     eIOHandlerNone,
5192c1f46dcSZachary Turner     eIOHandlerBreakpoint,
5202c1f46dcSZachary Turner     eIOHandlerWatchpoint
5212c1f46dcSZachary Turner   };
522f8b22f8fSZachary Turner 
523f8b22f8fSZachary Turner   PythonObject &GetMainModule();
5242c1f46dcSZachary Turner 
525*b9c1b51eSKate Stone   PythonDictionary &GetSessionDictionary();
5262c1f46dcSZachary Turner 
527*b9c1b51eSKate Stone   PythonDictionary &GetSysModuleDictionary();
5282c1f46dcSZachary Turner 
529*b9c1b51eSKate Stone   bool GetEmbeddedInterpreterModuleObjects();
5302c1f46dcSZachary Turner 
531*b9c1b51eSKate Stone   bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file,
532*b9c1b51eSKate Stone                     const char *mode);
533a31baf08SGreg Clayton 
53432064024SZachary Turner   PythonFile m_saved_stdin;
53532064024SZachary Turner   PythonFile m_saved_stdout;
53632064024SZachary Turner   PythonFile m_saved_stderr;
5372c1f46dcSZachary Turner   PythonObject m_main_module;
5382c1f46dcSZachary Turner   PythonObject m_lldb_module;
5392c1f46dcSZachary Turner   PythonDictionary m_session_dict;
5402c1f46dcSZachary Turner   PythonDictionary m_sys_module_dict;
5412c1f46dcSZachary Turner   PythonObject m_run_one_line_function;
5422c1f46dcSZachary Turner   PythonObject m_run_one_line_str_global;
5432c1f46dcSZachary Turner   std::string m_dictionary_name;
5442c1f46dcSZachary Turner   TerminalState m_terminal_state;
5452c1f46dcSZachary Turner   ActiveIOHandler m_active_io_handler;
5462c1f46dcSZachary Turner   bool m_session_is_active;
5472c1f46dcSZachary Turner   bool m_pty_slave_is_open;
5482c1f46dcSZachary Turner   bool m_valid_session;
5492c1f46dcSZachary Turner   uint32_t m_lock_count;
5502c1f46dcSZachary Turner   PyThreadState *m_command_thread_state;
5512c1f46dcSZachary Turner };
552edb35d95SEugene Zelenko 
5532c1f46dcSZachary Turner } // namespace lldb_private
5542c1f46dcSZachary Turner 
555280eb8abSPavel Labath #endif // LLDB_DISABLE_PYTHON
5562c1f46dcSZachary Turner 
557280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
558