12c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===//
22c1f46dcSZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62c1f46dcSZachary Turner //
72c1f46dcSZachary Turner //===----------------------------------------------------------------------===//
82c1f46dcSZachary Turner 
92c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
102c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
112c1f46dcSZachary Turner 
12d68983e3SPavel Labath #ifdef LLDB_DISABLE_PYTHON
13d68983e3SPavel Labath 
14d68983e3SPavel Labath // Python is disabled in this build
15d68983e3SPavel Labath 
16d68983e3SPavel Labath #else
17d68983e3SPavel Labath 
18edb35d95SEugene Zelenko #include <memory>
19edb35d95SEugene Zelenko #include <string>
20edb35d95SEugene Zelenko #include <vector>
21edb35d95SEugene Zelenko 
222c1f46dcSZachary Turner #include "PythonDataObjects.h"
23f7e07256SJim Ingham #include "lldb/Breakpoint/BreakpointOptions.h"
242c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h"
252c1f46dcSZachary Turner #include "lldb/Host/Terminal.h"
26b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h"
27b9c1b51eSKate Stone #include "lldb/lldb-private.h"
282c1f46dcSZachary Turner 
292c1f46dcSZachary Turner class IOHandlerPythonInterpreter;
302c1f46dcSZachary Turner 
312c1f46dcSZachary Turner namespace lldb_private {
322c1f46dcSZachary Turner 
33b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter,
34b9c1b51eSKate Stone                                 public IOHandlerDelegateMultiline {
352c1f46dcSZachary Turner public:
36f7e07256SJim Ingham   class CommandDataPython : public BreakpointOptions::CommandData {
37f7e07256SJim Ingham   public:
38f7e07256SJim Ingham     CommandDataPython() : BreakpointOptions::CommandData() {
39f7e07256SJim Ingham       interpreter = lldb::eScriptLanguagePython;
40f7e07256SJim Ingham     }
41f7e07256SJim Ingham   };
42f7e07256SJim Ingham 
43c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3
44c5b41d67SZachary Turner   typedef PyObject *(*SWIGInitCallback)(void);
45c5b41d67SZachary Turner #else
462c1f46dcSZachary Turner   typedef void (*SWIGInitCallback)(void);
47c5b41d67SZachary Turner #endif
482c1f46dcSZachary Turner 
49b9c1b51eSKate Stone   typedef bool (*SWIGBreakpointCallbackFunction)(
50b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
512c1f46dcSZachary Turner       const lldb::StackFrameSP &frame_sp,
522c1f46dcSZachary Turner       const lldb::BreakpointLocationSP &bp_loc_sp);
532c1f46dcSZachary Turner 
54b9c1b51eSKate Stone   typedef bool (*SWIGWatchpointCallbackFunction)(
55b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
56b9c1b51eSKate Stone       const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp);
572c1f46dcSZachary Turner 
58b9c1b51eSKate Stone   typedef bool (*SWIGPythonTypeScriptCallbackFunction)(
59b9c1b51eSKate Stone       const char *python_function_name, void *session_dictionary,
60b9c1b51eSKate Stone       const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper,
61b9c1b51eSKate Stone       const lldb::TypeSummaryOptionsSP &options, std::string &retval);
622c1f46dcSZachary Turner 
63b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateSyntheticProvider)(
64b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
652c1f46dcSZachary Turner       const lldb::ValueObjectSP &valobj_sp);
662c1f46dcSZachary Turner 
67b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateCommandObject)(
68b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
692c1f46dcSZachary Turner       const lldb::DebuggerSP debugger_sp);
702c1f46dcSZachary Turner 
71b9c1b51eSKate Stone   typedef void *(*SWIGPythonCreateScriptedThreadPlan)(
72b9c1b51eSKate Stone       const char *python_class_name, const char *session_dictionary_name,
732c1f46dcSZachary Turner       const lldb::ThreadPlanSP &thread_plan_sp);
742c1f46dcSZachary Turner 
75b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallThreadPlan)(void *implementor,
76b9c1b51eSKate Stone                                            const char *method_name,
77b9c1b51eSKate Stone                                            Event *event_sp, bool &got_error);
782c1f46dcSZachary Turner 
793815e702SJim Ingham   typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)(
803815e702SJim Ingham       const char *python_class_name, const char *session_dictionary_name,
813815e702SJim Ingham       lldb_private::StructuredDataImpl *args_impl,
823815e702SJim Ingham       lldb::BreakpointSP &bkpt_sp);
833815e702SJim Ingham 
843815e702SJim Ingham   typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor,
853815e702SJim Ingham                                           const char *method_name,
863815e702SJim Ingham                                           lldb_private::SymbolContext *sym_ctx);
873815e702SJim Ingham 
882c1f46dcSZachary Turner   typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name,
892c1f46dcSZachary Turner                                             const char *session_dictionary_name,
902c1f46dcSZachary Turner                                             const lldb::ProcessSP &process_sp);
912c1f46dcSZachary Turner 
9241ae8e74SKuba Mracek   typedef void *(*SWIGPythonCreateFrameRecognizer)(
9341ae8e74SKuba Mracek       const char *python_class_name, const char *session_dictionary_name);
9441ae8e74SKuba Mracek 
9541ae8e74SKuba Mracek   typedef void *(*SWIGPythonGetRecognizedArguments)(
9641ae8e74SKuba Mracek       void *implementor, const lldb::StackFrameSP &frame_sp);
9741ae8e74SKuba Mracek 
98b9c1b51eSKate Stone   typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor,
99b9c1b51eSKate Stone                                                    uint32_t max);
100edb35d95SEugene Zelenko 
1012c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx);
102edb35d95SEugene Zelenko 
103b9c1b51eSKate Stone   typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor,
104b9c1b51eSKate Stone                                                    const char *child_name);
105edb35d95SEugene Zelenko 
1062c1f46dcSZachary Turner   typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data);
107edb35d95SEugene Zelenko 
108b9c1b51eSKate Stone   typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)(
109b9c1b51eSKate Stone       void *data);
110edb35d95SEugene Zelenko 
1112c1f46dcSZachary Turner   typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data);
112edb35d95SEugene Zelenko 
1132c1f46dcSZachary Turner   typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data);
114edb35d95SEugene Zelenko 
1152c1f46dcSZachary Turner   typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor);
1162c1f46dcSZachary Turner 
117b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommand)(
118b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
119b9c1b51eSKate Stone       lldb::DebuggerSP &debugger, const char *args,
1202c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1212c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1222c1f46dcSZachary Turner 
123b9c1b51eSKate Stone   typedef bool (*SWIGPythonCallCommandObject)(
124b9c1b51eSKate Stone       void *implementor, lldb::DebuggerSP &debugger, const char *args,
1252c1f46dcSZachary Turner       lldb_private::CommandReturnObject &cmd_retobj,
1262c1f46dcSZachary Turner       lldb::ExecutionContextRefSP exe_ctx_ref_sp);
1272c1f46dcSZachary Turner 
1282c1f46dcSZachary Turner   typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name,
1292c1f46dcSZachary Turner                                            const char *session_dictionary_name,
1302c1f46dcSZachary Turner                                            lldb::DebuggerSP &debugger);
1312c1f46dcSZachary Turner 
132b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Process)(
133b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
134b9c1b51eSKate Stone       lldb::ProcessSP &process, std::string &output);
135edb35d95SEugene Zelenko 
136b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Thread)(
137b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
138b9c1b51eSKate Stone       lldb::ThreadSP &thread, std::string &output);
1392c1f46dcSZachary Turner 
140b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Target)(
141b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
142b9c1b51eSKate Stone       lldb::TargetSP &target, std::string &output);
1432c1f46dcSZachary Turner 
144b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Frame)(
145b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
146b9c1b51eSKate Stone       lldb::StackFrameSP &frame, std::string &output);
1472c1f46dcSZachary Turner 
148b9c1b51eSKate Stone   typedef bool (*SWIGPythonScriptKeyword_Value)(
149b9c1b51eSKate Stone       const char *python_function_name, const char *session_dictionary_name,
150b9c1b51eSKate Stone       lldb::ValueObjectSP &value, std::string &output);
1512c1f46dcSZachary Turner 
152b9c1b51eSKate Stone   typedef void *(*SWIGPython_GetDynamicSetting)(
153b9c1b51eSKate Stone       void *module, const char *setting, const lldb::TargetSP &target_sp);
1542c1f46dcSZachary Turner 
1552c1f46dcSZachary Turner   friend class ::IOHandlerPythonInterpreter;
1562c1f46dcSZachary Turner 
1572c1f46dcSZachary Turner   ScriptInterpreterPython(CommandInterpreter &interpreter);
1582c1f46dcSZachary Turner 
159280eb8abSPavel Labath   ~ScriptInterpreterPython() override;
1602c1f46dcSZachary Turner 
161b9c1b51eSKate Stone   bool Interrupt() override;
1622c1f46dcSZachary Turner 
163b9c1b51eSKate Stone   bool ExecuteOneLine(
1644d51a902SRaphael Isemann       llvm::StringRef command, CommandReturnObject *result,
1652c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1662c1f46dcSZachary Turner 
167b9c1b51eSKate Stone   void ExecuteInterpreterLoop() override;
1682c1f46dcSZachary Turner 
169b9c1b51eSKate Stone   bool ExecuteOneLineWithReturn(
1704d51a902SRaphael Isemann       llvm::StringRef in_string,
1714d51a902SRaphael Isemann       ScriptInterpreter::ScriptReturnType return_type, void *ret_value,
1722c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1732c1f46dcSZachary Turner 
17497206d57SZachary Turner   lldb_private::Status ExecuteMultipleLines(
175b9c1b51eSKate Stone       const char *in_string,
1762c1f46dcSZachary Turner       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1772c1f46dcSZachary Turner 
17897206d57SZachary Turner   Status
1792c1f46dcSZachary Turner   ExportFunctionDefinitionToInterpreter(StringList &function_def) override;
1802c1f46dcSZachary Turner 
181b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(StringList &input, std::string &output,
182b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1832c1f46dcSZachary Turner 
184b9c1b51eSKate Stone   bool GenerateTypeSynthClass(StringList &input, std::string &output,
185b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1862c1f46dcSZachary Turner 
187b9c1b51eSKate Stone   bool GenerateTypeSynthClass(const char *oneliner, std::string &output,
188b9c1b51eSKate Stone                               const void *name_token = nullptr) override;
1892c1f46dcSZachary Turner 
1902c1f46dcSZachary Turner   // use this if the function code is just a one-liner script
191b9c1b51eSKate Stone   bool GenerateTypeScriptFunction(const char *oneliner, std::string &output,
192b9c1b51eSKate Stone                                   const void *name_token = nullptr) override;
1932c1f46dcSZachary Turner 
194b9c1b51eSKate Stone   bool GenerateScriptAliasFunction(StringList &input,
195b9c1b51eSKate Stone                                    std::string &output) override;
1962c1f46dcSZachary Turner 
197b9c1b51eSKate Stone   StructuredData::ObjectSP
198b9c1b51eSKate Stone   CreateSyntheticScriptedProvider(const char *class_name,
199b9c1b51eSKate Stone                                   lldb::ValueObjectSP valobj) override;
2002c1f46dcSZachary Turner 
201b9c1b51eSKate Stone   StructuredData::GenericSP
202b9c1b51eSKate Stone   CreateScriptCommandObject(const char *class_name) override;
2032c1f46dcSZachary Turner 
204b9c1b51eSKate Stone   StructuredData::ObjectSP
205b9c1b51eSKate Stone   CreateScriptedThreadPlan(const char *class_name,
206b9c1b51eSKate Stone                            lldb::ThreadPlanSP thread_plan) override;
2072c1f46dcSZachary Turner 
208b9c1b51eSKate Stone   bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
209b9c1b51eSKate Stone                                       Event *event,
210b9c1b51eSKate Stone                                       bool &script_error) override;
211edb35d95SEugene Zelenko 
212b9c1b51eSKate Stone   bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
213b9c1b51eSKate Stone                                     Event *event, bool &script_error) override;
214edb35d95SEugene Zelenko 
215b9c1b51eSKate Stone   bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
216b9c1b51eSKate Stone                                  bool &script_error) override;
217c915a7d2SJim Ingham 
218b9c1b51eSKate Stone   lldb::StateType
219b9c1b51eSKate Stone   ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
220b9c1b51eSKate Stone                                 bool &script_error) override;
2212c1f46dcSZachary Turner 
222b9c1b51eSKate Stone   StructuredData::GenericSP
2233815e702SJim Ingham   CreateScriptedBreakpointResolver(const char *class_name,
2243815e702SJim Ingham                                    StructuredDataImpl *args_data,
2253815e702SJim Ingham                                    lldb::BreakpointSP &bkpt_sp) override;
2263815e702SJim Ingham   bool
2273815e702SJim Ingham   ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP
2283815e702SJim Ingham                                                implementor_sp,
2293815e702SJim Ingham                                            SymbolContext *sym_ctx) override;
2303815e702SJim Ingham 
2313815e702SJim Ingham   lldb::SearchDepth
2323815e702SJim Ingham   ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP
2333815e702SJim Ingham                                             implementor_sp) override;
2343815e702SJim Ingham 
2353815e702SJim Ingham   StructuredData::GenericSP
23641ae8e74SKuba Mracek   CreateFrameRecognizer(const char *class_name) override;
23741ae8e74SKuba Mracek 
23841ae8e74SKuba Mracek   lldb::ValueObjectListSP
23941ae8e74SKuba Mracek   GetRecognizedArguments(const StructuredData::ObjectSP &implementor,
24041ae8e74SKuba Mracek                          lldb::StackFrameSP frame_sp) override;
24141ae8e74SKuba Mracek 
24241ae8e74SKuba Mracek   StructuredData::GenericSP
243b9c1b51eSKate Stone   OSPlugin_CreatePluginObject(const char *class_name,
244b9c1b51eSKate Stone                               lldb::ProcessSP process_sp) override;
2452c1f46dcSZachary Turner 
246b9c1b51eSKate Stone   StructuredData::DictionarySP
247b9c1b51eSKate Stone   OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2482c1f46dcSZachary Turner 
249b9c1b51eSKate Stone   StructuredData::ArraySP
250b9c1b51eSKate Stone   OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
2512c1f46dcSZachary Turner 
252b9c1b51eSKate Stone   StructuredData::StringSP
253b9c1b51eSKate Stone   OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp,
254b9c1b51eSKate Stone                                lldb::tid_t thread_id) override;
2552c1f46dcSZachary Turner 
256b9c1b51eSKate Stone   StructuredData::DictionarySP
257b9c1b51eSKate Stone   OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp,
258b9c1b51eSKate Stone                         lldb::tid_t tid, lldb::addr_t context) override;
2592c1f46dcSZachary Turner 
260b9c1b51eSKate Stone   StructuredData::ObjectSP
261b9c1b51eSKate Stone   LoadPluginModule(const FileSpec &file_spec,
26297206d57SZachary Turner                    lldb_private::Status &error) override;
2632c1f46dcSZachary Turner 
264b9c1b51eSKate Stone   StructuredData::DictionarySP
265b9c1b51eSKate Stone   GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target,
266b9c1b51eSKate Stone                      const char *setting_name,
26797206d57SZachary Turner                      lldb_private::Status &error) override;
2682c1f46dcSZachary Turner 
269b9c1b51eSKate Stone   size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor,
270b9c1b51eSKate Stone                               uint32_t max) override;
2712c1f46dcSZachary Turner 
272b9c1b51eSKate Stone   lldb::ValueObjectSP
273b9c1b51eSKate Stone   GetChildAtIndex(const StructuredData::ObjectSP &implementor,
274b9c1b51eSKate Stone                   uint32_t idx) override;
2752c1f46dcSZachary Turner 
276b9c1b51eSKate Stone   int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor,
277b9c1b51eSKate Stone                               const char *child_name) override;
2782c1f46dcSZachary Turner 
279b9c1b51eSKate Stone   bool UpdateSynthProviderInstance(
280b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2812c1f46dcSZachary Turner 
282b9c1b51eSKate Stone   bool MightHaveChildrenSynthProviderInstance(
283b9c1b51eSKate Stone       const StructuredData::ObjectSP &implementor) override;
2842c1f46dcSZachary Turner 
285b9c1b51eSKate Stone   lldb::ValueObjectSP
286b9c1b51eSKate Stone   GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
287b9c1b51eSKate Stone 
288b9c1b51eSKate Stone   ConstString
289b9c1b51eSKate Stone   GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override;
2906eec8d6cSEnrico Granata 
2912c1f46dcSZachary Turner   bool
2924d51a902SRaphael Isemann   RunScriptBasedCommand(const char *impl_function, llvm::StringRef args,
2932c1f46dcSZachary Turner                         ScriptedCommandSynchronicity synchronicity,
2942c1f46dcSZachary Turner                         lldb_private::CommandReturnObject &cmd_retobj,
29597206d57SZachary Turner                         Status &error,
2962c1f46dcSZachary Turner                         const lldb_private::ExecutionContext &exe_ctx) override;
2972c1f46dcSZachary Turner 
2984d51a902SRaphael Isemann   bool RunScriptBasedCommand(
2994d51a902SRaphael Isemann       StructuredData::GenericSP impl_obj_sp, llvm::StringRef args,
3002c1f46dcSZachary Turner       ScriptedCommandSynchronicity synchronicity,
3014d51a902SRaphael Isemann       lldb_private::CommandReturnObject &cmd_retobj, Status &error,
3022c1f46dcSZachary Turner       const lldb_private::ExecutionContext &exe_ctx) override;
3032c1f46dcSZachary Turner 
30497206d57SZachary Turner   Status GenerateFunction(const char *signature,
305b9c1b51eSKate Stone                           const StringList &input) override;
3062c1f46dcSZachary Turner 
30797206d57SZachary Turner   Status GenerateBreakpointCommandCallbackData(StringList &input,
308b9c1b51eSKate Stone                                                std::string &output) override;
3092c1f46dcSZachary Turner 
310b9c1b51eSKate Stone   bool GenerateWatchpointCommandCallbackData(StringList &input,
311b9c1b51eSKate Stone                                              std::string &output) override;
3122c1f46dcSZachary Turner 
3132c1f46dcSZachary Turner   //    static size_t
3142c1f46dcSZachary Turner   //    GenerateBreakpointOptionsCommandCallback (void *baton,
3152c1f46dcSZachary Turner   //                                              InputReader &reader,
316b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
317b9c1b51eSKate Stone   //                                              notification,
3182c1f46dcSZachary Turner   //                                              const char *bytes,
3192c1f46dcSZachary Turner   //                                              size_t bytes_len);
3202c1f46dcSZachary Turner   //
3212c1f46dcSZachary Turner   //    static size_t
3222c1f46dcSZachary Turner   //    GenerateWatchpointOptionsCommandCallback (void *baton,
3232c1f46dcSZachary Turner   //                                              InputReader &reader,
324b9c1b51eSKate Stone   //                                              lldb::InputReaderAction
325b9c1b51eSKate Stone   //                                              notification,
3262c1f46dcSZachary Turner   //                                              const char *bytes,
3272c1f46dcSZachary Turner   //                                              size_t bytes_len);
3282c1f46dcSZachary Turner 
329b9c1b51eSKate Stone   static bool BreakpointCallbackFunction(void *baton,
3302c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3312c1f46dcSZachary Turner                                          lldb::user_id_t break_id,
3322c1f46dcSZachary Turner                                          lldb::user_id_t break_loc_id);
3332c1f46dcSZachary Turner 
334b9c1b51eSKate Stone   static bool WatchpointCallbackFunction(void *baton,
3352c1f46dcSZachary Turner                                          StoppointCallbackContext *context,
3362c1f46dcSZachary Turner                                          lldb::user_id_t watch_id);
3372c1f46dcSZachary Turner 
338b9c1b51eSKate Stone   bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj,
339b9c1b51eSKate Stone                           StructuredData::ObjectSP &callee_wrapper_sp,
340b9c1b51eSKate Stone                           const TypeSummaryOptions &options,
341b9c1b51eSKate Stone                           std::string &retval) override;
3422c1f46dcSZachary Turner 
343b9c1b51eSKate Stone   void Clear() override;
3442c1f46dcSZachary Turner 
345b9c1b51eSKate Stone   bool GetDocumentationForItem(const char *item, std::string &dest) override;
3462c1f46dcSZachary Turner 
347b9c1b51eSKate Stone   bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
348b9c1b51eSKate Stone                                     std::string &dest) override;
3492c1f46dcSZachary Turner 
3502c1f46dcSZachary Turner   uint32_t
3512c1f46dcSZachary Turner   GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override;
3522c1f46dcSZachary Turner 
353b9c1b51eSKate Stone   bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,
354b9c1b51eSKate Stone                                    std::string &dest) override;
3552c1f46dcSZachary Turner 
356b9c1b51eSKate Stone   bool CheckObjectExists(const char *name) override {
3572c1f46dcSZachary Turner     if (!name || !name[0])
3582c1f46dcSZachary Turner       return false;
3592c1f46dcSZachary Turner     std::string temp;
3602c1f46dcSZachary Turner     return GetDocumentationForItem(name, temp);
3612c1f46dcSZachary Turner   }
3622c1f46dcSZachary Turner 
363b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Process *process,
36497206d57SZachary Turner                               std::string &output, Status &error) override;
365b9c1b51eSKate Stone 
366b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Thread *thread,
36797206d57SZachary Turner                               std::string &output, Status &error) override;
368b9c1b51eSKate Stone 
369b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, Target *target,
37097206d57SZachary Turner                               std::string &output, Status &error) override;
371b9c1b51eSKate Stone 
372b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame,
37397206d57SZachary Turner                               std::string &output, Status &error) override;
374b9c1b51eSKate Stone 
375b9c1b51eSKate Stone   bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value,
37697206d57SZachary Turner                               std::string &output, Status &error) override;
3772c1f46dcSZachary Turner 
3782c1f46dcSZachary Turner   bool
379b9c1b51eSKate Stone   LoadScriptingModule(const char *filename, bool can_reload, bool init_session,
38097206d57SZachary Turner                       lldb_private::Status &error,
3812c1f46dcSZachary Turner                       StructuredData::ObjectSP *module_sp = nullptr) override;
3822c1f46dcSZachary Turner 
383b9c1b51eSKate Stone   bool IsReservedWord(const char *word) override;
3842c1f46dcSZachary Turner 
385b9c1b51eSKate Stone   std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override;
3862c1f46dcSZachary Turner 
387b9c1b51eSKate Stone   void CollectDataForBreakpointCommandCallback(
388b9c1b51eSKate Stone       std::vector<BreakpointOptions *> &bp_options_vec,
3892c1f46dcSZachary Turner       CommandReturnObject &result) override;
3902c1f46dcSZachary Turner 
3912c1f46dcSZachary Turner   void
3922c1f46dcSZachary Turner   CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options,
3932c1f46dcSZachary Turner                                           CommandReturnObject &result) override;
3942c1f46dcSZachary Turner 
3952c1f46dcSZachary Turner   /// Set the callback body text into the callback for the breakpoint.
39697206d57SZachary Turner   Status SetBreakpointCommandCallback(BreakpointOptions *bp_options,
3972c1f46dcSZachary Turner                                       const char *callback_body) override;
3982c1f46dcSZachary Turner 
399b9c1b51eSKate Stone   void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options,
4002c1f46dcSZachary Turner                                             const char *function_name) override;
4012c1f46dcSZachary Turner 
402f7e07256SJim Ingham   /// This one is for deserialization:
40397206d57SZachary Turner   Status SetBreakpointCommandCallback(
404f7e07256SJim Ingham       BreakpointOptions *bp_options,
405f7e07256SJim Ingham       std::unique_ptr<BreakpointOptions::CommandData> &data_up) override;
406f7e07256SJim Ingham 
4072c1f46dcSZachary Turner   /// Set a one-liner as the callback for the watchpoint.
408b9c1b51eSKate Stone   void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
4092c1f46dcSZachary Turner                                     const char *oneliner) override;
4102c1f46dcSZachary Turner 
411b9c1b51eSKate Stone   StringList ReadCommandInputFromUser(FILE *in_file);
4122c1f46dcSZachary Turner 
4132c1f46dcSZachary Turner   void ResetOutputFileHandle(FILE *new_fh) override;
4142c1f46dcSZachary Turner 
415b9c1b51eSKate Stone   static void InitializePrivate();
416ba456807SPavel Labath 
417b9c1b51eSKate Stone   static void InitializeInterpreter(
418b9c1b51eSKate Stone       SWIGInitCallback python_swig_init_callback,
4192c1f46dcSZachary Turner       SWIGBreakpointCallbackFunction swig_breakpoint_callback,
4202c1f46dcSZachary Turner       SWIGWatchpointCallbackFunction swig_watchpoint_callback,
4212c1f46dcSZachary Turner       SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
4222c1f46dcSZachary Turner       SWIGPythonCreateSyntheticProvider swig_synthetic_script,
4232c1f46dcSZachary Turner       SWIGPythonCreateCommandObject swig_create_cmd,
4242c1f46dcSZachary Turner       SWIGPythonCalculateNumChildren swig_calc_children,
4252c1f46dcSZachary Turner       SWIGPythonGetChildAtIndex swig_get_child_index,
4262c1f46dcSZachary Turner       SWIGPythonGetIndexOfChildWithName swig_get_index_child,
4272c1f46dcSZachary Turner       SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue,
4282c1f46dcSZachary Turner       SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
4292c1f46dcSZachary Turner       SWIGPythonUpdateSynthProviderInstance swig_update_provider,
430b9c1b51eSKate Stone       SWIGPythonMightHaveChildrenSynthProviderInstance
431b9c1b51eSKate Stone           swig_mighthavechildren_provider,
4322c1f46dcSZachary Turner       SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
4332c1f46dcSZachary Turner       SWIGPythonCallCommand swig_call_command,
4342c1f46dcSZachary Turner       SWIGPythonCallCommandObject swig_call_command_object,
4352c1f46dcSZachary Turner       SWIGPythonCallModuleInit swig_call_module_init,
4362c1f46dcSZachary Turner       SWIGPythonCreateOSPlugin swig_create_os_plugin,
43741ae8e74SKuba Mracek       SWIGPythonCreateFrameRecognizer swig_create_frame_recognizer,
43841ae8e74SKuba Mracek       SWIGPythonGetRecognizedArguments swig_get_recognized_arguments,
4392c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
4402c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
4412c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
4422c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
4432c1f46dcSZachary Turner       SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
4442c1f46dcSZachary Turner       SWIGPython_GetDynamicSetting swig_plugin_get,
4452c1f46dcSZachary Turner       SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
4463815e702SJim Ingham       SWIGPythonCallThreadPlan swig_call_thread_plan,
4473815e702SJim Ingham       SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script,
4483815e702SJim Ingham       SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver);
4492c1f46dcSZachary Turner 
450b9c1b51eSKate Stone   const char *GetDictionaryName() { return m_dictionary_name.c_str(); }
4512c1f46dcSZachary Turner 
452b9c1b51eSKate Stone   PyThreadState *GetThreadState() { return m_command_thread_state; }
4532c1f46dcSZachary Turner 
454b9c1b51eSKate Stone   void SetThreadState(PyThreadState *s) {
4552c1f46dcSZachary Turner     if (s)
4562c1f46dcSZachary Turner       m_command_thread_state = s;
4572c1f46dcSZachary Turner   }
4582c1f46dcSZachary Turner 
4592c1f46dcSZachary Turner   //----------------------------------------------------------------------
4602c1f46dcSZachary Turner   // IOHandlerDelegate
4612c1f46dcSZachary Turner   //----------------------------------------------------------------------
462b9c1b51eSKate Stone   void IOHandlerActivated(IOHandler &io_handler) override;
4632c1f46dcSZachary Turner 
464b9c1b51eSKate Stone   void IOHandlerInputComplete(IOHandler &io_handler,
465b9c1b51eSKate Stone                               std::string &data) override;
4662c1f46dcSZachary Turner 
4672c1f46dcSZachary Turner   //------------------------------------------------------------------
4682c1f46dcSZachary Turner   // Static Functions
4692c1f46dcSZachary Turner   //------------------------------------------------------------------
470b9c1b51eSKate Stone   static void Initialize();
4712c1f46dcSZachary Turner 
472b9c1b51eSKate Stone   static void Terminate();
4732c1f46dcSZachary Turner 
4742c1f46dcSZachary Turner   static lldb::ScriptInterpreterSP
4752c1f46dcSZachary Turner   CreateInstance(CommandInterpreter &interpreter);
4762c1f46dcSZachary Turner 
477b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
4782c1f46dcSZachary Turner 
479b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
4802c1f46dcSZachary Turner 
4812df331b0SPavel Labath   static FileSpec GetPythonDir();
4822df331b0SPavel Labath 
4832c1f46dcSZachary Turner   //------------------------------------------------------------------
4842c1f46dcSZachary Turner   // PluginInterface protocol
4852c1f46dcSZachary Turner   //------------------------------------------------------------------
486b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
4872c1f46dcSZachary Turner 
488b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
4892c1f46dcSZachary Turner 
490b9c1b51eSKate Stone   class Locker : public ScriptInterpreterLocker {
4912c1f46dcSZachary Turner   public:
492b9c1b51eSKate Stone     enum OnEntry {
4932c1f46dcSZachary Turner       AcquireLock = 0x0001,
4942c1f46dcSZachary Turner       InitSession = 0x0002,
4952c1f46dcSZachary Turner       InitGlobals = 0x0004,
4962c1f46dcSZachary Turner       NoSTDIN = 0x0008
4972c1f46dcSZachary Turner     };
4982c1f46dcSZachary Turner 
499b9c1b51eSKate Stone     enum OnLeave {
5002c1f46dcSZachary Turner       FreeLock = 0x0001,
501b9c1b51eSKate Stone       FreeAcquiredLock = 0x0002, // do not free the lock if we already held it
502b9c1b51eSKate Stone                                  // when calling constructor
5032c1f46dcSZachary Turner       TearDownSession = 0x0004
5042c1f46dcSZachary Turner     };
5052c1f46dcSZachary Turner 
506edb35d95SEugene Zelenko     Locker(ScriptInterpreterPython *py_interpreter = nullptr,
5072c1f46dcSZachary Turner            uint16_t on_entry = AcquireLock | InitSession,
508b9c1b51eSKate Stone            uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr,
509b9c1b51eSKate Stone            FILE *out = nullptr, FILE *err = nullptr);
5102c1f46dcSZachary Turner 
511280eb8abSPavel Labath     ~Locker() override;
5122c1f46dcSZachary Turner 
5132c1f46dcSZachary Turner   private:
514b9c1b51eSKate Stone     bool DoAcquireLock();
5152c1f46dcSZachary Turner 
516b9c1b51eSKate Stone     bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
5172c1f46dcSZachary Turner 
518b9c1b51eSKate Stone     bool DoFreeLock();
5192c1f46dcSZachary Turner 
520b9c1b51eSKate Stone     bool DoTearDownSession();
5212c1f46dcSZachary Turner 
522b9c1b51eSKate Stone     static void ReleasePythonLock();
5232c1f46dcSZachary Turner 
5242c1f46dcSZachary Turner     bool m_teardown_session;
5252c1f46dcSZachary Turner     ScriptInterpreterPython *m_python_interpreter;
5262c1f46dcSZachary Turner     //    	FILE*                    m_tmp_fh;
5272c1f46dcSZachary Turner     PyGILState_STATE m_GILState;
5282c1f46dcSZachary Turner   };
529edb35d95SEugene Zelenko 
5302c1f46dcSZachary Turner protected:
531b9c1b51eSKate Stone   class SynchronicityHandler {
532edb35d95SEugene Zelenko   private:
533edb35d95SEugene Zelenko     lldb::DebuggerSP m_debugger_sp;
534edb35d95SEugene Zelenko     ScriptedCommandSynchronicity m_synch_wanted;
535edb35d95SEugene Zelenko     bool m_old_asynch;
536edb35d95SEugene Zelenko 
537edb35d95SEugene Zelenko   public:
538b9c1b51eSKate Stone     SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity);
539edb35d95SEugene Zelenko 
540edb35d95SEugene Zelenko     ~SynchronicityHandler();
541edb35d95SEugene Zelenko   };
5429c40264fSZachary Turner 
543b9c1b51eSKate Stone   enum class AddLocation { Beginning, End };
5442c1f46dcSZachary Turner 
5452c1f46dcSZachary Turner   static void AddToSysPath(AddLocation location, std::string path);
5462c1f46dcSZachary Turner 
5472df331b0SPavel Labath   static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path);
5482df331b0SPavel Labath   static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path);
5492df331b0SPavel Labath   static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path);
5502df331b0SPavel Labath 
551b9c1b51eSKate Stone   bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
552edb35d95SEugene Zelenko 
553b9c1b51eSKate Stone   void LeaveSession();
554edb35d95SEugene Zelenko 
555b9c1b51eSKate Stone   void SaveTerminalState(int fd);
556edb35d95SEugene Zelenko 
557b9c1b51eSKate Stone   void RestoreTerminalState();
558edb35d95SEugene Zelenko 
559b9c1b51eSKate Stone   uint32_t IsExecutingPython() const { return m_lock_count > 0; }
5602c1f46dcSZachary Turner 
561b9c1b51eSKate Stone   uint32_t IncrementLockCount() { return ++m_lock_count; }
5622c1f46dcSZachary Turner 
563b9c1b51eSKate Stone   uint32_t DecrementLockCount() {
5642c1f46dcSZachary Turner     if (m_lock_count > 0)
5652c1f46dcSZachary Turner       --m_lock_count;
5662c1f46dcSZachary Turner     return m_lock_count;
5672c1f46dcSZachary Turner   }
5682c1f46dcSZachary Turner 
5692c1f46dcSZachary Turner   enum ActiveIOHandler {
5702c1f46dcSZachary Turner     eIOHandlerNone,
5712c1f46dcSZachary Turner     eIOHandlerBreakpoint,
5722c1f46dcSZachary Turner     eIOHandlerWatchpoint
5732c1f46dcSZachary Turner   };
574f8b22f8fSZachary Turner 
575f8b22f8fSZachary Turner   PythonObject &GetMainModule();
5762c1f46dcSZachary Turner 
577b9c1b51eSKate Stone   PythonDictionary &GetSessionDictionary();
5782c1f46dcSZachary Turner 
579b9c1b51eSKate Stone   PythonDictionary &GetSysModuleDictionary();
5802c1f46dcSZachary Turner 
581b9c1b51eSKate Stone   bool GetEmbeddedInterpreterModuleObjects();
5822c1f46dcSZachary Turner 
58323502721SJason Molenda   bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file,
584b9c1b51eSKate Stone                     const char *mode);
585a31baf08SGreg Clayton 
58623502721SJason Molenda   PythonFile m_saved_stdin;
58723502721SJason Molenda   PythonFile m_saved_stdout;
58823502721SJason Molenda   PythonFile m_saved_stderr;
5892c1f46dcSZachary Turner   PythonObject m_main_module;
5902c1f46dcSZachary Turner   PythonObject m_lldb_module;
5912c1f46dcSZachary Turner   PythonDictionary m_session_dict;
5922c1f46dcSZachary Turner   PythonDictionary m_sys_module_dict;
5932c1f46dcSZachary Turner   PythonObject m_run_one_line_function;
5942c1f46dcSZachary Turner   PythonObject m_run_one_line_str_global;
5952c1f46dcSZachary Turner   std::string m_dictionary_name;
5962c1f46dcSZachary Turner   TerminalState m_terminal_state;
5972c1f46dcSZachary Turner   ActiveIOHandler m_active_io_handler;
5982c1f46dcSZachary Turner   bool m_session_is_active;
5992c1f46dcSZachary Turner   bool m_pty_slave_is_open;
6002c1f46dcSZachary Turner   bool m_valid_session;
6012c1f46dcSZachary Turner   uint32_t m_lock_count;
6022c1f46dcSZachary Turner   PyThreadState *m_command_thread_state;
6032c1f46dcSZachary Turner };
604edb35d95SEugene Zelenko 
6052c1f46dcSZachary Turner } // namespace lldb_private
6062c1f46dcSZachary Turner 
607d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON
608d68983e3SPavel Labath 
609280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
610