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 
843815e702SJim Ingham   typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)(
853815e702SJim Ingham       const char *python_class_name, const char *session_dictionary_name,
863815e702SJim Ingham       lldb_private::StructuredDataImpl *args_impl,
873815e702SJim Ingham       lldb::BreakpointSP &bkpt_sp);
883815e702SJim Ingham 
893815e702SJim Ingham   typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor,
903815e702SJim Ingham                                           const char *method_name,
913815e702SJim Ingham                                           lldb_private::SymbolContext *sym_ctx);
923815e702SJim 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 
97*41ae8e74SKuba Mracek   typedef void *(*SWIGPythonCreateFrameRecognizer)(
98*41ae8e74SKuba Mracek       const char *python_class_name, const char *session_dictionary_name);
99*41ae8e74SKuba Mracek 
100*41ae8e74SKuba Mracek   typedef void *(*SWIGPythonGetRecognizedArguments)(
101*41ae8e74SKuba Mracek       void *implementor, const lldb::StackFrameSP &frame_sp);
102*41ae8e74SKuba Mracek 
103b9c1b51eSKate Stone   typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor,
104b9c1b51eSKate Stone                                                    uint32_t max);
105edb35d95SEugene Zelenko 
1062c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx);
107edb35d95SEugene Zelenko 
108b9c1b51eSKate Stone   typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor,
109b9c1b51eSKate Stone                                                    const char *child_name);
110edb35d95SEugene Zelenko 
1112c1f46dcSZachary Turner   typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data);
112edb35d95SEugene Zelenko 
113b9c1b51eSKate Stone   typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)(
114b9c1b51eSKate Stone       void *data);
115edb35d95SEugene Zelenko 
1162c1f46dcSZachary Turner   typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data);
117edb35d95SEugene Zelenko 
1182c1f46dcSZachary Turner   typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data);
119edb35d95SEugene Zelenko 
1202c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor);
1212c1f46dcSZachary Turner 
122b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommand)(
123b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
124b9c1b51eSKate Stone       lldb::DebuggerSP &debugger, const char *args,
1252c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1262c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1272c1f46dcSZachary Turner 
128b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommandObject)(
129b9c1b51eSKate Stone       void *implementor, lldb::DebuggerSP &debugger, const char *args,
1302c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1312c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1322c1f46dcSZachary Turner 
1332c1f46dcSZachary Turner   typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name,
1342c1f46dcSZachary Turner                                            const char *session_dictionary_name,
1352c1f46dcSZachary Turner                                            lldb::DebuggerSP &debugger);
1362c1f46dcSZachary Turner 
137b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Process)(
138b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
139b9c1b51eSKate Stone       lldb::ProcessSP &process, std::string &output);
140edb35d95SEugene Zelenko 
141b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Thread)(
142b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
143b9c1b51eSKate Stone       lldb::ThreadSP &thread, std::string &output);
1442c1f46dcSZachary Turner 
145b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Target)(
146b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
147b9c1b51eSKate Stone       lldb::TargetSP &target, std::string &output);
1482c1f46dcSZachary Turner 
149b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Frame)(
150b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
151b9c1b51eSKate Stone       lldb::StackFrameSP &frame, std::string &output);
1522c1f46dcSZachary Turner 
153b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Value)(
154b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
155b9c1b51eSKate Stone       lldb::ValueObjectSP &value, std::string &output);
1562c1f46dcSZachary Turner 
157b9c1b51eSKate Stone   typedef void *(*SWIGPython_GetDynamicSetting)(
158b9c1b51eSKate Stone       void *module, const char *setting, const lldb::TargetSP &target_sp);
1592c1f46dcSZachary Turner 
1602c1f46dcSZachary Turner   friend class ::IOHandlerPythonInterpreter;
1612c1f46dcSZachary Turner 
1622c1f46dcSZachary Turner   ScriptInterpreterPython(CommandInterpreter &interpreter);
1632c1f46dcSZachary Turner 
164280eb8abSPavel Labath   ~ScriptInterpreterPython() override;
1652c1f46dcSZachary Turner 
166b9c1b51eSKate Stone   bool Interrupt() override;
1672c1f46dcSZachary Turner 
168b9c1b51eSKate Stone   bool ExecuteOneLine(
1694d51a902SRaphael Isemann       llvm::StringRef command, CommandReturnObject *result,
1702c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1712c1f46dcSZachary Turner 
172b9c1b51eSKate Stone   void ExecuteInterpreterLoop() override;
1732c1f46dcSZachary Turner 
174b9c1b51eSKate Stone   bool ExecuteOneLineWithReturn(
1754d51a902SRaphael Isemann       llvm::StringRef in_string,
1764d51a902SRaphael Isemann       ScriptInterpreter::ScriptReturnType return_type, void *ret_value,
1772c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1782c1f46dcSZachary Turner 
17997206d57SZachary Turner   lldb_private::Status ExecuteMultipleLines(
180b9c1b51eSKate Stone       const char *in_string,
1812c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1822c1f46dcSZachary Turner 
18397206d57SZachary Turner   Status
1842c1f46dcSZachary Turner   ExportFunctionDefinitionToInterpreter(StringList &function_def) override;
1852c1f46dcSZachary Turner 
186b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(StringList &input, std::string &output,
187b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1882c1f46dcSZachary Turner 
189b9c1b51eSKate Stone   bool GenerateTypeSynthClass(StringList &input, std::string &output,
190b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1912c1f46dcSZachary Turner 
192b9c1b51eSKate Stone   bool GenerateTypeSynthClass(const char *oneliner, std::string &output,
193b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1942c1f46dcSZachary Turner 
1952c1f46dcSZachary Turner   // use this if the function code is just a one-liner script
196b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(const char *oneliner, std::string &output,
197b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1982c1f46dcSZachary Turner 
199b9c1b51eSKate Stone   bool GenerateScriptAliasFunction(StringList &input,
200b9c1b51eSKate Stone                                    std::string &output) override;
2012c1f46dcSZachary Turner 
202b9c1b51eSKate Stone   StructuredData::ObjectSP
203b9c1b51eSKate Stone   CreateSyntheticScriptedProvider(const char *class_name,
204b9c1b51eSKate Stone                                   lldb::ValueObjectSP valobj) override;
2052c1f46dcSZachary Turner 
206b9c1b51eSKate Stone   StructuredData::GenericSP
207b9c1b51eSKate Stone   CreateScriptCommandObject(const char *class_name) override;
2082c1f46dcSZachary Turner 
209b9c1b51eSKate Stone   StructuredData::ObjectSP
210b9c1b51eSKate Stone   CreateScriptedThreadPlan(const char *class_name,
211b9c1b51eSKate Stone                            lldb::ThreadPlanSP thread_plan) override;
2122c1f46dcSZachary Turner 
213b9c1b51eSKate Stone   bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
214b9c1b51eSKate Stone                                       Event *event,
215b9c1b51eSKate Stone                                       bool &script_error) override;
216edb35d95SEugene Zelenko 
217b9c1b51eSKate Stone   bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
218b9c1b51eSKate Stone                                     Event *event, bool &script_error) override;
219edb35d95SEugene Zelenko 
220b9c1b51eSKate Stone   bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
221b9c1b51eSKate Stone                                  bool &script_error) override;
222c915a7d2SJim Ingham 
223b9c1b51eSKate Stone   lldb::StateType
224b9c1b51eSKate Stone   ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
225b9c1b51eSKate Stone                                 bool &script_error) override;
2262c1f46dcSZachary Turner 
227b9c1b51eSKate Stone   StructuredData::GenericSP
2283815e702SJim Ingham   CreateScriptedBreakpointResolver(const char *class_name,
2293815e702SJim Ingham                                    StructuredDataImpl *args_data,
2303815e702SJim Ingham                                    lldb::BreakpointSP &bkpt_sp) override;
2313815e702SJim Ingham   bool
2323815e702SJim Ingham   ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP
2333815e702SJim Ingham                                                implementor_sp,
2343815e702SJim Ingham                                            SymbolContext *sym_ctx) override;
2353815e702SJim Ingham 
2363815e702SJim Ingham   lldb::SearchDepth
2373815e702SJim Ingham   ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP
2383815e702SJim Ingham                                             implementor_sp) override;
2393815e702SJim Ingham 
2403815e702SJim Ingham   StructuredData::GenericSP
241*41ae8e74SKuba Mracek   CreateFrameRecognizer(const char *class_name) override;
242*41ae8e74SKuba Mracek 
243*41ae8e74SKuba Mracek   lldb::ValueObjectListSP
244*41ae8e74SKuba Mracek   GetRecognizedArguments(const StructuredData::ObjectSP &implementor,
245*41ae8e74SKuba Mracek                          lldb::StackFrameSP frame_sp) override;
246*41ae8e74SKuba Mracek 
247*41ae8e74SKuba Mracek   StructuredData::GenericSP
248b9c1b51eSKate Stone   OSPlugin_CreatePluginObject(const char *class_name,
249b9c1b51eSKate Stone                               lldb::ProcessSP process_sp) override;
2502c1f46dcSZachary Turner 
251b9c1b51eSKate Stone   StructuredData::DictionarySP
252b9c1b51eSKate Stone   OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2532c1f46dcSZachary Turner 
254b9c1b51eSKate Stone   StructuredData::ArraySP
255b9c1b51eSKate Stone   OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2562c1f46dcSZachary Turner 
257b9c1b51eSKate Stone   StructuredData::StringSP
258b9c1b51eSKate Stone   OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp,
259b9c1b51eSKate Stone                                lldb::tid_t thread_id) override;
2602c1f46dcSZachary Turner 
261b9c1b51eSKate Stone   StructuredData::DictionarySP
262b9c1b51eSKate Stone   OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp,
263b9c1b51eSKate Stone                         lldb::tid_t tid, lldb::addr_t context) override;
2642c1f46dcSZachary Turner 
265b9c1b51eSKate Stone   StructuredData::ObjectSP
266b9c1b51eSKate Stone   LoadPluginModule(const FileSpec &file_spec,
26797206d57SZachary Turner                    lldb_private::Status &error) override;
2682c1f46dcSZachary Turner 
269b9c1b51eSKate Stone   StructuredData::DictionarySP
270b9c1b51eSKate Stone   GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target,
271b9c1b51eSKate Stone                      const char *setting_name,
27297206d57SZachary Turner                      lldb_private::Status &error) override;
2732c1f46dcSZachary Turner 
274b9c1b51eSKate Stone   size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor,
275b9c1b51eSKate Stone                               uint32_t max) override;
2762c1f46dcSZachary Turner 
277b9c1b51eSKate Stone   lldb::ValueObjectSP
278b9c1b51eSKate Stone   GetChildAtIndex(const StructuredData::ObjectSP &implementor,
279b9c1b51eSKate Stone                   uint32_t idx) override;
2802c1f46dcSZachary Turner 
281b9c1b51eSKate Stone   int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
282b9c1b51eSKate Stone                               const char *child_name) override;
2832c1f46dcSZachary Turner 
284b9c1b51eSKate Stone   bool UpdateSynthProviderInstance(
285b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2862c1f46dcSZachary Turner 
287b9c1b51eSKate Stone   bool MightHaveChildrenSynthProviderInstance(
288b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2892c1f46dcSZachary Turner 
290b9c1b51eSKate Stone   lldb::ValueObjectSP
291b9c1b51eSKate Stone   GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
292b9c1b51eSKate Stone 
293b9c1b51eSKate Stone   ConstString
294b9c1b51eSKate Stone   GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override;
2956eec8d6cSEnrico Granata 
2962c1f46dcSZachary Turner   bool
2974d51a902SRaphael Isemann   RunScriptBasedCommand(const char *impl_function, llvm::StringRef args,
2982c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2992c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
30097206d57SZachary Turner                         Status &error,
3012c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
3022c1f46dcSZachary Turner 
3034d51a902SRaphael Isemann   bool RunScriptBasedCommand(
3044d51a902SRaphael Isemann       StructuredData::GenericSP impl_obj_sp, llvm::StringRef args,
3052c1f46dcSZachary Turner       ScriptedCommandSynchronicity synchronicity,
3064d51a902SRaphael Isemann       lldb_private::CommandReturnObject &cmd_retobj, Status &error,
3072c1f46dcSZachary Turner       const lldb_private::ExecutionContext &exe_ctx) override;
3082c1f46dcSZachary Turner 
30997206d57SZachary Turner   Status GenerateFunction(const char *signature,
310b9c1b51eSKate Stone                           const StringList &input) override;
3112c1f46dcSZachary Turner 
31297206d57SZachary Turner   Status GenerateBreakpointCommandCallbackData(StringList &input,
313b9c1b51eSKate Stone                                                std::string &output) override;
3142c1f46dcSZachary Turner 
315b9c1b51eSKate Stone   bool GenerateWatchpointCommandCallbackData(StringList &input,
316b9c1b51eSKate Stone                                              std::string &output) override;
3172c1f46dcSZachary Turner 
3182c1f46dcSZachary Turner   //    static size_t
3192c1f46dcSZachary Turner   //    GenerateBreakpointOptionsCommandCallback (void *baton,
3202c1f46dcSZachary Turner   //                                              InputReader &reader,
321b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
322b9c1b51eSKate Stone   //                                              notification,
3232c1f46dcSZachary Turner   //                                              const char *bytes,
3242c1f46dcSZachary Turner   //                                              size_t bytes_len);
3252c1f46dcSZachary Turner   //
3262c1f46dcSZachary Turner   //    static size_t
3272c1f46dcSZachary Turner   //    GenerateWatchpointOptionsCommandCallback (void *baton,
3282c1f46dcSZachary Turner   //                                              InputReader &reader,
329b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
330b9c1b51eSKate Stone   //                                              notification,
3312c1f46dcSZachary Turner   //                                              const char *bytes,
3322c1f46dcSZachary Turner   //                                              size_t bytes_len);
3332c1f46dcSZachary Turner 
334b9c1b51eSKate Stone   static bool BreakpointCallbackFunction(void *baton,
3352c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3362c1f46dcSZachary Turner                                          lldb::user_id_t break_id,
3372c1f46dcSZachary Turner                                          lldb::user_id_t break_loc_id);
3382c1f46dcSZachary Turner 
339b9c1b51eSKate Stone   static bool WatchpointCallbackFunction(void *baton,
3402c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3412c1f46dcSZachary Turner                                          lldb::user_id_t watch_id);
3422c1f46dcSZachary Turner 
343b9c1b51eSKate Stone   bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj,
344b9c1b51eSKate Stone                           StructuredData::ObjectSP &callee_wrapper_sp,
345b9c1b51eSKate Stone                           const TypeSummaryOptions &options,
346b9c1b51eSKate Stone                           std::string &retval) override;
3472c1f46dcSZachary Turner 
348b9c1b51eSKate Stone   void Clear() override;
3492c1f46dcSZachary Turner 
350b9c1b51eSKate Stone   bool GetDocumentationForItem(const char *item, std::string &dest) override;
3512c1f46dcSZachary Turner 
352b9c1b51eSKate Stone   bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
353b9c1b51eSKate Stone                                     std::string &dest) override;
3542c1f46dcSZachary Turner 
3552c1f46dcSZachary Turner   uint32_t
3562c1f46dcSZachary Turner   GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override;
3572c1f46dcSZachary Turner 
358b9c1b51eSKate Stone   bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
359b9c1b51eSKate Stone                                    std::string &dest) override;
3602c1f46dcSZachary Turner 
361b9c1b51eSKate Stone   bool CheckObjectExists(const char *name) override {
3622c1f46dcSZachary Turner     if (!name || !name[0])
3632c1f46dcSZachary Turner       return false;
3642c1f46dcSZachary Turner     std::string temp;
3652c1f46dcSZachary Turner     return GetDocumentationForItem(name, temp);
3662c1f46dcSZachary Turner   }
3672c1f46dcSZachary Turner 
368b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Process *process,
36997206d57SZachary Turner                               std::string &output, Status &error) override;
370b9c1b51eSKate Stone 
371b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Thread *thread,
37297206d57SZachary Turner                               std::string &output, Status &error) override;
373b9c1b51eSKate Stone 
374b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Target *target,
37597206d57SZachary Turner                               std::string &output, Status &error) override;
376b9c1b51eSKate Stone 
377b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame,
37897206d57SZachary Turner                               std::string &output, Status &error) override;
379b9c1b51eSKate Stone 
380b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value,
38197206d57SZachary Turner                               std::string &output, Status &error) override;
3822c1f46dcSZachary Turner 
3832c1f46dcSZachary Turner   bool
384b9c1b51eSKate Stone   LoadScriptingModule(const char *filename, bool can_reload, bool init_session,
38597206d57SZachary Turner                       lldb_private::Status &error,
3862c1f46dcSZachary Turner                       StructuredData::ObjectSP *module_sp = nullptr) override;
3872c1f46dcSZachary Turner 
388b9c1b51eSKate Stone   bool IsReservedWord(const char *word) override;
3892c1f46dcSZachary Turner 
390b9c1b51eSKate Stone   std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override;
3912c1f46dcSZachary Turner 
392b9c1b51eSKate Stone   void CollectDataForBreakpointCommandCallback(
393b9c1b51eSKate Stone       std::vector<BreakpointOptions *> &bp_options_vec,
3942c1f46dcSZachary Turner       CommandReturnObject &result) override;
3952c1f46dcSZachary Turner 
3962c1f46dcSZachary Turner   void
3972c1f46dcSZachary Turner   CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options,
3982c1f46dcSZachary Turner                                           CommandReturnObject &result) override;
3992c1f46dcSZachary Turner 
4002c1f46dcSZachary Turner   /// Set the callback body text into the callback for the breakpoint.
40197206d57SZachary Turner   Status SetBreakpointCommandCallback(BreakpointOptions *bp_options,
4022c1f46dcSZachary Turner                                       const char *callback_body) override;
4032c1f46dcSZachary Turner 
404b9c1b51eSKate Stone   void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options,
4052c1f46dcSZachary Turner                                             const char *function_name) override;
4062c1f46dcSZachary Turner 
407f7e07256SJim Ingham   /// This one is for deserialization:
40897206d57SZachary Turner   Status SetBreakpointCommandCallback(
409f7e07256SJim Ingham       BreakpointOptions *bp_options,
410f7e07256SJim Ingham       std::unique_ptr<BreakpointOptions::CommandData> &data_up) override;
411f7e07256SJim Ingham 
4122c1f46dcSZachary Turner   /// Set a one-liner as the callback for the watchpoint.
413b9c1b51eSKate Stone   void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
4142c1f46dcSZachary Turner                                     const char *oneliner) override;
4152c1f46dcSZachary Turner 
416b9c1b51eSKate Stone   StringList ReadCommandInputFromUser(FILE *in_file);
4172c1f46dcSZachary Turner 
4182c1f46dcSZachary Turner   void ResetOutputFileHandle(FILE *new_fh) override;
4192c1f46dcSZachary Turner 
420b9c1b51eSKate Stone   static void InitializePrivate();
421ba456807SPavel Labath 
422b9c1b51eSKate Stone   static void InitializeInterpreter(
423b9c1b51eSKate Stone       SWIGInitCallback python_swig_init_callback,
4242c1f46dcSZachary Turner       SWIGBreakpointCallbackFunction swig_breakpoint_callback,
4252c1f46dcSZachary Turner       SWIGWatchpointCallbackFunction swig_watchpoint_callback,
4262c1f46dcSZachary Turner       SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
4272c1f46dcSZachary Turner       SWIGPythonCreateSyntheticProvider swig_synthetic_script,
4282c1f46dcSZachary Turner       SWIGPythonCreateCommandObject swig_create_cmd,
4292c1f46dcSZachary Turner       SWIGPythonCalculateNumChildren swig_calc_children,
4302c1f46dcSZachary Turner       SWIGPythonGetChildAtIndex swig_get_child_index,
4312c1f46dcSZachary Turner       SWIGPythonGetIndexOfChildWithName swig_get_index_child,
4322c1f46dcSZachary Turner       SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue,
4332c1f46dcSZachary Turner       SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
4342c1f46dcSZachary Turner       SWIGPythonUpdateSynthProviderInstance swig_update_provider,
435b9c1b51eSKate Stone       SWIGPythonMightHaveChildrenSynthProviderInstance
436b9c1b51eSKate Stone           swig_mighthavechildren_provider,
4372c1f46dcSZachary Turner       SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
4382c1f46dcSZachary Turner       SWIGPythonCallCommand swig_call_command,
4392c1f46dcSZachary Turner       SWIGPythonCallCommandObject swig_call_command_object,
4402c1f46dcSZachary Turner       SWIGPythonCallModuleInit swig_call_module_init,
4412c1f46dcSZachary Turner       SWIGPythonCreateOSPlugin swig_create_os_plugin,
442*41ae8e74SKuba Mracek       SWIGPythonCreateFrameRecognizer swig_create_frame_recognizer,
443*41ae8e74SKuba Mracek       SWIGPythonGetRecognizedArguments swig_get_recognized_arguments,
4442c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
4452c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
4462c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
4472c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
4482c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
4492c1f46dcSZachary Turner       SWIGPython_GetDynamicSetting swig_plugin_get,
4502c1f46dcSZachary Turner       SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
4513815e702SJim Ingham       SWIGPythonCallThreadPlan swig_call_thread_plan,
4523815e702SJim Ingham       SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script,
4533815e702SJim Ingham       SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver);
4542c1f46dcSZachary Turner 
455b9c1b51eSKate Stone   const char *GetDictionaryName() { return m_dictionary_name.c_str(); }
4562c1f46dcSZachary Turner 
457b9c1b51eSKate Stone   PyThreadState *GetThreadState() { return m_command_thread_state; }
4582c1f46dcSZachary Turner 
459b9c1b51eSKate Stone   void SetThreadState(PyThreadState *s) {
4602c1f46dcSZachary Turner     if (s)
4612c1f46dcSZachary Turner       m_command_thread_state = s;
4622c1f46dcSZachary Turner   }
4632c1f46dcSZachary Turner 
4642c1f46dcSZachary Turner   //----------------------------------------------------------------------
4652c1f46dcSZachary Turner   // IOHandlerDelegate
4662c1f46dcSZachary Turner   //----------------------------------------------------------------------
467b9c1b51eSKate Stone   void IOHandlerActivated(IOHandler &io_handler) override;
4682c1f46dcSZachary Turner 
469b9c1b51eSKate Stone   void IOHandlerInputComplete(IOHandler &io_handler,
470b9c1b51eSKate Stone                               std::string &data) override;
4712c1f46dcSZachary Turner 
4722c1f46dcSZachary Turner   //------------------------------------------------------------------
4732c1f46dcSZachary Turner   // Static Functions
4742c1f46dcSZachary Turner   //------------------------------------------------------------------
475b9c1b51eSKate Stone   static void Initialize();
4762c1f46dcSZachary Turner 
477b9c1b51eSKate Stone   static void Terminate();
4782c1f46dcSZachary Turner 
4792c1f46dcSZachary Turner   static lldb::ScriptInterpreterSP
4802c1f46dcSZachary Turner   CreateInstance(CommandInterpreter &interpreter);
4812c1f46dcSZachary Turner 
482b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
4832c1f46dcSZachary Turner 
484b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
4852c1f46dcSZachary Turner 
4862df331b0SPavel Labath   static FileSpec GetPythonDir();
4872df331b0SPavel Labath 
4882c1f46dcSZachary Turner   //------------------------------------------------------------------
4892c1f46dcSZachary Turner   // PluginInterface protocol
4902c1f46dcSZachary Turner   //------------------------------------------------------------------
491b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
4922c1f46dcSZachary Turner 
493b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
4942c1f46dcSZachary Turner 
495b9c1b51eSKate Stone   class Locker : public ScriptInterpreterLocker {
4962c1f46dcSZachary Turner   public:
497b9c1b51eSKate Stone     enum OnEntry {
4982c1f46dcSZachary Turner       AcquireLock = 0x0001,
4992c1f46dcSZachary Turner       InitSession = 0x0002,
5002c1f46dcSZachary Turner       InitGlobals = 0x0004,
5012c1f46dcSZachary Turner       NoSTDIN = 0x0008
5022c1f46dcSZachary Turner     };
5032c1f46dcSZachary Turner 
504b9c1b51eSKate Stone     enum OnLeave {
5052c1f46dcSZachary Turner       FreeLock = 0x0001,
506b9c1b51eSKate Stone       FreeAcquiredLock = 0x0002, // do not free the lock if we already held it
507b9c1b51eSKate Stone                                  // when calling constructor
5082c1f46dcSZachary Turner       TearDownSession = 0x0004
5092c1f46dcSZachary Turner     };
5102c1f46dcSZachary Turner 
511edb35d95SEugene Zelenko     Locker(ScriptInterpreterPython *py_interpreter = nullptr,
5122c1f46dcSZachary Turner            uint16_t on_entry = AcquireLock | InitSession,
513b9c1b51eSKate Stone            uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr,
514b9c1b51eSKate Stone            FILE *out = nullptr, FILE *err = nullptr);
5152c1f46dcSZachary Turner 
516280eb8abSPavel Labath     ~Locker() override;
5172c1f46dcSZachary Turner 
5182c1f46dcSZachary Turner   private:
519b9c1b51eSKate Stone     bool DoAcquireLock();
5202c1f46dcSZachary Turner 
521b9c1b51eSKate Stone     bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
5222c1f46dcSZachary Turner 
523b9c1b51eSKate Stone     bool DoFreeLock();
5242c1f46dcSZachary Turner 
525b9c1b51eSKate Stone     bool DoTearDownSession();
5262c1f46dcSZachary Turner 
527b9c1b51eSKate Stone     static void ReleasePythonLock();
5282c1f46dcSZachary Turner 
5292c1f46dcSZachary Turner     bool m_teardown_session;
5302c1f46dcSZachary Turner     ScriptInterpreterPython *m_python_interpreter;
5312c1f46dcSZachary Turner     //    	FILE*                    m_tmp_fh;
5322c1f46dcSZachary Turner     PyGILState_STATE m_GILState;
5332c1f46dcSZachary Turner   };
534edb35d95SEugene Zelenko 
5352c1f46dcSZachary Turner protected:
536b9c1b51eSKate Stone   class SynchronicityHandler {
537edb35d95SEugene Zelenko   private:
538edb35d95SEugene Zelenko     lldb::DebuggerSP m_debugger_sp;
539edb35d95SEugene Zelenko     ScriptedCommandSynchronicity m_synch_wanted;
540edb35d95SEugene Zelenko     bool m_old_asynch;
541edb35d95SEugene Zelenko 
542edb35d95SEugene Zelenko   public:
543b9c1b51eSKate Stone     SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity);
544edb35d95SEugene Zelenko 
545edb35d95SEugene Zelenko     ~SynchronicityHandler();
546edb35d95SEugene Zelenko   };
5479c40264fSZachary Turner 
548b9c1b51eSKate Stone   enum class AddLocation { Beginning, End };
5492c1f46dcSZachary Turner 
5502c1f46dcSZachary Turner   static void AddToSysPath(AddLocation location, std::string path);
5512c1f46dcSZachary Turner 
5522df331b0SPavel Labath   static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path);
5532df331b0SPavel Labath   static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path);
5542df331b0SPavel Labath   static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path);
5552df331b0SPavel Labath 
556b9c1b51eSKate Stone   bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
557edb35d95SEugene Zelenko 
558b9c1b51eSKate Stone   void LeaveSession();
559edb35d95SEugene Zelenko 
560b9c1b51eSKate Stone   void SaveTerminalState(int fd);
561edb35d95SEugene Zelenko 
562b9c1b51eSKate Stone   void RestoreTerminalState();
563edb35d95SEugene Zelenko 
564b9c1b51eSKate Stone   uint32_t IsExecutingPython() const { return m_lock_count > 0; }
5652c1f46dcSZachary Turner 
566b9c1b51eSKate Stone   uint32_t IncrementLockCount() { return ++m_lock_count; }
5672c1f46dcSZachary Turner 
568b9c1b51eSKate Stone   uint32_t DecrementLockCount() {
5692c1f46dcSZachary Turner     if (m_lock_count > 0)
5702c1f46dcSZachary Turner       --m_lock_count;
5712c1f46dcSZachary Turner     return m_lock_count;
5722c1f46dcSZachary Turner   }
5732c1f46dcSZachary Turner 
5742c1f46dcSZachary Turner   enum ActiveIOHandler {
5752c1f46dcSZachary Turner     eIOHandlerNone,
5762c1f46dcSZachary Turner     eIOHandlerBreakpoint,
5772c1f46dcSZachary Turner     eIOHandlerWatchpoint
5782c1f46dcSZachary Turner   };
579f8b22f8fSZachary Turner 
580f8b22f8fSZachary Turner   PythonObject &GetMainModule();
5812c1f46dcSZachary Turner 
582b9c1b51eSKate Stone   PythonDictionary &GetSessionDictionary();
5832c1f46dcSZachary Turner 
584b9c1b51eSKate Stone   PythonDictionary &GetSysModuleDictionary();
5852c1f46dcSZachary Turner 
586b9c1b51eSKate Stone   bool GetEmbeddedInterpreterModuleObjects();
5872c1f46dcSZachary Turner 
58823502721SJason Molenda   bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file,
589b9c1b51eSKate Stone                     const char *mode);
590a31baf08SGreg Clayton 
59123502721SJason Molenda   PythonFile m_saved_stdin;
59223502721SJason Molenda   PythonFile m_saved_stdout;
59323502721SJason Molenda   PythonFile m_saved_stderr;
5942c1f46dcSZachary Turner   PythonObject m_main_module;
5952c1f46dcSZachary Turner   PythonObject m_lldb_module;
5962c1f46dcSZachary Turner   PythonDictionary m_session_dict;
5972c1f46dcSZachary Turner   PythonDictionary m_sys_module_dict;
5982c1f46dcSZachary Turner   PythonObject m_run_one_line_function;
5992c1f46dcSZachary Turner   PythonObject m_run_one_line_str_global;
6002c1f46dcSZachary Turner   std::string m_dictionary_name;
6012c1f46dcSZachary Turner   TerminalState m_terminal_state;
6022c1f46dcSZachary Turner   ActiveIOHandler m_active_io_handler;
6032c1f46dcSZachary Turner   bool m_session_is_active;
6042c1f46dcSZachary Turner   bool m_pty_slave_is_open;
6052c1f46dcSZachary Turner   bool m_valid_session;
6062c1f46dcSZachary Turner   uint32_t m_lock_count;
6072c1f46dcSZachary Turner   PyThreadState *m_command_thread_state;
6082c1f46dcSZachary Turner };
609edb35d95SEugene Zelenko 
6102c1f46dcSZachary Turner } // namespace lldb_private
6112c1f46dcSZachary Turner 
612d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON
613d68983e3SPavel Labath 
614280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
615