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"
28*f7e07256SJim 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:
41*f7e07256SJim Ingham   class CommandDataPython : public BreakpointOptions::CommandData {
42*f7e07256SJim Ingham   public:
43*f7e07256SJim Ingham     CommandDataPython() : BreakpointOptions::CommandData() {
44*f7e07256SJim Ingham       interpreter = lldb::eScriptLanguagePython;
45*f7e07256SJim Ingham     }
46*f7e07256SJim Ingham   };
47*f7e07256SJim 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 
842c1f46dcSZachary Turner   typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name,
852c1f46dcSZachary Turner                                             const char *session_dictionary_name,
862c1f46dcSZachary Turner                                             const lldb::ProcessSP &process_sp);
872c1f46dcSZachary Turner 
88b9c1b51eSKate Stone   typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor,
89b9c1b51eSKate Stone                                                    uint32_t max);
90edb35d95SEugene Zelenko 
912c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx);
92edb35d95SEugene Zelenko 
93b9c1b51eSKate Stone   typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor,
94b9c1b51eSKate Stone                                                    const char *child_name);
95edb35d95SEugene Zelenko 
962c1f46dcSZachary Turner   typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data);
97edb35d95SEugene Zelenko 
98b9c1b51eSKate Stone   typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)(
99b9c1b51eSKate Stone       void *data);
100edb35d95SEugene Zelenko 
1012c1f46dcSZachary Turner   typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data);
102edb35d95SEugene Zelenko 
1032c1f46dcSZachary Turner   typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data);
104edb35d95SEugene Zelenko 
1052c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor);
1062c1f46dcSZachary Turner 
107b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommand)(
108b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
109b9c1b51eSKate Stone       lldb::DebuggerSP &debugger, const char *args,
1102c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1112c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1122c1f46dcSZachary Turner 
113b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommandObject)(
114b9c1b51eSKate Stone       void *implementor, lldb::DebuggerSP &debugger, const char *args,
1152c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1162c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1172c1f46dcSZachary Turner 
1182c1f46dcSZachary Turner   typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name,
1192c1f46dcSZachary Turner                                            const char *session_dictionary_name,
1202c1f46dcSZachary Turner                                            lldb::DebuggerSP &debugger);
1212c1f46dcSZachary Turner 
122b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Process)(
123b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
124b9c1b51eSKate Stone       lldb::ProcessSP &process, std::string &output);
125edb35d95SEugene Zelenko 
126b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Thread)(
127b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
128b9c1b51eSKate Stone       lldb::ThreadSP &thread, std::string &output);
1292c1f46dcSZachary Turner 
130b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Target)(
131b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
132b9c1b51eSKate Stone       lldb::TargetSP &target, std::string &output);
1332c1f46dcSZachary Turner 
134b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Frame)(
135b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
136b9c1b51eSKate Stone       lldb::StackFrameSP &frame, std::string &output);
1372c1f46dcSZachary Turner 
138b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Value)(
139b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
140b9c1b51eSKate Stone       lldb::ValueObjectSP &value, std::string &output);
1412c1f46dcSZachary Turner 
142b9c1b51eSKate Stone   typedef void *(*SWIGPython_GetDynamicSetting)(
143b9c1b51eSKate Stone       void *module, const char *setting, const lldb::TargetSP &target_sp);
1442c1f46dcSZachary Turner 
1452c1f46dcSZachary Turner   friend class ::IOHandlerPythonInterpreter;
1462c1f46dcSZachary Turner 
1472c1f46dcSZachary Turner   ScriptInterpreterPython(CommandInterpreter &interpreter);
1482c1f46dcSZachary Turner 
149280eb8abSPavel Labath   ~ScriptInterpreterPython() override;
1502c1f46dcSZachary Turner 
151b9c1b51eSKate Stone   bool Interrupt() override;
1522c1f46dcSZachary Turner 
153b9c1b51eSKate Stone   bool ExecuteOneLine(
154b9c1b51eSKate Stone       const char *command, CommandReturnObject *result,
1552c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1562c1f46dcSZachary Turner 
157b9c1b51eSKate Stone   void ExecuteInterpreterLoop() override;
1582c1f46dcSZachary Turner 
159b9c1b51eSKate Stone   bool ExecuteOneLineWithReturn(
160b9c1b51eSKate Stone       const char *in_string, ScriptInterpreter::ScriptReturnType return_type,
1612c1f46dcSZachary Turner       void *ret_value,
1622c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1632c1f46dcSZachary Turner 
164b9c1b51eSKate Stone   lldb_private::Error ExecuteMultipleLines(
165b9c1b51eSKate Stone       const char *in_string,
1662c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1672c1f46dcSZachary Turner 
1682c1f46dcSZachary Turner   Error
1692c1f46dcSZachary Turner   ExportFunctionDefinitionToInterpreter(StringList &function_def) override;
1702c1f46dcSZachary Turner 
171b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(StringList &input, std::string &output,
172b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1732c1f46dcSZachary Turner 
174b9c1b51eSKate Stone   bool GenerateTypeSynthClass(StringList &input, std::string &output,
175b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1762c1f46dcSZachary Turner 
177b9c1b51eSKate Stone   bool GenerateTypeSynthClass(const char *oneliner, std::string &output,
178b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1792c1f46dcSZachary Turner 
1802c1f46dcSZachary Turner   // use this if the function code is just a one-liner script
181b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(const char *oneliner, std::string &output,
182b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1832c1f46dcSZachary Turner 
184b9c1b51eSKate Stone   bool GenerateScriptAliasFunction(StringList &input,
185b9c1b51eSKate Stone                                    std::string &output) override;
1862c1f46dcSZachary Turner 
187b9c1b51eSKate Stone   StructuredData::ObjectSP
188b9c1b51eSKate Stone   CreateSyntheticScriptedProvider(const char *class_name,
189b9c1b51eSKate Stone                                   lldb::ValueObjectSP valobj) override;
1902c1f46dcSZachary Turner 
191b9c1b51eSKate Stone   StructuredData::GenericSP
192b9c1b51eSKate Stone   CreateScriptCommandObject(const char *class_name) override;
1932c1f46dcSZachary Turner 
194b9c1b51eSKate Stone   StructuredData::ObjectSP
195b9c1b51eSKate Stone   CreateScriptedThreadPlan(const char *class_name,
196b9c1b51eSKate Stone                            lldb::ThreadPlanSP thread_plan) override;
1972c1f46dcSZachary Turner 
198b9c1b51eSKate Stone   bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
199b9c1b51eSKate Stone                                       Event *event,
200b9c1b51eSKate Stone                                       bool &script_error) override;
201edb35d95SEugene Zelenko 
202b9c1b51eSKate Stone   bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
203b9c1b51eSKate Stone                                     Event *event, bool &script_error) override;
204edb35d95SEugene Zelenko 
205b9c1b51eSKate Stone   bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
206b9c1b51eSKate Stone                                  bool &script_error) override;
207c915a7d2SJim Ingham 
208b9c1b51eSKate Stone   lldb::StateType
209b9c1b51eSKate Stone   ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
210b9c1b51eSKate Stone                                 bool &script_error) override;
2112c1f46dcSZachary Turner 
212b9c1b51eSKate Stone   StructuredData::GenericSP
213b9c1b51eSKate Stone   OSPlugin_CreatePluginObject(const char *class_name,
214b9c1b51eSKate Stone                               lldb::ProcessSP process_sp) override;
2152c1f46dcSZachary Turner 
216b9c1b51eSKate Stone   StructuredData::DictionarySP
217b9c1b51eSKate Stone   OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2182c1f46dcSZachary Turner 
219b9c1b51eSKate Stone   StructuredData::ArraySP
220b9c1b51eSKate Stone   OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2212c1f46dcSZachary Turner 
222b9c1b51eSKate Stone   StructuredData::StringSP
223b9c1b51eSKate Stone   OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp,
224b9c1b51eSKate Stone                                lldb::tid_t thread_id) override;
2252c1f46dcSZachary Turner 
226b9c1b51eSKate Stone   StructuredData::DictionarySP
227b9c1b51eSKate Stone   OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp,
228b9c1b51eSKate Stone                         lldb::tid_t tid, lldb::addr_t context) override;
2292c1f46dcSZachary Turner 
230b9c1b51eSKate Stone   StructuredData::ObjectSP
231b9c1b51eSKate Stone   LoadPluginModule(const FileSpec &file_spec,
2322c1f46dcSZachary Turner                    lldb_private::Error &error) override;
2332c1f46dcSZachary Turner 
234b9c1b51eSKate Stone   StructuredData::DictionarySP
235b9c1b51eSKate Stone   GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target,
236b9c1b51eSKate Stone                      const char *setting_name,
237b9c1b51eSKate Stone                      lldb_private::Error &error) override;
2382c1f46dcSZachary Turner 
239b9c1b51eSKate Stone   size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor,
240b9c1b51eSKate Stone                               uint32_t max) override;
2412c1f46dcSZachary Turner 
242b9c1b51eSKate Stone   lldb::ValueObjectSP
243b9c1b51eSKate Stone   GetChildAtIndex(const StructuredData::ObjectSP &implementor,
244b9c1b51eSKate Stone                   uint32_t idx) override;
2452c1f46dcSZachary Turner 
246b9c1b51eSKate Stone   int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
247b9c1b51eSKate Stone                               const char *child_name) override;
2482c1f46dcSZachary Turner 
249b9c1b51eSKate Stone   bool UpdateSynthProviderInstance(
250b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2512c1f46dcSZachary Turner 
252b9c1b51eSKate Stone   bool MightHaveChildrenSynthProviderInstance(
253b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2542c1f46dcSZachary Turner 
255b9c1b51eSKate Stone   lldb::ValueObjectSP
256b9c1b51eSKate Stone   GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
257b9c1b51eSKate Stone 
258b9c1b51eSKate Stone   ConstString
259b9c1b51eSKate Stone   GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override;
2606eec8d6cSEnrico Granata 
2612c1f46dcSZachary Turner   bool
262b9c1b51eSKate Stone   RunScriptBasedCommand(const char *impl_function, const char *args,
2632c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2642c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
2652c1f46dcSZachary Turner                         Error &error,
2662c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2672c1f46dcSZachary Turner 
2682c1f46dcSZachary Turner   bool
269b9c1b51eSKate Stone   RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp, const char *args,
2702c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2712c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
2722c1f46dcSZachary Turner                         Error &error,
2732c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2742c1f46dcSZachary Turner 
275b9c1b51eSKate Stone   Error GenerateFunction(const char *signature,
276b9c1b51eSKate Stone                          const StringList &input) override;
2772c1f46dcSZachary Turner 
278b9c1b51eSKate Stone   Error GenerateBreakpointCommandCallbackData(StringList &input,
279b9c1b51eSKate Stone                                               std::string &output) override;
2802c1f46dcSZachary Turner 
281b9c1b51eSKate Stone   bool GenerateWatchpointCommandCallbackData(StringList &input,
282b9c1b51eSKate Stone                                              std::string &output) override;
2832c1f46dcSZachary Turner 
2842c1f46dcSZachary Turner   //    static size_t
2852c1f46dcSZachary Turner   //    GenerateBreakpointOptionsCommandCallback (void *baton,
2862c1f46dcSZachary Turner   //                                              InputReader &reader,
287b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
288b9c1b51eSKate Stone   //                                              notification,
2892c1f46dcSZachary Turner   //                                              const char *bytes,
2902c1f46dcSZachary Turner   //                                              size_t bytes_len);
2912c1f46dcSZachary Turner   //
2922c1f46dcSZachary Turner   //    static size_t
2932c1f46dcSZachary Turner   //    GenerateWatchpointOptionsCommandCallback (void *baton,
2942c1f46dcSZachary Turner   //                                              InputReader &reader,
295b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
296b9c1b51eSKate Stone   //                                              notification,
2972c1f46dcSZachary Turner   //                                              const char *bytes,
2982c1f46dcSZachary Turner   //                                              size_t bytes_len);
2992c1f46dcSZachary Turner 
300b9c1b51eSKate Stone   static bool BreakpointCallbackFunction(void *baton,
3012c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3022c1f46dcSZachary Turner                                          lldb::user_id_t break_id,
3032c1f46dcSZachary Turner                                          lldb::user_id_t break_loc_id);
3042c1f46dcSZachary Turner 
305b9c1b51eSKate Stone   static bool WatchpointCallbackFunction(void *baton,
3062c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3072c1f46dcSZachary Turner                                          lldb::user_id_t watch_id);
3082c1f46dcSZachary Turner 
309b9c1b51eSKate Stone   bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj,
310b9c1b51eSKate Stone                           StructuredData::ObjectSP &callee_wrapper_sp,
311b9c1b51eSKate Stone                           const TypeSummaryOptions &options,
312b9c1b51eSKate Stone                           std::string &retval) override;
3132c1f46dcSZachary Turner 
314b9c1b51eSKate Stone   void Clear() override;
3152c1f46dcSZachary Turner 
316b9c1b51eSKate Stone   bool GetDocumentationForItem(const char *item, std::string &dest) override;
3172c1f46dcSZachary Turner 
318b9c1b51eSKate Stone   bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
319b9c1b51eSKate Stone                                     std::string &dest) override;
3202c1f46dcSZachary Turner 
3212c1f46dcSZachary Turner   uint32_t
3222c1f46dcSZachary Turner   GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override;
3232c1f46dcSZachary Turner 
324b9c1b51eSKate Stone   bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
325b9c1b51eSKate Stone                                    std::string &dest) override;
3262c1f46dcSZachary Turner 
327b9c1b51eSKate Stone   bool CheckObjectExists(const char *name) override {
3282c1f46dcSZachary Turner     if (!name || !name[0])
3292c1f46dcSZachary Turner       return false;
3302c1f46dcSZachary Turner     std::string temp;
3312c1f46dcSZachary Turner     return GetDocumentationForItem(name, temp);
3322c1f46dcSZachary Turner   }
3332c1f46dcSZachary Turner 
334b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Process *process,
335b9c1b51eSKate Stone                               std::string &output, Error &error) override;
336b9c1b51eSKate Stone 
337b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Thread *thread,
338b9c1b51eSKate Stone                               std::string &output, Error &error) override;
339b9c1b51eSKate Stone 
340b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Target *target,
341b9c1b51eSKate Stone                               std::string &output, Error &error) override;
342b9c1b51eSKate Stone 
343b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame,
344b9c1b51eSKate Stone                               std::string &output, Error &error) override;
345b9c1b51eSKate Stone 
346b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value,
347b9c1b51eSKate Stone                               std::string &output, Error &error) override;
3482c1f46dcSZachary Turner 
3492c1f46dcSZachary Turner   bool
350b9c1b51eSKate Stone   LoadScriptingModule(const char *filename, bool can_reload, bool init_session,
351b9c1b51eSKate Stone                       lldb_private::Error &error,
3522c1f46dcSZachary Turner                       StructuredData::ObjectSP *module_sp = nullptr) override;
3532c1f46dcSZachary Turner 
354b9c1b51eSKate Stone   bool IsReservedWord(const char *word) override;
3552c1f46dcSZachary Turner 
356b9c1b51eSKate Stone   std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override;
3572c1f46dcSZachary Turner 
358b9c1b51eSKate Stone   void CollectDataForBreakpointCommandCallback(
359b9c1b51eSKate Stone       std::vector<BreakpointOptions *> &bp_options_vec,
3602c1f46dcSZachary Turner       CommandReturnObject &result) override;
3612c1f46dcSZachary Turner 
3622c1f46dcSZachary Turner   void
3632c1f46dcSZachary Turner   CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options,
3642c1f46dcSZachary Turner                                           CommandReturnObject &result) override;
3652c1f46dcSZachary Turner 
3662c1f46dcSZachary Turner   /// Set the callback body text into the callback for the breakpoint.
367b9c1b51eSKate Stone   Error SetBreakpointCommandCallback(BreakpointOptions *bp_options,
3682c1f46dcSZachary Turner                                      const char *callback_body) override;
3692c1f46dcSZachary Turner 
370b9c1b51eSKate Stone   void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options,
3712c1f46dcSZachary Turner                                             const char *function_name) override;
3722c1f46dcSZachary Turner 
373*f7e07256SJim Ingham   /// This one is for deserialization:
374*f7e07256SJim Ingham   Error SetBreakpointCommandCallback(
375*f7e07256SJim Ingham       BreakpointOptions *bp_options,
376*f7e07256SJim Ingham       std::unique_ptr<BreakpointOptions::CommandData> &data_up) override;
377*f7e07256SJim Ingham 
3782c1f46dcSZachary Turner   /// Set a one-liner as the callback for the watchpoint.
379b9c1b51eSKate Stone   void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
3802c1f46dcSZachary Turner                                     const char *oneliner) override;
3812c1f46dcSZachary Turner 
382b9c1b51eSKate Stone   StringList ReadCommandInputFromUser(FILE *in_file);
3832c1f46dcSZachary Turner 
3842c1f46dcSZachary Turner   void ResetOutputFileHandle(FILE *new_fh) override;
3852c1f46dcSZachary Turner 
386b9c1b51eSKate Stone   static void InitializePrivate();
387ba456807SPavel Labath 
388b9c1b51eSKate Stone   static void InitializeInterpreter(
389b9c1b51eSKate Stone       SWIGInitCallback python_swig_init_callback,
3902c1f46dcSZachary Turner       SWIGBreakpointCallbackFunction swig_breakpoint_callback,
3912c1f46dcSZachary Turner       SWIGWatchpointCallbackFunction swig_watchpoint_callback,
3922c1f46dcSZachary Turner       SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
3932c1f46dcSZachary Turner       SWIGPythonCreateSyntheticProvider swig_synthetic_script,
3942c1f46dcSZachary Turner       SWIGPythonCreateCommandObject swig_create_cmd,
3952c1f46dcSZachary Turner       SWIGPythonCalculateNumChildren swig_calc_children,
3962c1f46dcSZachary Turner       SWIGPythonGetChildAtIndex swig_get_child_index,
3972c1f46dcSZachary Turner       SWIGPythonGetIndexOfChildWithName swig_get_index_child,
3982c1f46dcSZachary Turner       SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue,
3992c1f46dcSZachary Turner       SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
4002c1f46dcSZachary Turner       SWIGPythonUpdateSynthProviderInstance swig_update_provider,
401b9c1b51eSKate Stone       SWIGPythonMightHaveChildrenSynthProviderInstance
402b9c1b51eSKate Stone           swig_mighthavechildren_provider,
4032c1f46dcSZachary Turner       SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
4042c1f46dcSZachary Turner       SWIGPythonCallCommand swig_call_command,
4052c1f46dcSZachary Turner       SWIGPythonCallCommandObject swig_call_command_object,
4062c1f46dcSZachary Turner       SWIGPythonCallModuleInit swig_call_module_init,
4072c1f46dcSZachary Turner       SWIGPythonCreateOSPlugin swig_create_os_plugin,
4082c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
4092c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
4102c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
4112c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
4122c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
4132c1f46dcSZachary Turner       SWIGPython_GetDynamicSetting swig_plugin_get,
4142c1f46dcSZachary Turner       SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
4152c1f46dcSZachary Turner       SWIGPythonCallThreadPlan swig_call_thread_plan);
4162c1f46dcSZachary Turner 
417b9c1b51eSKate Stone   const char *GetDictionaryName() { return m_dictionary_name.c_str(); }
4182c1f46dcSZachary Turner 
419b9c1b51eSKate Stone   PyThreadState *GetThreadState() { return m_command_thread_state; }
4202c1f46dcSZachary Turner 
421b9c1b51eSKate Stone   void SetThreadState(PyThreadState *s) {
4222c1f46dcSZachary Turner     if (s)
4232c1f46dcSZachary Turner       m_command_thread_state = s;
4242c1f46dcSZachary Turner   }
4252c1f46dcSZachary Turner 
4262c1f46dcSZachary Turner   //----------------------------------------------------------------------
4272c1f46dcSZachary Turner   // IOHandlerDelegate
4282c1f46dcSZachary Turner   //----------------------------------------------------------------------
429b9c1b51eSKate Stone   void IOHandlerActivated(IOHandler &io_handler) override;
4302c1f46dcSZachary Turner 
431b9c1b51eSKate Stone   void IOHandlerInputComplete(IOHandler &io_handler,
432b9c1b51eSKate Stone                               std::string &data) override;
4332c1f46dcSZachary Turner 
4342c1f46dcSZachary Turner   //------------------------------------------------------------------
4352c1f46dcSZachary Turner   // Static Functions
4362c1f46dcSZachary Turner   //------------------------------------------------------------------
437b9c1b51eSKate Stone   static void Initialize();
4382c1f46dcSZachary Turner 
439b9c1b51eSKate Stone   static void Terminate();
4402c1f46dcSZachary Turner 
4412c1f46dcSZachary Turner   static lldb::ScriptInterpreterSP
4422c1f46dcSZachary Turner   CreateInstance(CommandInterpreter &interpreter);
4432c1f46dcSZachary Turner 
444b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
4452c1f46dcSZachary Turner 
446b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
4472c1f46dcSZachary Turner 
4482c1f46dcSZachary Turner   //------------------------------------------------------------------
4492c1f46dcSZachary Turner   // PluginInterface protocol
4502c1f46dcSZachary Turner   //------------------------------------------------------------------
451b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
4522c1f46dcSZachary Turner 
453b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
4542c1f46dcSZachary Turner 
455b9c1b51eSKate Stone   class Locker : public ScriptInterpreterLocker {
4562c1f46dcSZachary Turner   public:
457b9c1b51eSKate Stone     enum OnEntry {
4582c1f46dcSZachary Turner       AcquireLock = 0x0001,
4592c1f46dcSZachary Turner       InitSession = 0x0002,
4602c1f46dcSZachary Turner       InitGlobals = 0x0004,
4612c1f46dcSZachary Turner       NoSTDIN = 0x0008
4622c1f46dcSZachary Turner     };
4632c1f46dcSZachary Turner 
464b9c1b51eSKate Stone     enum OnLeave {
4652c1f46dcSZachary Turner       FreeLock = 0x0001,
466b9c1b51eSKate Stone       FreeAcquiredLock = 0x0002, // do not free the lock if we already held it
467b9c1b51eSKate Stone                                  // when calling constructor
4682c1f46dcSZachary Turner       TearDownSession = 0x0004
4692c1f46dcSZachary Turner     };
4702c1f46dcSZachary Turner 
471edb35d95SEugene Zelenko     Locker(ScriptInterpreterPython *py_interpreter = nullptr,
4722c1f46dcSZachary Turner            uint16_t on_entry = AcquireLock | InitSession,
473b9c1b51eSKate Stone            uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr,
474b9c1b51eSKate Stone            FILE *out = nullptr, FILE *err = nullptr);
4752c1f46dcSZachary Turner 
476280eb8abSPavel Labath     ~Locker() override;
4772c1f46dcSZachary Turner 
4782c1f46dcSZachary Turner   private:
479b9c1b51eSKate Stone     bool DoAcquireLock();
4802c1f46dcSZachary Turner 
481b9c1b51eSKate Stone     bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
4822c1f46dcSZachary Turner 
483b9c1b51eSKate Stone     bool DoFreeLock();
4842c1f46dcSZachary Turner 
485b9c1b51eSKate Stone     bool DoTearDownSession();
4862c1f46dcSZachary Turner 
487b9c1b51eSKate Stone     static void ReleasePythonLock();
4882c1f46dcSZachary Turner 
4892c1f46dcSZachary Turner     bool m_teardown_session;
4902c1f46dcSZachary Turner     ScriptInterpreterPython *m_python_interpreter;
4912c1f46dcSZachary Turner     //    	FILE*                    m_tmp_fh;
4922c1f46dcSZachary Turner     PyGILState_STATE m_GILState;
4932c1f46dcSZachary Turner   };
494edb35d95SEugene Zelenko 
4952c1f46dcSZachary Turner protected:
496b9c1b51eSKate Stone   class SynchronicityHandler {
497edb35d95SEugene Zelenko   private:
498edb35d95SEugene Zelenko     lldb::DebuggerSP m_debugger_sp;
499edb35d95SEugene Zelenko     ScriptedCommandSynchronicity m_synch_wanted;
500edb35d95SEugene Zelenko     bool m_old_asynch;
501edb35d95SEugene Zelenko 
502edb35d95SEugene Zelenko   public:
503b9c1b51eSKate Stone     SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity);
504edb35d95SEugene Zelenko 
505edb35d95SEugene Zelenko     ~SynchronicityHandler();
506edb35d95SEugene Zelenko   };
5079c40264fSZachary Turner 
508b9c1b51eSKate Stone   enum class AddLocation { Beginning, End };
5092c1f46dcSZachary Turner 
5102c1f46dcSZachary Turner   static void AddToSysPath(AddLocation location, std::string path);
5112c1f46dcSZachary Turner 
512b9c1b51eSKate Stone   bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
513edb35d95SEugene Zelenko 
514b9c1b51eSKate Stone   void LeaveSession();
515edb35d95SEugene Zelenko 
516b9c1b51eSKate Stone   void SaveTerminalState(int fd);
517edb35d95SEugene Zelenko 
518b9c1b51eSKate Stone   void RestoreTerminalState();
519edb35d95SEugene Zelenko 
520b9c1b51eSKate Stone   uint32_t IsExecutingPython() const { return m_lock_count > 0; }
5212c1f46dcSZachary Turner 
522b9c1b51eSKate Stone   uint32_t IncrementLockCount() { return ++m_lock_count; }
5232c1f46dcSZachary Turner 
524b9c1b51eSKate Stone   uint32_t DecrementLockCount() {
5252c1f46dcSZachary Turner     if (m_lock_count > 0)
5262c1f46dcSZachary Turner       --m_lock_count;
5272c1f46dcSZachary Turner     return m_lock_count;
5282c1f46dcSZachary Turner   }
5292c1f46dcSZachary Turner 
5302c1f46dcSZachary Turner   enum ActiveIOHandler {
5312c1f46dcSZachary Turner     eIOHandlerNone,
5322c1f46dcSZachary Turner     eIOHandlerBreakpoint,
5332c1f46dcSZachary Turner     eIOHandlerWatchpoint
5342c1f46dcSZachary Turner   };
535f8b22f8fSZachary Turner 
536f8b22f8fSZachary Turner   PythonObject &GetMainModule();
5372c1f46dcSZachary Turner 
538b9c1b51eSKate Stone   PythonDictionary &GetSessionDictionary();
5392c1f46dcSZachary Turner 
540b9c1b51eSKate Stone   PythonDictionary &GetSysModuleDictionary();
5412c1f46dcSZachary Turner 
542b9c1b51eSKate Stone   bool GetEmbeddedInterpreterModuleObjects();
5432c1f46dcSZachary Turner 
544b9c1b51eSKate Stone   bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file,
545b9c1b51eSKate Stone                     const char *mode);
546a31baf08SGreg Clayton 
54732064024SZachary Turner   PythonFile m_saved_stdin;
54832064024SZachary Turner   PythonFile m_saved_stdout;
54932064024SZachary Turner   PythonFile m_saved_stderr;
5502c1f46dcSZachary Turner   PythonObject m_main_module;
5512c1f46dcSZachary Turner   PythonObject m_lldb_module;
5522c1f46dcSZachary Turner   PythonDictionary m_session_dict;
5532c1f46dcSZachary Turner   PythonDictionary m_sys_module_dict;
5542c1f46dcSZachary Turner   PythonObject m_run_one_line_function;
5552c1f46dcSZachary Turner   PythonObject m_run_one_line_str_global;
5562c1f46dcSZachary Turner   std::string m_dictionary_name;
5572c1f46dcSZachary Turner   TerminalState m_terminal_state;
5582c1f46dcSZachary Turner   ActiveIOHandler m_active_io_handler;
5592c1f46dcSZachary Turner   bool m_session_is_active;
5602c1f46dcSZachary Turner   bool m_pty_slave_is_open;
5612c1f46dcSZachary Turner   bool m_valid_session;
5622c1f46dcSZachary Turner   uint32_t m_lock_count;
5632c1f46dcSZachary Turner   PyThreadState *m_command_thread_state;
5642c1f46dcSZachary Turner };
565edb35d95SEugene Zelenko 
5662c1f46dcSZachary Turner } // namespace lldb_private
5672c1f46dcSZachary Turner 
568280eb8abSPavel Labath #endif // LLDB_DISABLE_PYTHON
5692c1f46dcSZachary Turner 
570280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
571