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 13*d68983e3SPavel Labath #ifdef LLDB_DISABLE_PYTHON 14*d68983e3SPavel Labath 15*d68983e3SPavel Labath // Python is disabled in this build 16*d68983e3SPavel Labath 17*d68983e3SPavel Labath #else 18*d68983e3SPavel 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 842c1f46dcSZachary Turner typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name, 852c1f46dcSZachary Turner const char *session_dictionary_name, 862c1f46dcSZachary Turner const lldb::ProcessSP &process_sp); 872c1f46dcSZachary Turner 88b9c1b51eSKate Stone typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor, 89b9c1b51eSKate Stone uint32_t max); 90edb35d95SEugene Zelenko 912c1f46dcSZachary Turner typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx); 92edb35d95SEugene Zelenko 93b9c1b51eSKate Stone typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor, 94b9c1b51eSKate Stone const char *child_name); 95edb35d95SEugene Zelenko 962c1f46dcSZachary Turner typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data); 97edb35d95SEugene Zelenko 98b9c1b51eSKate Stone typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)( 99b9c1b51eSKate Stone void *data); 100edb35d95SEugene Zelenko 1012c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data); 102edb35d95SEugene Zelenko 1032c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data); 104edb35d95SEugene Zelenko 1052c1f46dcSZachary Turner typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor); 1062c1f46dcSZachary Turner 107b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommand)( 108b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 109b9c1b51eSKate Stone lldb::DebuggerSP &debugger, const char *args, 1102c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1112c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1122c1f46dcSZachary Turner 113b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommandObject)( 114b9c1b51eSKate Stone void *implementor, lldb::DebuggerSP &debugger, const char *args, 1152c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1162c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1172c1f46dcSZachary Turner 1182c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name, 1192c1f46dcSZachary Turner const char *session_dictionary_name, 1202c1f46dcSZachary Turner lldb::DebuggerSP &debugger); 1212c1f46dcSZachary Turner 122b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Process)( 123b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 124b9c1b51eSKate Stone lldb::ProcessSP &process, std::string &output); 125edb35d95SEugene Zelenko 126b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Thread)( 127b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 128b9c1b51eSKate Stone lldb::ThreadSP &thread, std::string &output); 1292c1f46dcSZachary Turner 130b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Target)( 131b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 132b9c1b51eSKate Stone lldb::TargetSP &target, std::string &output); 1332c1f46dcSZachary Turner 134b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Frame)( 135b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 136b9c1b51eSKate Stone lldb::StackFrameSP &frame, std::string &output); 1372c1f46dcSZachary Turner 138b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Value)( 139b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 140b9c1b51eSKate Stone lldb::ValueObjectSP &value, std::string &output); 1412c1f46dcSZachary Turner 142b9c1b51eSKate Stone typedef void *(*SWIGPython_GetDynamicSetting)( 143b9c1b51eSKate Stone void *module, const char *setting, 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 151b9c1b51eSKate Stone bool Interrupt() override; 1522c1f46dcSZachary Turner 153b9c1b51eSKate Stone bool ExecuteOneLine( 154b9c1b51eSKate Stone const char *command, CommandReturnObject *result, 1552c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1562c1f46dcSZachary Turner 157b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1582c1f46dcSZachary Turner 159b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 160b9c1b51eSKate Stone const char *in_string, ScriptInterpreter::ScriptReturnType return_type, 1612c1f46dcSZachary Turner void *ret_value, 1622c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1632c1f46dcSZachary Turner 16497206d57SZachary Turner lldb_private::Status ExecuteMultipleLines( 165b9c1b51eSKate Stone const char *in_string, 1662c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1672c1f46dcSZachary Turner 16897206d57SZachary Turner Status 1692c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter(StringList &function_def) override; 1702c1f46dcSZachary Turner 171b9c1b51eSKate Stone bool GenerateTypeScriptFunction(StringList &input, std::string &output, 172b9c1b51eSKate Stone const void *name_token = nullptr) override; 1732c1f46dcSZachary Turner 174b9c1b51eSKate Stone bool GenerateTypeSynthClass(StringList &input, std::string &output, 175b9c1b51eSKate Stone const void *name_token = nullptr) override; 1762c1f46dcSZachary Turner 177b9c1b51eSKate Stone bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 178b9c1b51eSKate Stone const void *name_token = nullptr) override; 1792c1f46dcSZachary Turner 1802c1f46dcSZachary Turner // use this if the function code is just a one-liner script 181b9c1b51eSKate Stone bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, 182b9c1b51eSKate Stone const void *name_token = nullptr) override; 1832c1f46dcSZachary Turner 184b9c1b51eSKate Stone bool GenerateScriptAliasFunction(StringList &input, 185b9c1b51eSKate Stone std::string &output) override; 1862c1f46dcSZachary Turner 187b9c1b51eSKate Stone StructuredData::ObjectSP 188b9c1b51eSKate Stone CreateSyntheticScriptedProvider(const char *class_name, 189b9c1b51eSKate Stone lldb::ValueObjectSP valobj) override; 1902c1f46dcSZachary Turner 191b9c1b51eSKate Stone StructuredData::GenericSP 192b9c1b51eSKate Stone CreateScriptCommandObject(const char *class_name) override; 1932c1f46dcSZachary Turner 194b9c1b51eSKate Stone StructuredData::ObjectSP 195b9c1b51eSKate Stone CreateScriptedThreadPlan(const char *class_name, 196b9c1b51eSKate Stone lldb::ThreadPlanSP thread_plan) override; 1972c1f46dcSZachary Turner 198b9c1b51eSKate Stone bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 199b9c1b51eSKate Stone Event *event, 200b9c1b51eSKate Stone bool &script_error) override; 201edb35d95SEugene Zelenko 202b9c1b51eSKate Stone bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 203b9c1b51eSKate Stone Event *event, bool &script_error) override; 204edb35d95SEugene Zelenko 205b9c1b51eSKate Stone bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 206b9c1b51eSKate Stone bool &script_error) override; 207c915a7d2SJim Ingham 208b9c1b51eSKate Stone lldb::StateType 209b9c1b51eSKate Stone ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 210b9c1b51eSKate Stone bool &script_error) override; 2112c1f46dcSZachary Turner 212b9c1b51eSKate Stone StructuredData::GenericSP 213b9c1b51eSKate Stone OSPlugin_CreatePluginObject(const char *class_name, 214b9c1b51eSKate Stone lldb::ProcessSP process_sp) override; 2152c1f46dcSZachary Turner 216b9c1b51eSKate Stone StructuredData::DictionarySP 217b9c1b51eSKate Stone OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2182c1f46dcSZachary Turner 219b9c1b51eSKate Stone StructuredData::ArraySP 220b9c1b51eSKate Stone OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2212c1f46dcSZachary Turner 222b9c1b51eSKate Stone StructuredData::StringSP 223b9c1b51eSKate Stone OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, 224b9c1b51eSKate Stone lldb::tid_t thread_id) override; 2252c1f46dcSZachary Turner 226b9c1b51eSKate Stone StructuredData::DictionarySP 227b9c1b51eSKate Stone OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, 228b9c1b51eSKate Stone lldb::tid_t tid, lldb::addr_t context) override; 2292c1f46dcSZachary Turner 230b9c1b51eSKate Stone StructuredData::ObjectSP 231b9c1b51eSKate Stone LoadPluginModule(const FileSpec &file_spec, 23297206d57SZachary Turner lldb_private::Status &error) override; 2332c1f46dcSZachary Turner 234b9c1b51eSKate Stone StructuredData::DictionarySP 235b9c1b51eSKate Stone GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 236b9c1b51eSKate Stone const char *setting_name, 23797206d57SZachary Turner lldb_private::Status &error) override; 2382c1f46dcSZachary Turner 239b9c1b51eSKate Stone size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, 240b9c1b51eSKate Stone uint32_t max) override; 2412c1f46dcSZachary Turner 242b9c1b51eSKate Stone lldb::ValueObjectSP 243b9c1b51eSKate Stone GetChildAtIndex(const StructuredData::ObjectSP &implementor, 244b9c1b51eSKate Stone uint32_t idx) override; 2452c1f46dcSZachary Turner 246b9c1b51eSKate Stone int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 247b9c1b51eSKate Stone const char *child_name) override; 2482c1f46dcSZachary Turner 249b9c1b51eSKate Stone bool UpdateSynthProviderInstance( 250b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2512c1f46dcSZachary Turner 252b9c1b51eSKate Stone bool MightHaveChildrenSynthProviderInstance( 253b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2542c1f46dcSZachary Turner 255b9c1b51eSKate Stone lldb::ValueObjectSP 256b9c1b51eSKate Stone GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 257b9c1b51eSKate Stone 258b9c1b51eSKate Stone ConstString 259b9c1b51eSKate Stone GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override; 2606eec8d6cSEnrico Granata 2612c1f46dcSZachary Turner bool 262b9c1b51eSKate Stone RunScriptBasedCommand(const char *impl_function, const char *args, 2632c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2642c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 26597206d57SZachary Turner Status &error, 2662c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2672c1f46dcSZachary Turner 2682c1f46dcSZachary Turner bool 269b9c1b51eSKate Stone RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp, const char *args, 2702c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2712c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 27297206d57SZachary Turner Status &error, 2732c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2742c1f46dcSZachary Turner 27597206d57SZachary Turner Status GenerateFunction(const char *signature, 276b9c1b51eSKate Stone const StringList &input) override; 2772c1f46dcSZachary Turner 27897206d57SZachary Turner Status GenerateBreakpointCommandCallbackData(StringList &input, 279b9c1b51eSKate Stone std::string &output) override; 2802c1f46dcSZachary Turner 281b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 282b9c1b51eSKate Stone std::string &output) override; 2832c1f46dcSZachary Turner 2842c1f46dcSZachary Turner // static size_t 2852c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 2862c1f46dcSZachary Turner // InputReader &reader, 287b9c1b51eSKate Stone // lldb::InputReaderAction 288b9c1b51eSKate Stone // notification, 2892c1f46dcSZachary Turner // const char *bytes, 2902c1f46dcSZachary Turner // size_t bytes_len); 2912c1f46dcSZachary Turner // 2922c1f46dcSZachary Turner // static size_t 2932c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 2942c1f46dcSZachary Turner // InputReader &reader, 295b9c1b51eSKate Stone // lldb::InputReaderAction 296b9c1b51eSKate Stone // notification, 2972c1f46dcSZachary Turner // const char *bytes, 2982c1f46dcSZachary Turner // size_t bytes_len); 2992c1f46dcSZachary Turner 300b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 3012c1f46dcSZachary Turner StoppointCallbackContext *context, 3022c1f46dcSZachary Turner lldb::user_id_t break_id, 3032c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 3042c1f46dcSZachary Turner 305b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 3062c1f46dcSZachary Turner StoppointCallbackContext *context, 3072c1f46dcSZachary Turner lldb::user_id_t watch_id); 3082c1f46dcSZachary Turner 309b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 310b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 311b9c1b51eSKate Stone const TypeSummaryOptions &options, 312b9c1b51eSKate Stone std::string &retval) override; 3132c1f46dcSZachary Turner 314b9c1b51eSKate Stone void Clear() override; 3152c1f46dcSZachary Turner 316b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3172c1f46dcSZachary Turner 318b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 319b9c1b51eSKate Stone std::string &dest) override; 3202c1f46dcSZachary Turner 3212c1f46dcSZachary Turner uint32_t 3222c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3232c1f46dcSZachary Turner 324b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 325b9c1b51eSKate Stone std::string &dest) override; 3262c1f46dcSZachary Turner 327b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3282c1f46dcSZachary Turner if (!name || !name[0]) 3292c1f46dcSZachary Turner return false; 3302c1f46dcSZachary Turner std::string temp; 3312c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3322c1f46dcSZachary Turner } 3332c1f46dcSZachary Turner 334b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 33597206d57SZachary Turner std::string &output, Status &error) override; 336b9c1b51eSKate Stone 337b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 33897206d57SZachary Turner std::string &output, Status &error) override; 339b9c1b51eSKate Stone 340b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 34197206d57SZachary Turner std::string &output, Status &error) override; 342b9c1b51eSKate Stone 343b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 34497206d57SZachary Turner std::string &output, Status &error) override; 345b9c1b51eSKate Stone 346b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 34797206d57SZachary Turner std::string &output, Status &error) override; 3482c1f46dcSZachary Turner 3492c1f46dcSZachary Turner bool 350b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 35197206d57SZachary Turner lldb_private::Status &error, 3522c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3532c1f46dcSZachary Turner 354b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3552c1f46dcSZachary Turner 356b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3572c1f46dcSZachary Turner 358b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 359b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3602c1f46dcSZachary Turner CommandReturnObject &result) override; 3612c1f46dcSZachary Turner 3622c1f46dcSZachary Turner void 3632c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3642c1f46dcSZachary Turner CommandReturnObject &result) override; 3652c1f46dcSZachary Turner 3662c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 36797206d57SZachary Turner Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, 3682c1f46dcSZachary Turner const char *callback_body) override; 3692c1f46dcSZachary Turner 370b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 3712c1f46dcSZachary Turner const char *function_name) override; 3722c1f46dcSZachary Turner 373f7e07256SJim Ingham /// This one is for deserialization: 37497206d57SZachary Turner Status SetBreakpointCommandCallback( 375f7e07256SJim Ingham BreakpointOptions *bp_options, 376f7e07256SJim Ingham std::unique_ptr<BreakpointOptions::CommandData> &data_up) override; 377f7e07256SJim Ingham 3782c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 379b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 3802c1f46dcSZachary Turner const char *oneliner) override; 3812c1f46dcSZachary Turner 382b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 3832c1f46dcSZachary Turner 3842c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 3852c1f46dcSZachary Turner 386b9c1b51eSKate Stone static void InitializePrivate(); 387ba456807SPavel Labath 388b9c1b51eSKate Stone static void InitializeInterpreter( 389b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 3902c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 3912c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 3922c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 3932c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 3942c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 3952c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 3962c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 3972c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 3982c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 3992c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 4002c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 401b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 402b9c1b51eSKate Stone swig_mighthavechildren_provider, 4032c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 4042c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 4052c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 4062c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 4072c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 4082c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 4092c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 4102c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 4112c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 4122c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4132c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4142c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 4152c1f46dcSZachary Turner SWIGPythonCallThreadPlan swig_call_thread_plan); 4162c1f46dcSZachary Turner 417b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4182c1f46dcSZachary Turner 419b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4202c1f46dcSZachary Turner 421b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4222c1f46dcSZachary Turner if (s) 4232c1f46dcSZachary Turner m_command_thread_state = s; 4242c1f46dcSZachary Turner } 4252c1f46dcSZachary Turner 4262c1f46dcSZachary Turner //---------------------------------------------------------------------- 4272c1f46dcSZachary Turner // IOHandlerDelegate 4282c1f46dcSZachary Turner //---------------------------------------------------------------------- 429b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4302c1f46dcSZachary Turner 431b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 432b9c1b51eSKate Stone std::string &data) override; 4332c1f46dcSZachary Turner 4342c1f46dcSZachary Turner //------------------------------------------------------------------ 4352c1f46dcSZachary Turner // Static Functions 4362c1f46dcSZachary Turner //------------------------------------------------------------------ 437b9c1b51eSKate Stone static void Initialize(); 4382c1f46dcSZachary Turner 439b9c1b51eSKate Stone static void Terminate(); 4402c1f46dcSZachary Turner 4412c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4422c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4432c1f46dcSZachary Turner 444b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4452c1f46dcSZachary Turner 446b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4472c1f46dcSZachary Turner 4482df331b0SPavel Labath static FileSpec GetPythonDir(); 4492df331b0SPavel Labath 4502c1f46dcSZachary Turner //------------------------------------------------------------------ 4512c1f46dcSZachary Turner // PluginInterface protocol 4522c1f46dcSZachary Turner //------------------------------------------------------------------ 453b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4542c1f46dcSZachary Turner 455b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4562c1f46dcSZachary Turner 457b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4582c1f46dcSZachary Turner public: 459b9c1b51eSKate Stone enum OnEntry { 4602c1f46dcSZachary Turner AcquireLock = 0x0001, 4612c1f46dcSZachary Turner InitSession = 0x0002, 4622c1f46dcSZachary Turner InitGlobals = 0x0004, 4632c1f46dcSZachary Turner NoSTDIN = 0x0008 4642c1f46dcSZachary Turner }; 4652c1f46dcSZachary Turner 466b9c1b51eSKate Stone enum OnLeave { 4672c1f46dcSZachary Turner FreeLock = 0x0001, 468b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 469b9c1b51eSKate Stone // when calling constructor 4702c1f46dcSZachary Turner TearDownSession = 0x0004 4712c1f46dcSZachary Turner }; 4722c1f46dcSZachary Turner 473edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 4742c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 475b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 476b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 4772c1f46dcSZachary Turner 478280eb8abSPavel Labath ~Locker() override; 4792c1f46dcSZachary Turner 4802c1f46dcSZachary Turner private: 481b9c1b51eSKate Stone bool DoAcquireLock(); 4822c1f46dcSZachary Turner 483b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 4842c1f46dcSZachary Turner 485b9c1b51eSKate Stone bool DoFreeLock(); 4862c1f46dcSZachary Turner 487b9c1b51eSKate Stone bool DoTearDownSession(); 4882c1f46dcSZachary Turner 489b9c1b51eSKate Stone static void ReleasePythonLock(); 4902c1f46dcSZachary Turner 4912c1f46dcSZachary Turner bool m_teardown_session; 4922c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 4932c1f46dcSZachary Turner // FILE* m_tmp_fh; 4942c1f46dcSZachary Turner PyGILState_STATE m_GILState; 4952c1f46dcSZachary Turner }; 496edb35d95SEugene Zelenko 4972c1f46dcSZachary Turner protected: 498b9c1b51eSKate Stone class SynchronicityHandler { 499edb35d95SEugene Zelenko private: 500edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 501edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 502edb35d95SEugene Zelenko bool m_old_asynch; 503edb35d95SEugene Zelenko 504edb35d95SEugene Zelenko public: 505b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 506edb35d95SEugene Zelenko 507edb35d95SEugene Zelenko ~SynchronicityHandler(); 508edb35d95SEugene Zelenko }; 5099c40264fSZachary Turner 510b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 5112c1f46dcSZachary Turner 5122c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 5132c1f46dcSZachary Turner 5142df331b0SPavel Labath static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path); 5152df331b0SPavel Labath static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path); 5162df331b0SPavel Labath static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path); 5172df331b0SPavel Labath 518b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 519edb35d95SEugene Zelenko 520b9c1b51eSKate Stone void LeaveSession(); 521edb35d95SEugene Zelenko 522b9c1b51eSKate Stone void SaveTerminalState(int fd); 523edb35d95SEugene Zelenko 524b9c1b51eSKate Stone void RestoreTerminalState(); 525edb35d95SEugene Zelenko 526b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5272c1f46dcSZachary Turner 528b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5292c1f46dcSZachary Turner 530b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5312c1f46dcSZachary Turner if (m_lock_count > 0) 5322c1f46dcSZachary Turner --m_lock_count; 5332c1f46dcSZachary Turner return m_lock_count; 5342c1f46dcSZachary Turner } 5352c1f46dcSZachary Turner 5362c1f46dcSZachary Turner enum ActiveIOHandler { 5372c1f46dcSZachary Turner eIOHandlerNone, 5382c1f46dcSZachary Turner eIOHandlerBreakpoint, 5392c1f46dcSZachary Turner eIOHandlerWatchpoint 5402c1f46dcSZachary Turner }; 541f8b22f8fSZachary Turner 542f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5432c1f46dcSZachary Turner 544b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5452c1f46dcSZachary Turner 546b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5472c1f46dcSZachary Turner 548b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5492c1f46dcSZachary Turner 55023502721SJason Molenda bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 551b9c1b51eSKate Stone const char *mode); 552a31baf08SGreg Clayton 55323502721SJason Molenda PythonFile m_saved_stdin; 55423502721SJason Molenda PythonFile m_saved_stdout; 55523502721SJason Molenda PythonFile m_saved_stderr; 5562c1f46dcSZachary Turner PythonObject m_main_module; 5572c1f46dcSZachary Turner PythonObject m_lldb_module; 5582c1f46dcSZachary Turner PythonDictionary m_session_dict; 5592c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5602c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5612c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5622c1f46dcSZachary Turner std::string m_dictionary_name; 5632c1f46dcSZachary Turner TerminalState m_terminal_state; 5642c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5652c1f46dcSZachary Turner bool m_session_is_active; 5662c1f46dcSZachary Turner bool m_pty_slave_is_open; 5672c1f46dcSZachary Turner bool m_valid_session; 5682c1f46dcSZachary Turner uint32_t m_lock_count; 5692c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 5702c1f46dcSZachary Turner }; 571edb35d95SEugene Zelenko 5722c1f46dcSZachary Turner } // namespace lldb_private 5732c1f46dcSZachary Turner 574*d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON 575*d68983e3SPavel Labath 576280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 577