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 13d68983e3SPavel Labath #ifdef LLDB_DISABLE_PYTHON 14d68983e3SPavel Labath 15d68983e3SPavel Labath // Python is disabled in this build 16d68983e3SPavel Labath 17d68983e3SPavel Labath #else 18d68983e3SPavel Labath 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 "PythonDataObjects.h" 28f7e07256SJim Ingham #include "lldb/Breakpoint/BreakpointOptions.h" 292c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h" 302c1f46dcSZachary Turner #include "lldb/Host/Terminal.h" 31b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h" 32b9c1b51eSKate Stone #include "lldb/lldb-private.h" 332c1f46dcSZachary Turner 342c1f46dcSZachary Turner class IOHandlerPythonInterpreter; 352c1f46dcSZachary Turner 362c1f46dcSZachary Turner namespace lldb_private { 372c1f46dcSZachary Turner 38b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter, 39b9c1b51eSKate Stone public IOHandlerDelegateMultiline { 402c1f46dcSZachary Turner public: 41f7e07256SJim Ingham class CommandDataPython : public BreakpointOptions::CommandData { 42f7e07256SJim Ingham public: 43f7e07256SJim Ingham CommandDataPython() : BreakpointOptions::CommandData() { 44f7e07256SJim Ingham interpreter = lldb::eScriptLanguagePython; 45f7e07256SJim Ingham } 46f7e07256SJim Ingham }; 47f7e07256SJim Ingham 48c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3 49c5b41d67SZachary Turner typedef PyObject *(*SWIGInitCallback)(void); 50c5b41d67SZachary Turner #else 512c1f46dcSZachary Turner typedef void (*SWIGInitCallback)(void); 52c5b41d67SZachary Turner #endif 532c1f46dcSZachary Turner 54b9c1b51eSKate Stone typedef bool (*SWIGBreakpointCallbackFunction)( 55b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 562c1f46dcSZachary Turner const lldb::StackFrameSP &frame_sp, 572c1f46dcSZachary Turner const lldb::BreakpointLocationSP &bp_loc_sp); 582c1f46dcSZachary Turner 59b9c1b51eSKate Stone typedef bool (*SWIGWatchpointCallbackFunction)( 60b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 61b9c1b51eSKate Stone const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp); 622c1f46dcSZachary Turner 63b9c1b51eSKate Stone typedef bool (*SWIGPythonTypeScriptCallbackFunction)( 64b9c1b51eSKate Stone const char *python_function_name, void *session_dictionary, 65b9c1b51eSKate Stone const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 66b9c1b51eSKate Stone const lldb::TypeSummaryOptionsSP &options, std::string &retval); 672c1f46dcSZachary Turner 68b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateSyntheticProvider)( 69b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 702c1f46dcSZachary Turner const lldb::ValueObjectSP &valobj_sp); 712c1f46dcSZachary Turner 72b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateCommandObject)( 73b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 742c1f46dcSZachary Turner const lldb::DebuggerSP debugger_sp); 752c1f46dcSZachary Turner 76b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateScriptedThreadPlan)( 77b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 782c1f46dcSZachary Turner const lldb::ThreadPlanSP &thread_plan_sp); 792c1f46dcSZachary Turner 80b9c1b51eSKate Stone typedef bool (*SWIGPythonCallThreadPlan)(void *implementor, 81b9c1b51eSKate Stone const char *method_name, 82b9c1b51eSKate Stone Event *event_sp, bool &got_error); 832c1f46dcSZachary Turner 84*3815e702SJim Ingham typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)( 85*3815e702SJim Ingham const char *python_class_name, const char *session_dictionary_name, 86*3815e702SJim Ingham lldb_private::StructuredDataImpl *args_impl, 87*3815e702SJim Ingham lldb::BreakpointSP &bkpt_sp); 88*3815e702SJim Ingham 89*3815e702SJim Ingham typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor, 90*3815e702SJim Ingham const char *method_name, 91*3815e702SJim Ingham lldb_private::SymbolContext *sym_ctx); 92*3815e702SJim Ingham 932c1f46dcSZachary Turner typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name, 942c1f46dcSZachary Turner const char *session_dictionary_name, 952c1f46dcSZachary Turner const lldb::ProcessSP &process_sp); 962c1f46dcSZachary Turner 97b9c1b51eSKate Stone typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor, 98b9c1b51eSKate Stone uint32_t max); 99edb35d95SEugene Zelenko 1002c1f46dcSZachary Turner typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx); 101edb35d95SEugene Zelenko 102b9c1b51eSKate Stone typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor, 103b9c1b51eSKate Stone const char *child_name); 104edb35d95SEugene Zelenko 1052c1f46dcSZachary Turner typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data); 106edb35d95SEugene Zelenko 107b9c1b51eSKate Stone typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)( 108b9c1b51eSKate Stone void *data); 109edb35d95SEugene Zelenko 1102c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data); 111edb35d95SEugene Zelenko 1122c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data); 113edb35d95SEugene Zelenko 1142c1f46dcSZachary Turner typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor); 1152c1f46dcSZachary Turner 116b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommand)( 117b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 118b9c1b51eSKate Stone lldb::DebuggerSP &debugger, const char *args, 1192c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1202c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1212c1f46dcSZachary Turner 122b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommandObject)( 123b9c1b51eSKate Stone void *implementor, lldb::DebuggerSP &debugger, const char *args, 1242c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1252c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1262c1f46dcSZachary Turner 1272c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name, 1282c1f46dcSZachary Turner const char *session_dictionary_name, 1292c1f46dcSZachary Turner lldb::DebuggerSP &debugger); 1302c1f46dcSZachary Turner 131b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Process)( 132b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 133b9c1b51eSKate Stone lldb::ProcessSP &process, std::string &output); 134edb35d95SEugene Zelenko 135b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Thread)( 136b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 137b9c1b51eSKate Stone lldb::ThreadSP &thread, std::string &output); 1382c1f46dcSZachary Turner 139b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Target)( 140b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 141b9c1b51eSKate Stone lldb::TargetSP &target, std::string &output); 1422c1f46dcSZachary Turner 143b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Frame)( 144b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 145b9c1b51eSKate Stone lldb::StackFrameSP &frame, std::string &output); 1462c1f46dcSZachary Turner 147b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Value)( 148b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 149b9c1b51eSKate Stone lldb::ValueObjectSP &value, std::string &output); 1502c1f46dcSZachary Turner 151b9c1b51eSKate Stone typedef void *(*SWIGPython_GetDynamicSetting)( 152b9c1b51eSKate Stone void *module, const char *setting, const lldb::TargetSP &target_sp); 1532c1f46dcSZachary Turner 1542c1f46dcSZachary Turner friend class ::IOHandlerPythonInterpreter; 1552c1f46dcSZachary Turner 1562c1f46dcSZachary Turner ScriptInterpreterPython(CommandInterpreter &interpreter); 1572c1f46dcSZachary Turner 158280eb8abSPavel Labath ~ScriptInterpreterPython() override; 1592c1f46dcSZachary Turner 160b9c1b51eSKate Stone bool Interrupt() override; 1612c1f46dcSZachary Turner 162b9c1b51eSKate Stone bool ExecuteOneLine( 1634d51a902SRaphael Isemann llvm::StringRef command, CommandReturnObject *result, 1642c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1652c1f46dcSZachary Turner 166b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1672c1f46dcSZachary Turner 168b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 1694d51a902SRaphael Isemann llvm::StringRef in_string, 1704d51a902SRaphael Isemann ScriptInterpreter::ScriptReturnType return_type, void *ret_value, 1712c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1722c1f46dcSZachary Turner 17397206d57SZachary Turner lldb_private::Status ExecuteMultipleLines( 174b9c1b51eSKate Stone const char *in_string, 1752c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1762c1f46dcSZachary Turner 17797206d57SZachary Turner Status 1782c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter(StringList &function_def) override; 1792c1f46dcSZachary Turner 180b9c1b51eSKate Stone bool GenerateTypeScriptFunction(StringList &input, std::string &output, 181b9c1b51eSKate Stone const void *name_token = nullptr) override; 1822c1f46dcSZachary Turner 183b9c1b51eSKate Stone bool GenerateTypeSynthClass(StringList &input, std::string &output, 184b9c1b51eSKate Stone const void *name_token = nullptr) override; 1852c1f46dcSZachary Turner 186b9c1b51eSKate Stone bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 187b9c1b51eSKate Stone const void *name_token = nullptr) override; 1882c1f46dcSZachary Turner 1892c1f46dcSZachary Turner // use this if the function code is just a one-liner script 190b9c1b51eSKate Stone bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, 191b9c1b51eSKate Stone const void *name_token = nullptr) override; 1922c1f46dcSZachary Turner 193b9c1b51eSKate Stone bool GenerateScriptAliasFunction(StringList &input, 194b9c1b51eSKate Stone std::string &output) override; 1952c1f46dcSZachary Turner 196b9c1b51eSKate Stone StructuredData::ObjectSP 197b9c1b51eSKate Stone CreateSyntheticScriptedProvider(const char *class_name, 198b9c1b51eSKate Stone lldb::ValueObjectSP valobj) override; 1992c1f46dcSZachary Turner 200b9c1b51eSKate Stone StructuredData::GenericSP 201b9c1b51eSKate Stone CreateScriptCommandObject(const char *class_name) override; 2022c1f46dcSZachary Turner 203b9c1b51eSKate Stone StructuredData::ObjectSP 204b9c1b51eSKate Stone CreateScriptedThreadPlan(const char *class_name, 205b9c1b51eSKate Stone lldb::ThreadPlanSP thread_plan) override; 2062c1f46dcSZachary Turner 207b9c1b51eSKate Stone bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 208b9c1b51eSKate Stone Event *event, 209b9c1b51eSKate Stone bool &script_error) override; 210edb35d95SEugene Zelenko 211b9c1b51eSKate Stone bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 212b9c1b51eSKate Stone Event *event, bool &script_error) override; 213edb35d95SEugene Zelenko 214b9c1b51eSKate Stone bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 215b9c1b51eSKate Stone bool &script_error) override; 216c915a7d2SJim Ingham 217b9c1b51eSKate Stone lldb::StateType 218b9c1b51eSKate Stone ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 219b9c1b51eSKate Stone bool &script_error) override; 2202c1f46dcSZachary Turner 221b9c1b51eSKate Stone StructuredData::GenericSP 222*3815e702SJim Ingham CreateScriptedBreakpointResolver(const char *class_name, 223*3815e702SJim Ingham StructuredDataImpl *args_data, 224*3815e702SJim Ingham lldb::BreakpointSP &bkpt_sp) override; 225*3815e702SJim Ingham bool 226*3815e702SJim Ingham ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP 227*3815e702SJim Ingham implementor_sp, 228*3815e702SJim Ingham SymbolContext *sym_ctx) override; 229*3815e702SJim Ingham 230*3815e702SJim Ingham lldb::SearchDepth 231*3815e702SJim Ingham ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP 232*3815e702SJim Ingham implementor_sp) override; 233*3815e702SJim Ingham 234*3815e702SJim Ingham StructuredData::GenericSP 235b9c1b51eSKate Stone OSPlugin_CreatePluginObject(const char *class_name, 236b9c1b51eSKate Stone lldb::ProcessSP process_sp) override; 2372c1f46dcSZachary Turner 238b9c1b51eSKate Stone StructuredData::DictionarySP 239b9c1b51eSKate Stone OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2402c1f46dcSZachary Turner 241b9c1b51eSKate Stone StructuredData::ArraySP 242b9c1b51eSKate Stone OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2432c1f46dcSZachary Turner 244b9c1b51eSKate Stone StructuredData::StringSP 245b9c1b51eSKate Stone OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, 246b9c1b51eSKate Stone lldb::tid_t thread_id) override; 2472c1f46dcSZachary Turner 248b9c1b51eSKate Stone StructuredData::DictionarySP 249b9c1b51eSKate Stone OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, 250b9c1b51eSKate Stone lldb::tid_t tid, lldb::addr_t context) override; 2512c1f46dcSZachary Turner 252b9c1b51eSKate Stone StructuredData::ObjectSP 253b9c1b51eSKate Stone LoadPluginModule(const FileSpec &file_spec, 25497206d57SZachary Turner lldb_private::Status &error) override; 2552c1f46dcSZachary Turner 256b9c1b51eSKate Stone StructuredData::DictionarySP 257b9c1b51eSKate Stone GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 258b9c1b51eSKate Stone const char *setting_name, 25997206d57SZachary Turner lldb_private::Status &error) override; 2602c1f46dcSZachary Turner 261b9c1b51eSKate Stone size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, 262b9c1b51eSKate Stone uint32_t max) override; 2632c1f46dcSZachary Turner 264b9c1b51eSKate Stone lldb::ValueObjectSP 265b9c1b51eSKate Stone GetChildAtIndex(const StructuredData::ObjectSP &implementor, 266b9c1b51eSKate Stone uint32_t idx) override; 2672c1f46dcSZachary Turner 268b9c1b51eSKate Stone int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 269b9c1b51eSKate Stone const char *child_name) override; 2702c1f46dcSZachary Turner 271b9c1b51eSKate Stone bool UpdateSynthProviderInstance( 272b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2732c1f46dcSZachary Turner 274b9c1b51eSKate Stone bool MightHaveChildrenSynthProviderInstance( 275b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2762c1f46dcSZachary Turner 277b9c1b51eSKate Stone lldb::ValueObjectSP 278b9c1b51eSKate Stone GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 279b9c1b51eSKate Stone 280b9c1b51eSKate Stone ConstString 281b9c1b51eSKate Stone GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override; 2826eec8d6cSEnrico Granata 2832c1f46dcSZachary Turner bool 2844d51a902SRaphael Isemann RunScriptBasedCommand(const char *impl_function, llvm::StringRef args, 2852c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2862c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 28797206d57SZachary Turner Status &error, 2882c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2892c1f46dcSZachary Turner 2904d51a902SRaphael Isemann bool RunScriptBasedCommand( 2914d51a902SRaphael Isemann StructuredData::GenericSP impl_obj_sp, llvm::StringRef args, 2922c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2934d51a902SRaphael Isemann lldb_private::CommandReturnObject &cmd_retobj, Status &error, 2942c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2952c1f46dcSZachary Turner 29697206d57SZachary Turner Status GenerateFunction(const char *signature, 297b9c1b51eSKate Stone const StringList &input) override; 2982c1f46dcSZachary Turner 29997206d57SZachary Turner Status GenerateBreakpointCommandCallbackData(StringList &input, 300b9c1b51eSKate Stone std::string &output) override; 3012c1f46dcSZachary Turner 302b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 303b9c1b51eSKate Stone std::string &output) override; 3042c1f46dcSZachary Turner 3052c1f46dcSZachary Turner // static size_t 3062c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 3072c1f46dcSZachary Turner // InputReader &reader, 308b9c1b51eSKate Stone // lldb::InputReaderAction 309b9c1b51eSKate Stone // notification, 3102c1f46dcSZachary Turner // const char *bytes, 3112c1f46dcSZachary Turner // size_t bytes_len); 3122c1f46dcSZachary Turner // 3132c1f46dcSZachary Turner // static size_t 3142c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 3152c1f46dcSZachary Turner // InputReader &reader, 316b9c1b51eSKate Stone // lldb::InputReaderAction 317b9c1b51eSKate Stone // notification, 3182c1f46dcSZachary Turner // const char *bytes, 3192c1f46dcSZachary Turner // size_t bytes_len); 3202c1f46dcSZachary Turner 321b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 3222c1f46dcSZachary Turner StoppointCallbackContext *context, 3232c1f46dcSZachary Turner lldb::user_id_t break_id, 3242c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 3252c1f46dcSZachary Turner 326b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 3272c1f46dcSZachary Turner StoppointCallbackContext *context, 3282c1f46dcSZachary Turner lldb::user_id_t watch_id); 3292c1f46dcSZachary Turner 330b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 331b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 332b9c1b51eSKate Stone const TypeSummaryOptions &options, 333b9c1b51eSKate Stone std::string &retval) override; 3342c1f46dcSZachary Turner 335b9c1b51eSKate Stone void Clear() override; 3362c1f46dcSZachary Turner 337b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3382c1f46dcSZachary Turner 339b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 340b9c1b51eSKate Stone std::string &dest) override; 3412c1f46dcSZachary Turner 3422c1f46dcSZachary Turner uint32_t 3432c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3442c1f46dcSZachary Turner 345b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 346b9c1b51eSKate Stone std::string &dest) override; 3472c1f46dcSZachary Turner 348b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3492c1f46dcSZachary Turner if (!name || !name[0]) 3502c1f46dcSZachary Turner return false; 3512c1f46dcSZachary Turner std::string temp; 3522c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3532c1f46dcSZachary Turner } 3542c1f46dcSZachary Turner 355b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 35697206d57SZachary Turner std::string &output, Status &error) override; 357b9c1b51eSKate Stone 358b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 35997206d57SZachary Turner std::string &output, Status &error) override; 360b9c1b51eSKate Stone 361b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 36297206d57SZachary Turner std::string &output, Status &error) override; 363b9c1b51eSKate Stone 364b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 36597206d57SZachary Turner std::string &output, Status &error) override; 366b9c1b51eSKate Stone 367b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 36897206d57SZachary Turner std::string &output, Status &error) override; 3692c1f46dcSZachary Turner 3702c1f46dcSZachary Turner bool 371b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 37297206d57SZachary Turner lldb_private::Status &error, 3732c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3742c1f46dcSZachary Turner 375b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3762c1f46dcSZachary Turner 377b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3782c1f46dcSZachary Turner 379b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 380b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3812c1f46dcSZachary Turner CommandReturnObject &result) override; 3822c1f46dcSZachary Turner 3832c1f46dcSZachary Turner void 3842c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3852c1f46dcSZachary Turner CommandReturnObject &result) override; 3862c1f46dcSZachary Turner 3872c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 38897206d57SZachary Turner Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, 3892c1f46dcSZachary Turner const char *callback_body) override; 3902c1f46dcSZachary Turner 391b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 3922c1f46dcSZachary Turner const char *function_name) override; 3932c1f46dcSZachary Turner 394f7e07256SJim Ingham /// This one is for deserialization: 39597206d57SZachary Turner Status SetBreakpointCommandCallback( 396f7e07256SJim Ingham BreakpointOptions *bp_options, 397f7e07256SJim Ingham std::unique_ptr<BreakpointOptions::CommandData> &data_up) override; 398f7e07256SJim Ingham 3992c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 400b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 4012c1f46dcSZachary Turner const char *oneliner) override; 4022c1f46dcSZachary Turner 403b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 4042c1f46dcSZachary Turner 4052c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 4062c1f46dcSZachary Turner 407b9c1b51eSKate Stone static void InitializePrivate(); 408ba456807SPavel Labath 409b9c1b51eSKate Stone static void InitializeInterpreter( 410b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 4112c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 4122c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 4132c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 4142c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 4152c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 4162c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 4172c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 4182c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 4192c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 4202c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 4212c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 422b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 423b9c1b51eSKate Stone swig_mighthavechildren_provider, 4242c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 4252c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 4262c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 4272c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 4282c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 4292c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 4302c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 4312c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 4322c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 4332c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4342c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4352c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 436*3815e702SJim Ingham SWIGPythonCallThreadPlan swig_call_thread_plan, 437*3815e702SJim Ingham SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script, 438*3815e702SJim Ingham SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver); 4392c1f46dcSZachary Turner 440b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4412c1f46dcSZachary Turner 442b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4432c1f46dcSZachary Turner 444b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4452c1f46dcSZachary Turner if (s) 4462c1f46dcSZachary Turner m_command_thread_state = s; 4472c1f46dcSZachary Turner } 4482c1f46dcSZachary Turner 4492c1f46dcSZachary Turner //---------------------------------------------------------------------- 4502c1f46dcSZachary Turner // IOHandlerDelegate 4512c1f46dcSZachary Turner //---------------------------------------------------------------------- 452b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4532c1f46dcSZachary Turner 454b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 455b9c1b51eSKate Stone std::string &data) override; 4562c1f46dcSZachary Turner 4572c1f46dcSZachary Turner //------------------------------------------------------------------ 4582c1f46dcSZachary Turner // Static Functions 4592c1f46dcSZachary Turner //------------------------------------------------------------------ 460b9c1b51eSKate Stone static void Initialize(); 4612c1f46dcSZachary Turner 462b9c1b51eSKate Stone static void Terminate(); 4632c1f46dcSZachary Turner 4642c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4652c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4662c1f46dcSZachary Turner 467b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4682c1f46dcSZachary Turner 469b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4702c1f46dcSZachary Turner 4712df331b0SPavel Labath static FileSpec GetPythonDir(); 4722df331b0SPavel Labath 4732c1f46dcSZachary Turner //------------------------------------------------------------------ 4742c1f46dcSZachary Turner // PluginInterface protocol 4752c1f46dcSZachary Turner //------------------------------------------------------------------ 476b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4772c1f46dcSZachary Turner 478b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4792c1f46dcSZachary Turner 480b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4812c1f46dcSZachary Turner public: 482b9c1b51eSKate Stone enum OnEntry { 4832c1f46dcSZachary Turner AcquireLock = 0x0001, 4842c1f46dcSZachary Turner InitSession = 0x0002, 4852c1f46dcSZachary Turner InitGlobals = 0x0004, 4862c1f46dcSZachary Turner NoSTDIN = 0x0008 4872c1f46dcSZachary Turner }; 4882c1f46dcSZachary Turner 489b9c1b51eSKate Stone enum OnLeave { 4902c1f46dcSZachary Turner FreeLock = 0x0001, 491b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 492b9c1b51eSKate Stone // when calling constructor 4932c1f46dcSZachary Turner TearDownSession = 0x0004 4942c1f46dcSZachary Turner }; 4952c1f46dcSZachary Turner 496edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 4972c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 498b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 499b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 5002c1f46dcSZachary Turner 501280eb8abSPavel Labath ~Locker() override; 5022c1f46dcSZachary Turner 5032c1f46dcSZachary Turner private: 504b9c1b51eSKate Stone bool DoAcquireLock(); 5052c1f46dcSZachary Turner 506b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 5072c1f46dcSZachary Turner 508b9c1b51eSKate Stone bool DoFreeLock(); 5092c1f46dcSZachary Turner 510b9c1b51eSKate Stone bool DoTearDownSession(); 5112c1f46dcSZachary Turner 512b9c1b51eSKate Stone static void ReleasePythonLock(); 5132c1f46dcSZachary Turner 5142c1f46dcSZachary Turner bool m_teardown_session; 5152c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 5162c1f46dcSZachary Turner // FILE* m_tmp_fh; 5172c1f46dcSZachary Turner PyGILState_STATE m_GILState; 5182c1f46dcSZachary Turner }; 519edb35d95SEugene Zelenko 5202c1f46dcSZachary Turner protected: 521b9c1b51eSKate Stone class SynchronicityHandler { 522edb35d95SEugene Zelenko private: 523edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 524edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 525edb35d95SEugene Zelenko bool m_old_asynch; 526edb35d95SEugene Zelenko 527edb35d95SEugene Zelenko public: 528b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 529edb35d95SEugene Zelenko 530edb35d95SEugene Zelenko ~SynchronicityHandler(); 531edb35d95SEugene Zelenko }; 5329c40264fSZachary Turner 533b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 5342c1f46dcSZachary Turner 5352c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 5362c1f46dcSZachary Turner 5372df331b0SPavel Labath static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path); 5382df331b0SPavel Labath static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path); 5392df331b0SPavel Labath static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path); 5402df331b0SPavel Labath 541b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 542edb35d95SEugene Zelenko 543b9c1b51eSKate Stone void LeaveSession(); 544edb35d95SEugene Zelenko 545b9c1b51eSKate Stone void SaveTerminalState(int fd); 546edb35d95SEugene Zelenko 547b9c1b51eSKate Stone void RestoreTerminalState(); 548edb35d95SEugene Zelenko 549b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5502c1f46dcSZachary Turner 551b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5522c1f46dcSZachary Turner 553b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5542c1f46dcSZachary Turner if (m_lock_count > 0) 5552c1f46dcSZachary Turner --m_lock_count; 5562c1f46dcSZachary Turner return m_lock_count; 5572c1f46dcSZachary Turner } 5582c1f46dcSZachary Turner 5592c1f46dcSZachary Turner enum ActiveIOHandler { 5602c1f46dcSZachary Turner eIOHandlerNone, 5612c1f46dcSZachary Turner eIOHandlerBreakpoint, 5622c1f46dcSZachary Turner eIOHandlerWatchpoint 5632c1f46dcSZachary Turner }; 564f8b22f8fSZachary Turner 565f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5662c1f46dcSZachary Turner 567b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5682c1f46dcSZachary Turner 569b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5702c1f46dcSZachary Turner 571b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5722c1f46dcSZachary Turner 57323502721SJason Molenda bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 574b9c1b51eSKate Stone const char *mode); 575a31baf08SGreg Clayton 57623502721SJason Molenda PythonFile m_saved_stdin; 57723502721SJason Molenda PythonFile m_saved_stdout; 57823502721SJason Molenda PythonFile m_saved_stderr; 5792c1f46dcSZachary Turner PythonObject m_main_module; 5802c1f46dcSZachary Turner PythonObject m_lldb_module; 5812c1f46dcSZachary Turner PythonDictionary m_session_dict; 5822c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5832c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5842c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5852c1f46dcSZachary Turner std::string m_dictionary_name; 5862c1f46dcSZachary Turner TerminalState m_terminal_state; 5872c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5882c1f46dcSZachary Turner bool m_session_is_active; 5892c1f46dcSZachary Turner bool m_pty_slave_is_open; 5902c1f46dcSZachary Turner bool m_valid_session; 5912c1f46dcSZachary Turner uint32_t m_lock_count; 5922c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 5932c1f46dcSZachary Turner }; 594edb35d95SEugene Zelenko 5952c1f46dcSZachary Turner } // namespace lldb_private 5962c1f46dcSZachary Turner 597d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON 598d68983e3SPavel Labath 599280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 600