12c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// 22c1f46dcSZachary Turner // 32c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 42c1f46dcSZachary Turner // 52c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 62c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 72c1f46dcSZachary Turner // 82c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 92c1f46dcSZachary Turner 102c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 112c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 122c1f46dcSZachary Turner 132c1f46dcSZachary Turner #ifdef LLDB_DISABLE_PYTHON 142c1f46dcSZachary Turner 152c1f46dcSZachary Turner // Python is disabled in this build 162c1f46dcSZachary Turner 172c1f46dcSZachary Turner #else 182c1f46dcSZachary Turner 19edb35d95SEugene Zelenko // C Includes 20edb35d95SEugene Zelenko // C++ Includes 21edb35d95SEugene Zelenko #include <memory> 22edb35d95SEugene Zelenko #include <string> 23edb35d95SEugene Zelenko #include <vector> 24edb35d95SEugene Zelenko 25edb35d95SEugene Zelenko // Other libraries and framework includes 26edb35d95SEugene Zelenko // Project includes 272c1f46dcSZachary Turner #include "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); 84edb35d95SEugene Zelenko 852c1f46dcSZachary Turner typedef void* (*SWIGPythonGetChildAtIndex) (void *implementor, uint32_t idx); 86edb35d95SEugene Zelenko 872c1f46dcSZachary Turner typedef int (*SWIGPythonGetIndexOfChildWithName) (void *implementor, const char* child_name); 88edb35d95SEugene Zelenko 892c1f46dcSZachary Turner typedef void* (*SWIGPythonCastPyObjectToSBValue) (void* data); 90edb35d95SEugene Zelenko 912c1f46dcSZachary Turner typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue) (void* data); 92edb35d95SEugene Zelenko 932c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance) (void* data); 94edb35d95SEugene Zelenko 952c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance) (void* data); 96edb35d95SEugene 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); 120edb35d95SEugene 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 176edb35d95SEugene Zelenko GenerateTypeScriptFunction(StringList &input, std::string& output, const void* name_token = nullptr) override; 1772c1f46dcSZachary Turner 1782c1f46dcSZachary Turner bool 179edb35d95SEugene Zelenko GenerateTypeSynthClass(StringList &input, std::string& output, const void* name_token = nullptr) override; 1802c1f46dcSZachary Turner 1812c1f46dcSZachary Turner bool 182edb35d95SEugene 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 186edb35d95SEugene 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; 198edb35d95SEugene Zelenko 1992c1f46dcSZachary Turner bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) override; 200edb35d95SEugene 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 375*ba456807SPavel Labath InitializePrivate (); 376*ba456807SPavel Labath 377*ba456807SPavel Labath 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 //------------------------------------------------------------------ 454edb35d95SEugene Zelenko lldb_private::ConstString 455d8d4a57bSGreg Clayton GetPluginName() override; 4562c1f46dcSZachary Turner 457edb35d95SEugene 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 478edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 4792c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 4802c1f46dcSZachary Turner uint16_t on_leave = FreeLock | TearDownSession, 481edb35d95SEugene Zelenko FILE *in = nullptr, 482edb35d95SEugene Zelenko FILE *out = nullptr, 483edb35d95SEugene 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 }; 508edb35d95SEugene Zelenko 5092c1f46dcSZachary Turner protected: 510edb35d95SEugene Zelenko class SynchronicityHandler 511edb35d95SEugene Zelenko { 512edb35d95SEugene Zelenko private: 513edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 514edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 515edb35d95SEugene Zelenko bool m_old_asynch; 516edb35d95SEugene Zelenko 517edb35d95SEugene Zelenko public: 518edb35d95SEugene Zelenko SynchronicityHandler(lldb::DebuggerSP, 519edb35d95SEugene Zelenko ScriptedCommandSynchronicity); 520edb35d95SEugene Zelenko 521edb35d95SEugene Zelenko ~SynchronicityHandler(); 522edb35d95SEugene 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 532edb35d95SEugene Zelenko bool 533edb35d95SEugene Zelenko EnterSession(uint16_t on_entry_flags, 534edb35d95SEugene Zelenko FILE *in, 535edb35d95SEugene Zelenko FILE *out, 536edb35d95SEugene Zelenko FILE *err); 537edb35d95SEugene Zelenko 538edb35d95SEugene Zelenko void 539edb35d95SEugene Zelenko LeaveSession(); 540edb35d95SEugene Zelenko 541edb35d95SEugene Zelenko void 542edb35d95SEugene Zelenko SaveTerminalState(int fd); 543edb35d95SEugene Zelenko 544edb35d95SEugene Zelenko void 545edb35d95SEugene Zelenko RestoreTerminalState(); 546edb35d95SEugene 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 584a31baf08SGreg Clayton bool 585a31baf08SGreg Clayton SetStdHandle(File &file, const char *py_name, PythonFile &save_file, const char *mode); 586a31baf08SGreg Clayton 58732064024SZachary Turner PythonFile m_saved_stdin; 58832064024SZachary Turner PythonFile m_saved_stdout; 58932064024SZachary Turner PythonFile m_saved_stderr; 5902c1f46dcSZachary Turner PythonObject m_main_module; 5912c1f46dcSZachary Turner PythonObject m_lldb_module; 5922c1f46dcSZachary Turner PythonDictionary m_session_dict; 5932c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5942c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5952c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5962c1f46dcSZachary Turner std::string m_dictionary_name; 5972c1f46dcSZachary Turner TerminalState m_terminal_state; 5982c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5992c1f46dcSZachary Turner bool m_session_is_active; 6002c1f46dcSZachary Turner bool m_pty_slave_is_open; 6012c1f46dcSZachary Turner bool m_valid_session; 6022c1f46dcSZachary Turner uint32_t m_lock_count; 6032c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 6042c1f46dcSZachary Turner }; 605edb35d95SEugene Zelenko 6062c1f46dcSZachary Turner } // namespace lldb_private 6072c1f46dcSZachary Turner 608280eb8abSPavel Labath #endif // LLDB_DISABLE_PYTHON 6092c1f46dcSZachary Turner 610280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 611