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