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