xref: /llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h (revision f8b22f8fea181d2564267282e6c8249fde01bc13)
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 
112c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
122c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
132c1f46dcSZachary Turner 
142c1f46dcSZachary Turner #ifdef LLDB_DISABLE_PYTHON
152c1f46dcSZachary Turner 
162c1f46dcSZachary Turner // Python is disabled in this build
172c1f46dcSZachary Turner 
182c1f46dcSZachary Turner #else
192c1f46dcSZachary Turner 
202c1f46dcSZachary Turner #include "lldb/lldb-private.h"
212c1f46dcSZachary Turner #include "PythonDataObjects.h"
222c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h"
232c1f46dcSZachary Turner #include "lldb/Interpreter/ScriptInterpreter.h"
242c1f46dcSZachary Turner #include "lldb/Host/Terminal.h"
252c1f46dcSZachary Turner 
262c1f46dcSZachary Turner class IOHandlerPythonInterpreter;
272c1f46dcSZachary Turner 
282c1f46dcSZachary Turner namespace lldb_private {
292c1f46dcSZachary Turner 
302c1f46dcSZachary Turner class ScriptInterpreterPython :
312c1f46dcSZachary Turner     public ScriptInterpreter,
322c1f46dcSZachary Turner     public IOHandlerDelegateMultiline
332c1f46dcSZachary Turner {
342c1f46dcSZachary Turner public:
352c1f46dcSZachary Turner     typedef void (*SWIGInitCallback) (void);
362c1f46dcSZachary Turner 
372c1f46dcSZachary Turner     typedef bool (*SWIGBreakpointCallbackFunction) (const char *python_function_name,
382c1f46dcSZachary Turner                                                     const char *session_dictionary_name,
392c1f46dcSZachary Turner                                                     const lldb::StackFrameSP& frame_sp,
402c1f46dcSZachary Turner                                                     const lldb::BreakpointLocationSP &bp_loc_sp);
412c1f46dcSZachary Turner 
422c1f46dcSZachary Turner     typedef bool (*SWIGWatchpointCallbackFunction) (const char *python_function_name,
432c1f46dcSZachary Turner                                                     const char *session_dictionary_name,
442c1f46dcSZachary Turner                                                     const lldb::StackFrameSP& frame_sp,
452c1f46dcSZachary Turner                                                     const lldb::WatchpointSP &wp_sp);
462c1f46dcSZachary Turner 
472c1f46dcSZachary Turner     typedef bool (*SWIGPythonTypeScriptCallbackFunction) (const char *python_function_name,
482c1f46dcSZachary Turner                                                           void *session_dictionary,
492c1f46dcSZachary Turner                                                           const lldb::ValueObjectSP& valobj_sp,
502c1f46dcSZachary Turner                                                           void** pyfunct_wrapper,
512c1f46dcSZachary Turner                                                           const lldb::TypeSummaryOptionsSP& options,
522c1f46dcSZachary Turner                                                           std::string& retval);
532c1f46dcSZachary Turner 
542c1f46dcSZachary Turner     typedef void* (*SWIGPythonCreateSyntheticProvider) (const char *python_class_name,
552c1f46dcSZachary Turner                                                         const char *session_dictionary_name,
562c1f46dcSZachary Turner                                                         const lldb::ValueObjectSP& valobj_sp);
572c1f46dcSZachary Turner 
582c1f46dcSZachary Turner     typedef void* (*SWIGPythonCreateCommandObject) (const char *python_class_name,
592c1f46dcSZachary Turner                                                     const char *session_dictionary_name,
602c1f46dcSZachary Turner                                                     const lldb::DebuggerSP debugger_sp);
612c1f46dcSZachary Turner 
622c1f46dcSZachary Turner     typedef void* (*SWIGPythonCreateScriptedThreadPlan) (const char *python_class_name,
632c1f46dcSZachary Turner                                                         const char *session_dictionary_name,
642c1f46dcSZachary Turner                                                         const lldb::ThreadPlanSP& thread_plan_sp);
652c1f46dcSZachary Turner 
662c1f46dcSZachary Turner     typedef bool (*SWIGPythonCallThreadPlan) (void *implementor, const char *method_name, Event *event_sp, bool &got_error);
672c1f46dcSZachary Turner 
682c1f46dcSZachary Turner     typedef void* (*SWIGPythonCreateOSPlugin) (const char *python_class_name,
692c1f46dcSZachary Turner                                                const char *session_dictionary_name,
702c1f46dcSZachary Turner                                                const lldb::ProcessSP& process_sp);
712c1f46dcSZachary Turner 
722c1f46dcSZachary Turner     typedef size_t          (*SWIGPythonCalculateNumChildren)                   (void *implementor);
732c1f46dcSZachary Turner     typedef void*           (*SWIGPythonGetChildAtIndex)                        (void *implementor, uint32_t idx);
742c1f46dcSZachary Turner     typedef int             (*SWIGPythonGetIndexOfChildWithName)                (void *implementor, const char* child_name);
752c1f46dcSZachary Turner     typedef void*           (*SWIGPythonCastPyObjectToSBValue)                  (void* data);
762c1f46dcSZachary Turner     typedef lldb::ValueObjectSP  (*SWIGPythonGetValueObjectSPFromSBValue)       (void* data);
772c1f46dcSZachary Turner     typedef bool            (*SWIGPythonUpdateSynthProviderInstance)            (void* data);
782c1f46dcSZachary Turner     typedef bool            (*SWIGPythonMightHaveChildrenSynthProviderInstance) (void* data);
792c1f46dcSZachary Turner     typedef void*           (*SWIGPythonGetValueSynthProviderInstance)          (void *implementor);
802c1f46dcSZachary Turner 
812c1f46dcSZachary Turner     typedef bool            (*SWIGPythonCallCommand)            (const char *python_function_name,
822c1f46dcSZachary Turner                                                                  const char *session_dictionary_name,
832c1f46dcSZachary Turner                                                                  lldb::DebuggerSP& debugger,
842c1f46dcSZachary Turner                                                                  const char* args,
852c1f46dcSZachary Turner                                                                  lldb_private::CommandReturnObject& cmd_retobj,
862c1f46dcSZachary Turner                                                                  lldb::ExecutionContextRefSP exe_ctx_ref_sp);
872c1f46dcSZachary Turner 
882c1f46dcSZachary Turner     typedef bool            (*SWIGPythonCallCommandObject)        (void *implementor,
892c1f46dcSZachary Turner                                                                    lldb::DebuggerSP& debugger,
902c1f46dcSZachary Turner                                                                    const char* args,
912c1f46dcSZachary Turner                                                                    lldb_private::CommandReturnObject& cmd_retobj,
922c1f46dcSZachary Turner                                                                    lldb::ExecutionContextRefSP exe_ctx_ref_sp);
932c1f46dcSZachary Turner 
942c1f46dcSZachary Turner 
952c1f46dcSZachary Turner     typedef bool            (*SWIGPythonCallModuleInit)         (const char *python_module_name,
962c1f46dcSZachary Turner                                                                  const char *session_dictionary_name,
972c1f46dcSZachary Turner                                                                  lldb::DebuggerSP& debugger);
982c1f46dcSZachary Turner 
992c1f46dcSZachary Turner     typedef bool            (*SWIGPythonScriptKeyword_Process)  (const char* python_function_name,
1002c1f46dcSZachary Turner                                                                  const char* session_dictionary_name,
1012c1f46dcSZachary Turner                                                                  lldb::ProcessSP& process,
1022c1f46dcSZachary Turner                                                                  std::string& output);
1032c1f46dcSZachary Turner     typedef bool            (*SWIGPythonScriptKeyword_Thread)   (const char* python_function_name,
1042c1f46dcSZachary Turner                                                                  const char* session_dictionary_name,
1052c1f46dcSZachary Turner                                                                  lldb::ThreadSP& thread,
1062c1f46dcSZachary Turner                                                                  std::string& output);
1072c1f46dcSZachary Turner 
1082c1f46dcSZachary Turner     typedef bool            (*SWIGPythonScriptKeyword_Target)   (const char* python_function_name,
1092c1f46dcSZachary Turner                                                                  const char* session_dictionary_name,
1102c1f46dcSZachary Turner                                                                  lldb::TargetSP& target,
1112c1f46dcSZachary Turner                                                                  std::string& output);
1122c1f46dcSZachary Turner 
1132c1f46dcSZachary Turner     typedef bool            (*SWIGPythonScriptKeyword_Frame)    (const char* python_function_name,
1142c1f46dcSZachary Turner                                                                  const char* session_dictionary_name,
1152c1f46dcSZachary Turner                                                                  lldb::StackFrameSP& frame,
1162c1f46dcSZachary Turner                                                                  std::string& output);
1172c1f46dcSZachary Turner 
1182c1f46dcSZachary Turner     typedef bool            (*SWIGPythonScriptKeyword_Value)    (const char* python_function_name,
1192c1f46dcSZachary Turner                                                                  const char* session_dictionary_name,
1202c1f46dcSZachary Turner                                                                  lldb::ValueObjectSP& value,
1212c1f46dcSZachary Turner                                                                  std::string& output);
1222c1f46dcSZachary Turner 
1232c1f46dcSZachary Turner     typedef void*           (*SWIGPython_GetDynamicSetting)     (void* module,
1242c1f46dcSZachary Turner                                                                  const char* setting,
1252c1f46dcSZachary Turner                                                                  const lldb::TargetSP& target_sp);
1262c1f46dcSZachary Turner 
1272c1f46dcSZachary Turner     friend class ::IOHandlerPythonInterpreter;
1282c1f46dcSZachary Turner 
1292c1f46dcSZachary Turner     ScriptInterpreterPython (CommandInterpreter &interpreter);
1302c1f46dcSZachary Turner 
131280eb8abSPavel Labath     ~ScriptInterpreterPython() override;
1322c1f46dcSZachary Turner 
1332c1f46dcSZachary Turner     bool
1342c1f46dcSZachary Turner     Interrupt() override;
1352c1f46dcSZachary Turner 
1362c1f46dcSZachary Turner     bool
1372c1f46dcSZachary Turner     ExecuteOneLine (const char *command,
1382c1f46dcSZachary Turner                     CommandReturnObject *result,
1392c1f46dcSZachary Turner                     const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1402c1f46dcSZachary Turner 
1412c1f46dcSZachary Turner     void
1422c1f46dcSZachary Turner     ExecuteInterpreterLoop () override;
1432c1f46dcSZachary Turner 
1442c1f46dcSZachary Turner     bool
1452c1f46dcSZachary Turner     ExecuteOneLineWithReturn (const char *in_string,
1462c1f46dcSZachary Turner                               ScriptInterpreter::ScriptReturnType return_type,
1472c1f46dcSZachary Turner                               void *ret_value,
1482c1f46dcSZachary Turner                               const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1492c1f46dcSZachary Turner 
1502c1f46dcSZachary Turner     lldb_private::Error
1512c1f46dcSZachary Turner     ExecuteMultipleLines (const char *in_string,
1522c1f46dcSZachary Turner                           const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
1532c1f46dcSZachary Turner 
1542c1f46dcSZachary Turner     Error
1552c1f46dcSZachary Turner     ExportFunctionDefinitionToInterpreter (StringList &function_def) override;
1562c1f46dcSZachary Turner 
1572c1f46dcSZachary Turner     bool
1582c1f46dcSZachary Turner     GenerateTypeScriptFunction (StringList &input, std::string& output, const void* name_token = NULL) override;
1592c1f46dcSZachary Turner 
1602c1f46dcSZachary Turner     bool
1612c1f46dcSZachary Turner     GenerateTypeSynthClass (StringList &input, std::string& output, const void* name_token = NULL) override;
1622c1f46dcSZachary Turner 
1632c1f46dcSZachary Turner     bool
1642c1f46dcSZachary Turner     GenerateTypeSynthClass (const char* oneliner, std::string& output, const void* name_token = NULL) override;
1652c1f46dcSZachary Turner 
1662c1f46dcSZachary Turner     // use this if the function code is just a one-liner script
1672c1f46dcSZachary Turner     bool
1682c1f46dcSZachary Turner     GenerateTypeScriptFunction (const char* oneliner, std::string& output, const void* name_token = NULL) override;
1692c1f46dcSZachary Turner 
1702c1f46dcSZachary Turner     bool
1712c1f46dcSZachary Turner     GenerateScriptAliasFunction (StringList &input, std::string& output) override;
1722c1f46dcSZachary Turner 
1732c1f46dcSZachary Turner     StructuredData::ObjectSP CreateSyntheticScriptedProvider(const char *class_name, lldb::ValueObjectSP valobj) override;
1742c1f46dcSZachary Turner 
1752c1f46dcSZachary Turner     StructuredData::GenericSP CreateScriptCommandObject (const char *class_name) override;
1762c1f46dcSZachary Turner 
1772c1f46dcSZachary Turner     StructuredData::ObjectSP CreateScriptedThreadPlan(const char *class_name, lldb::ThreadPlanSP thread_plan) override;
1782c1f46dcSZachary Turner 
1792c1f46dcSZachary Turner     bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) override;
1802c1f46dcSZachary Turner     bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) override;
1812c1f46dcSZachary Turner     lldb::StateType ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, bool &script_error) override;
1822c1f46dcSZachary Turner 
1832c1f46dcSZachary Turner     StructuredData::GenericSP OSPlugin_CreatePluginObject(const char *class_name, lldb::ProcessSP process_sp) override;
1842c1f46dcSZachary Turner 
1852c1f46dcSZachary Turner     StructuredData::DictionarySP OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
1862c1f46dcSZachary Turner 
1872c1f46dcSZachary Turner     StructuredData::ArraySP OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override;
1882c1f46dcSZachary Turner 
1892c1f46dcSZachary Turner     StructuredData::StringSP OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t thread_id) override;
1902c1f46dcSZachary Turner 
1912c1f46dcSZachary Turner     StructuredData::DictionarySP OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t tid,
1922c1f46dcSZachary Turner                                                        lldb::addr_t context) override;
1932c1f46dcSZachary Turner 
1942c1f46dcSZachary Turner     StructuredData::ObjectSP LoadPluginModule(const FileSpec &file_spec, lldb_private::Error &error) override;
1952c1f46dcSZachary Turner 
1962c1f46dcSZachary Turner     StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, const char *setting_name,
1972c1f46dcSZachary Turner                                                     lldb_private::Error &error) override;
1982c1f46dcSZachary Turner 
1992c1f46dcSZachary Turner     size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor) override;
2002c1f46dcSZachary Turner 
2012c1f46dcSZachary Turner     lldb::ValueObjectSP GetChildAtIndex(const StructuredData::ObjectSP &implementor, uint32_t idx) override;
2022c1f46dcSZachary Turner 
2032c1f46dcSZachary Turner     int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, const char *child_name) override;
2042c1f46dcSZachary Turner 
2052c1f46dcSZachary Turner     bool UpdateSynthProviderInstance(const StructuredData::ObjectSP &implementor) override;
2062c1f46dcSZachary Turner 
2072c1f46dcSZachary Turner     bool MightHaveChildrenSynthProviderInstance(const StructuredData::ObjectSP &implementor) override;
2082c1f46dcSZachary Turner 
2092c1f46dcSZachary Turner     lldb::ValueObjectSP GetSyntheticValue(const StructuredData::ObjectSP &implementor) override;
2102c1f46dcSZachary Turner 
2112c1f46dcSZachary Turner     bool
2122c1f46dcSZachary Turner     RunScriptBasedCommand(const char* impl_function,
2132c1f46dcSZachary Turner                           const char* args,
2142c1f46dcSZachary Turner                           ScriptedCommandSynchronicity synchronicity,
2152c1f46dcSZachary Turner                           lldb_private::CommandReturnObject& cmd_retobj,
2162c1f46dcSZachary Turner                           Error& error,
2172c1f46dcSZachary Turner                           const lldb_private::ExecutionContext& exe_ctx) override;
2182c1f46dcSZachary Turner 
2192c1f46dcSZachary Turner     bool
2202c1f46dcSZachary Turner     RunScriptBasedCommand (StructuredData::GenericSP impl_obj_sp,
2212c1f46dcSZachary Turner                            const char* args,
2222c1f46dcSZachary Turner                            ScriptedCommandSynchronicity synchronicity,
2232c1f46dcSZachary Turner                            lldb_private::CommandReturnObject& cmd_retobj,
2242c1f46dcSZachary Turner                            Error& error,
2252c1f46dcSZachary Turner                            const lldb_private::ExecutionContext& exe_ctx) override;
2262c1f46dcSZachary Turner 
2272c1f46dcSZachary Turner     Error
2282c1f46dcSZachary Turner     GenerateFunction(const char *signature, const StringList &input) override;
2292c1f46dcSZachary Turner 
2302c1f46dcSZachary Turner     Error
2312c1f46dcSZachary Turner     GenerateBreakpointCommandCallbackData (StringList &input, std::string& output) override;
2322c1f46dcSZachary Turner 
2332c1f46dcSZachary Turner     bool
2342c1f46dcSZachary Turner     GenerateWatchpointCommandCallbackData (StringList &input, std::string& output) override;
2352c1f46dcSZachary Turner 
2362c1f46dcSZachary Turner //    static size_t
2372c1f46dcSZachary Turner //    GenerateBreakpointOptionsCommandCallback (void *baton,
2382c1f46dcSZachary Turner //                                              InputReader &reader,
2392c1f46dcSZachary Turner //                                              lldb::InputReaderAction notification,
2402c1f46dcSZachary Turner //                                              const char *bytes,
2412c1f46dcSZachary Turner //                                              size_t bytes_len);
2422c1f46dcSZachary Turner //
2432c1f46dcSZachary Turner //    static size_t
2442c1f46dcSZachary Turner //    GenerateWatchpointOptionsCommandCallback (void *baton,
2452c1f46dcSZachary Turner //                                              InputReader &reader,
2462c1f46dcSZachary Turner //                                              lldb::InputReaderAction notification,
2472c1f46dcSZachary Turner //                                              const char *bytes,
2482c1f46dcSZachary Turner //                                              size_t bytes_len);
2492c1f46dcSZachary Turner 
2502c1f46dcSZachary Turner     static bool
2512c1f46dcSZachary Turner     BreakpointCallbackFunction (void *baton,
2522c1f46dcSZachary Turner                                 StoppointCallbackContext *context,
2532c1f46dcSZachary Turner                                 lldb::user_id_t break_id,
2542c1f46dcSZachary Turner                                 lldb::user_id_t break_loc_id);
2552c1f46dcSZachary Turner 
2562c1f46dcSZachary Turner     static bool
2572c1f46dcSZachary Turner     WatchpointCallbackFunction (void *baton,
2582c1f46dcSZachary Turner                                 StoppointCallbackContext *context,
2592c1f46dcSZachary Turner                                 lldb::user_id_t watch_id);
2602c1f46dcSZachary Turner 
2612c1f46dcSZachary Turner     bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, StructuredData::ObjectSP &callee_wrapper_sp,
2622c1f46dcSZachary Turner                             const TypeSummaryOptions &options, std::string &retval) override;
2632c1f46dcSZachary Turner 
2642c1f46dcSZachary Turner     void
2652c1f46dcSZachary Turner     Clear () override;
2662c1f46dcSZachary Turner 
2672c1f46dcSZachary Turner     bool
2682c1f46dcSZachary Turner     GetDocumentationForItem (const char* item, std::string& dest) override;
2692c1f46dcSZachary Turner 
2702c1f46dcSZachary Turner     bool
2712c1f46dcSZachary Turner     GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string& dest) override;
2722c1f46dcSZachary Turner 
2732c1f46dcSZachary Turner     uint32_t
2742c1f46dcSZachary Turner     GetFlagsForCommandObject (StructuredData::GenericSP cmd_obj_sp) override;
2752c1f46dcSZachary Turner 
2762c1f46dcSZachary Turner     bool
2772c1f46dcSZachary Turner     GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string& dest) override;
2782c1f46dcSZachary Turner 
2792c1f46dcSZachary Turner     bool
2802c1f46dcSZachary Turner     CheckObjectExists (const char* name) override
2812c1f46dcSZachary Turner     {
2822c1f46dcSZachary Turner         if (!name || !name[0])
2832c1f46dcSZachary Turner             return false;
2842c1f46dcSZachary Turner         std::string temp;
2852c1f46dcSZachary Turner         return GetDocumentationForItem (name,temp);
2862c1f46dcSZachary Turner     }
2872c1f46dcSZachary Turner 
2882c1f46dcSZachary Turner     bool
2892c1f46dcSZachary Turner     RunScriptFormatKeyword (const char* impl_function,
2902c1f46dcSZachary Turner                             Process* process,
2912c1f46dcSZachary Turner                             std::string& output,
2922c1f46dcSZachary Turner                             Error& error) override;
2932c1f46dcSZachary Turner 
2942c1f46dcSZachary Turner     bool
2952c1f46dcSZachary Turner     RunScriptFormatKeyword (const char* impl_function,
2962c1f46dcSZachary Turner                             Thread* thread,
2972c1f46dcSZachary Turner                             std::string& output,
2982c1f46dcSZachary Turner                             Error& error) override;
2992c1f46dcSZachary Turner 
3002c1f46dcSZachary Turner     bool
3012c1f46dcSZachary Turner     RunScriptFormatKeyword (const char* impl_function,
3022c1f46dcSZachary Turner                             Target* target,
3032c1f46dcSZachary Turner                             std::string& output,
3042c1f46dcSZachary Turner                             Error& error) override;
3052c1f46dcSZachary Turner 
3062c1f46dcSZachary Turner     bool
3072c1f46dcSZachary Turner     RunScriptFormatKeyword (const char* impl_function,
3082c1f46dcSZachary Turner                             StackFrame* frame,
3092c1f46dcSZachary Turner                             std::string& output,
3102c1f46dcSZachary Turner                             Error& error) override;
3112c1f46dcSZachary Turner 
3122c1f46dcSZachary Turner     bool
3132c1f46dcSZachary Turner     RunScriptFormatKeyword (const char* impl_function,
3142c1f46dcSZachary Turner                             ValueObject* value,
3152c1f46dcSZachary Turner                             std::string& output,
3162c1f46dcSZachary Turner                             Error& error) override;
3172c1f46dcSZachary Turner 
3182c1f46dcSZachary Turner     bool LoadScriptingModule(const char *filename, bool can_reload, bool init_session, lldb_private::Error &error,
3192c1f46dcSZachary Turner                              StructuredData::ObjectSP *module_sp = nullptr) override;
3202c1f46dcSZachary Turner 
3212c1f46dcSZachary Turner     bool
3222c1f46dcSZachary Turner     IsReservedWord (const char* word) override;
3232c1f46dcSZachary Turner 
3242c1f46dcSZachary Turner     std::unique_ptr<ScriptInterpreterLocker>
3252c1f46dcSZachary Turner     AcquireInterpreterLock () override;
3262c1f46dcSZachary Turner 
3272c1f46dcSZachary Turner     void
3282c1f46dcSZachary Turner     CollectDataForBreakpointCommandCallback (std::vector<BreakpointOptions *> &bp_options_vec,
3292c1f46dcSZachary Turner                                              CommandReturnObject &result) override;
3302c1f46dcSZachary Turner 
3312c1f46dcSZachary Turner     void
3322c1f46dcSZachary Turner     CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options,
3332c1f46dcSZachary Turner                                              CommandReturnObject &result) override;
3342c1f46dcSZachary Turner 
3352c1f46dcSZachary Turner     /// Set the callback body text into the callback for the breakpoint.
3362c1f46dcSZachary Turner     Error
3372c1f46dcSZachary Turner     SetBreakpointCommandCallback (BreakpointOptions *bp_options,
3382c1f46dcSZachary Turner                                   const char *callback_body) override;
3392c1f46dcSZachary Turner 
3402c1f46dcSZachary Turner     void
3412c1f46dcSZachary Turner     SetBreakpointCommandCallbackFunction (BreakpointOptions *bp_options,
3422c1f46dcSZachary Turner                                           const char *function_name) override;
3432c1f46dcSZachary Turner 
3442c1f46dcSZachary Turner     /// Set a one-liner as the callback for the watchpoint.
3452c1f46dcSZachary Turner     void
3462c1f46dcSZachary Turner     SetWatchpointCommandCallback (WatchpointOptions *wp_options,
3472c1f46dcSZachary Turner                                   const char *oneliner) override;
3482c1f46dcSZachary Turner 
3492c1f46dcSZachary Turner     StringList
3502c1f46dcSZachary Turner     ReadCommandInputFromUser (FILE *in_file);
3512c1f46dcSZachary Turner 
3522c1f46dcSZachary Turner     void ResetOutputFileHandle(FILE *new_fh) override;
3532c1f46dcSZachary Turner 
3542c1f46dcSZachary Turner     static void
3552c1f46dcSZachary Turner     InitializePrivate ();
3562c1f46dcSZachary Turner 
3572c1f46dcSZachary Turner     static void
3582c1f46dcSZachary Turner     InitializeInterpreter (SWIGInitCallback python_swig_init_callback,
3592c1f46dcSZachary Turner                            SWIGBreakpointCallbackFunction swig_breakpoint_callback,
3602c1f46dcSZachary Turner                            SWIGWatchpointCallbackFunction swig_watchpoint_callback,
3612c1f46dcSZachary Turner                            SWIGPythonTypeScriptCallbackFunction swig_typescript_callback,
3622c1f46dcSZachary Turner                            SWIGPythonCreateSyntheticProvider swig_synthetic_script,
3632c1f46dcSZachary Turner                            SWIGPythonCreateCommandObject swig_create_cmd,
3642c1f46dcSZachary Turner                            SWIGPythonCalculateNumChildren swig_calc_children,
3652c1f46dcSZachary Turner                            SWIGPythonGetChildAtIndex swig_get_child_index,
3662c1f46dcSZachary Turner                            SWIGPythonGetIndexOfChildWithName swig_get_index_child,
3672c1f46dcSZachary Turner                            SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue ,
3682c1f46dcSZachary Turner                            SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue,
3692c1f46dcSZachary Turner                            SWIGPythonUpdateSynthProviderInstance swig_update_provider,
3702c1f46dcSZachary Turner                            SWIGPythonMightHaveChildrenSynthProviderInstance swig_mighthavechildren_provider,
3712c1f46dcSZachary Turner                            SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider,
3722c1f46dcSZachary Turner                            SWIGPythonCallCommand swig_call_command,
3732c1f46dcSZachary Turner                            SWIGPythonCallCommandObject swig_call_command_object,
3742c1f46dcSZachary Turner                            SWIGPythonCallModuleInit swig_call_module_init,
3752c1f46dcSZachary Turner                            SWIGPythonCreateOSPlugin swig_create_os_plugin,
3762c1f46dcSZachary Turner                            SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,
3772c1f46dcSZachary Turner                            SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,
3782c1f46dcSZachary Turner                            SWIGPythonScriptKeyword_Target swig_run_script_keyword_target,
3792c1f46dcSZachary Turner                            SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame,
3802c1f46dcSZachary Turner                            SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,
3812c1f46dcSZachary Turner                            SWIGPython_GetDynamicSetting swig_plugin_get,
3822c1f46dcSZachary Turner                            SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script,
3832c1f46dcSZachary Turner                            SWIGPythonCallThreadPlan swig_call_thread_plan);
3842c1f46dcSZachary Turner 
3852c1f46dcSZachary Turner     const char *
3862c1f46dcSZachary Turner     GetDictionaryName ()
3872c1f46dcSZachary Turner     {
3882c1f46dcSZachary Turner         return m_dictionary_name.c_str();
3892c1f46dcSZachary Turner     }
3902c1f46dcSZachary Turner 
3912c1f46dcSZachary Turner 
3922c1f46dcSZachary Turner     PyThreadState *
3932c1f46dcSZachary Turner     GetThreadState()
3942c1f46dcSZachary Turner     {
3952c1f46dcSZachary Turner         return m_command_thread_state;
3962c1f46dcSZachary Turner     }
3972c1f46dcSZachary Turner 
3982c1f46dcSZachary Turner     void
3992c1f46dcSZachary Turner     SetThreadState (PyThreadState *s)
4002c1f46dcSZachary Turner     {
4012c1f46dcSZachary Turner         if (s)
4022c1f46dcSZachary Turner             m_command_thread_state = s;
4032c1f46dcSZachary Turner     }
4042c1f46dcSZachary Turner 
4052c1f46dcSZachary Turner     //----------------------------------------------------------------------
4062c1f46dcSZachary Turner     // IOHandlerDelegate
4072c1f46dcSZachary Turner     //----------------------------------------------------------------------
4082c1f46dcSZachary Turner     void
4092c1f46dcSZachary Turner     IOHandlerActivated (IOHandler &io_handler) override;
4102c1f46dcSZachary Turner 
4112c1f46dcSZachary Turner     void
4122c1f46dcSZachary Turner     IOHandlerInputComplete (IOHandler &io_handler, std::string &data) override;
4132c1f46dcSZachary Turner 
4142c1f46dcSZachary Turner 
4152c1f46dcSZachary Turner     //------------------------------------------------------------------
4162c1f46dcSZachary Turner     // Static Functions
4172c1f46dcSZachary Turner     //------------------------------------------------------------------
4182c1f46dcSZachary Turner     static void
4192c1f46dcSZachary Turner     Initialize();
4202c1f46dcSZachary Turner 
4212c1f46dcSZachary Turner     static void
4222c1f46dcSZachary Turner     Terminate();
4232c1f46dcSZachary Turner 
4242c1f46dcSZachary Turner     static lldb::ScriptInterpreterSP
4252c1f46dcSZachary Turner     CreateInstance(CommandInterpreter &interpreter);
4262c1f46dcSZachary Turner 
4272c1f46dcSZachary Turner     static lldb_private::ConstString
4282c1f46dcSZachary Turner     GetPluginNameStatic();
4292c1f46dcSZachary Turner 
4302c1f46dcSZachary Turner     static const char *
4312c1f46dcSZachary Turner     GetPluginDescriptionStatic();
4322c1f46dcSZachary Turner 
4332c1f46dcSZachary Turner     //------------------------------------------------------------------
4342c1f46dcSZachary Turner     // PluginInterface protocol
4352c1f46dcSZachary Turner     //------------------------------------------------------------------
4362c1f46dcSZachary Turner     virtual lldb_private::ConstString
437d8d4a57bSGreg Clayton     GetPluginName() override;
4382c1f46dcSZachary Turner 
4392c1f46dcSZachary Turner     virtual uint32_t
440d8d4a57bSGreg Clayton     GetPluginVersion() override;
4412c1f46dcSZachary Turner 
4422c1f46dcSZachary Turner protected:
4432c1f46dcSZachary Turner 
4442c1f46dcSZachary Turner     bool
4452c1f46dcSZachary Turner     EnterSession (uint16_t on_entry_flags,
4462c1f46dcSZachary Turner                   FILE *in,
4472c1f46dcSZachary Turner                   FILE *out,
4482c1f46dcSZachary Turner                   FILE *err);
4492c1f46dcSZachary Turner 
4502c1f46dcSZachary Turner     void
4512c1f46dcSZachary Turner     LeaveSession ();
4522c1f46dcSZachary Turner 
4532c1f46dcSZachary Turner     void
4542c1f46dcSZachary Turner     SaveTerminalState (int fd);
4552c1f46dcSZachary Turner 
4562c1f46dcSZachary Turner     void
4572c1f46dcSZachary Turner     RestoreTerminalState ();
4582c1f46dcSZachary Turner 
4592c1f46dcSZachary Turner     class SynchronicityHandler
4602c1f46dcSZachary Turner     {
4612c1f46dcSZachary Turner     private:
4622c1f46dcSZachary Turner         lldb::DebuggerSP             m_debugger_sp;
4632c1f46dcSZachary Turner         ScriptedCommandSynchronicity m_synch_wanted;
4642c1f46dcSZachary Turner         bool                         m_old_asynch;
4652c1f46dcSZachary Turner     public:
4662c1f46dcSZachary Turner         SynchronicityHandler(lldb::DebuggerSP,
4672c1f46dcSZachary Turner                              ScriptedCommandSynchronicity);
4682c1f46dcSZachary Turner         ~SynchronicityHandler();
4692c1f46dcSZachary Turner     };
4702c1f46dcSZachary Turner 
4712c1f46dcSZachary Turner public:
4722c1f46dcSZachary Turner 	class Locker : public ScriptInterpreterLocker
4732c1f46dcSZachary Turner 	{
4742c1f46dcSZachary Turner 	public:
4752c1f46dcSZachary Turner 
4762c1f46dcSZachary Turner         enum OnEntry
4772c1f46dcSZachary Turner         {
4782c1f46dcSZachary Turner             AcquireLock         = 0x0001,
4792c1f46dcSZachary Turner             InitSession         = 0x0002,
4802c1f46dcSZachary Turner             InitGlobals         = 0x0004,
4812c1f46dcSZachary Turner             NoSTDIN             = 0x0008
4822c1f46dcSZachary Turner         };
4832c1f46dcSZachary Turner 
4842c1f46dcSZachary Turner         enum OnLeave
4852c1f46dcSZachary Turner         {
4862c1f46dcSZachary Turner             FreeLock            = 0x0001,
4872c1f46dcSZachary Turner             FreeAcquiredLock    = 0x0002,    // do not free the lock if we already held it when calling constructor
4882c1f46dcSZachary Turner             TearDownSession     = 0x0004
4892c1f46dcSZachary Turner         };
4902c1f46dcSZachary Turner 
4912c1f46dcSZachary Turner         Locker (ScriptInterpreterPython *py_interpreter = NULL,
4922c1f46dcSZachary Turner                 uint16_t on_entry = AcquireLock | InitSession,
4932c1f46dcSZachary Turner                 uint16_t on_leave = FreeLock | TearDownSession,
4942c1f46dcSZachary Turner                 FILE *in = NULL,
4952c1f46dcSZachary Turner                 FILE *out = NULL,
4962c1f46dcSZachary Turner                 FILE *err = NULL);
4972c1f46dcSZachary Turner 
498280eb8abSPavel Labath         ~Locker () override;
4992c1f46dcSZachary Turner 
5002c1f46dcSZachary Turner 	private:
5012c1f46dcSZachary Turner 
5022c1f46dcSZachary Turner         bool
5032c1f46dcSZachary Turner         DoAcquireLock ();
5042c1f46dcSZachary Turner 
5052c1f46dcSZachary Turner         bool
5062c1f46dcSZachary Turner         DoInitSession (uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err);
5072c1f46dcSZachary Turner 
5082c1f46dcSZachary Turner         bool
5092c1f46dcSZachary Turner         DoFreeLock ();
5102c1f46dcSZachary Turner 
5112c1f46dcSZachary Turner         bool
5122c1f46dcSZachary Turner         DoTearDownSession ();
5132c1f46dcSZachary Turner 
5142c1f46dcSZachary Turner         static void
5152c1f46dcSZachary Turner         ReleasePythonLock ();
5162c1f46dcSZachary Turner 
5172c1f46dcSZachary Turner     	bool                     m_teardown_session;
5182c1f46dcSZachary Turner     	ScriptInterpreterPython *m_python_interpreter;
5192c1f46dcSZachary Turner //    	FILE*                    m_tmp_fh;
5202c1f46dcSZachary Turner         PyGILState_STATE         m_GILState;
5212c1f46dcSZachary Turner 	};
5222c1f46dcSZachary Turner protected:
5232c1f46dcSZachary Turner     enum class AddLocation
5242c1f46dcSZachary Turner     {
5252c1f46dcSZachary Turner         Beginning,
5262c1f46dcSZachary Turner         End
5272c1f46dcSZachary Turner     };
5282c1f46dcSZachary Turner 
5292c1f46dcSZachary Turner     static void AddToSysPath(AddLocation location, std::string path);
5302c1f46dcSZachary Turner 
5312c1f46dcSZachary Turner     uint32_t
5322c1f46dcSZachary Turner     IsExecutingPython () const
5332c1f46dcSZachary Turner     {
5342c1f46dcSZachary Turner         return m_lock_count > 0;
5352c1f46dcSZachary Turner     }
5362c1f46dcSZachary Turner 
5372c1f46dcSZachary Turner     uint32_t
5382c1f46dcSZachary Turner     IncrementLockCount()
5392c1f46dcSZachary Turner     {
5402c1f46dcSZachary Turner         return ++m_lock_count;
5412c1f46dcSZachary Turner     }
5422c1f46dcSZachary Turner 
5432c1f46dcSZachary Turner     uint32_t
5442c1f46dcSZachary Turner     DecrementLockCount()
5452c1f46dcSZachary Turner     {
5462c1f46dcSZachary Turner         if (m_lock_count > 0)
5472c1f46dcSZachary Turner             --m_lock_count;
5482c1f46dcSZachary Turner         return m_lock_count;
5492c1f46dcSZachary Turner     }
5502c1f46dcSZachary Turner 
5512c1f46dcSZachary Turner     enum ActiveIOHandler {
5522c1f46dcSZachary Turner         eIOHandlerNone,
5532c1f46dcSZachary Turner         eIOHandlerBreakpoint,
5542c1f46dcSZachary Turner         eIOHandlerWatchpoint
5552c1f46dcSZachary Turner     };
556*f8b22f8fSZachary Turner 
557*f8b22f8fSZachary Turner     PythonObject &GetMainModule();
5582c1f46dcSZachary Turner 
5592c1f46dcSZachary Turner     PythonDictionary &
5602c1f46dcSZachary Turner     GetSessionDictionary ();
5612c1f46dcSZachary Turner 
5622c1f46dcSZachary Turner     PythonDictionary &
5632c1f46dcSZachary Turner     GetSysModuleDictionary ();
5642c1f46dcSZachary Turner 
5652c1f46dcSZachary Turner     bool
5662c1f46dcSZachary Turner     GetEmbeddedInterpreterModuleObjects ();
5672c1f46dcSZachary Turner 
5682c1f46dcSZachary Turner     PythonObject m_saved_stdin;
5692c1f46dcSZachary Turner     PythonObject m_saved_stdout;
5702c1f46dcSZachary Turner     PythonObject m_saved_stderr;
5712c1f46dcSZachary Turner     PythonObject m_main_module;
5722c1f46dcSZachary Turner     PythonObject m_lldb_module;
5732c1f46dcSZachary Turner     PythonDictionary m_session_dict;
5742c1f46dcSZachary Turner     PythonDictionary m_sys_module_dict;
5752c1f46dcSZachary Turner     PythonObject m_run_one_line_function;
5762c1f46dcSZachary Turner     PythonObject m_run_one_line_str_global;
5772c1f46dcSZachary Turner     std::string m_dictionary_name;
5782c1f46dcSZachary Turner     TerminalState m_terminal_state;
5792c1f46dcSZachary Turner     ActiveIOHandler m_active_io_handler;
5802c1f46dcSZachary Turner     bool m_session_is_active;
5812c1f46dcSZachary Turner     bool m_pty_slave_is_open;
5822c1f46dcSZachary Turner     bool m_valid_session;
5832c1f46dcSZachary Turner     uint32_t m_lock_count;
5842c1f46dcSZachary Turner     PyThreadState *m_command_thread_state;
5852c1f46dcSZachary Turner };
5862c1f46dcSZachary Turner } // namespace lldb_private
5872c1f46dcSZachary Turner 
588280eb8abSPavel Labath #endif // LLDB_DISABLE_PYTHON
5892c1f46dcSZachary Turner 
590280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
591