12c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// 22c1f46dcSZachary Turner // 32c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 42c1f46dcSZachary Turner // 52c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 62c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 72c1f46dcSZachary Turner // 82c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 92c1f46dcSZachary Turner 102c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 112c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 122c1f46dcSZachary Turner 132c1f46dcSZachary Turner #ifdef LLDB_DISABLE_PYTHON 142c1f46dcSZachary Turner 152c1f46dcSZachary Turner // Python is disabled in this build 162c1f46dcSZachary Turner 172c1f46dcSZachary Turner #else 182c1f46dcSZachary Turner 19edb35d95SEugene Zelenko // C Includes 20edb35d95SEugene Zelenko // C++ Includes 21edb35d95SEugene Zelenko #include <memory> 22edb35d95SEugene Zelenko #include <string> 23edb35d95SEugene Zelenko #include <vector> 24edb35d95SEugene Zelenko 25edb35d95SEugene Zelenko // Other libraries and framework includes 26edb35d95SEugene Zelenko // Project includes 272c1f46dcSZachary Turner #include "PythonDataObjects.h" 282c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h" 292c1f46dcSZachary Turner #include "lldb/Host/Terminal.h" 30*b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h" 31*b9c1b51eSKate Stone #include "lldb/lldb-private.h" 322c1f46dcSZachary Turner 332c1f46dcSZachary Turner class IOHandlerPythonInterpreter; 342c1f46dcSZachary Turner 352c1f46dcSZachary Turner namespace lldb_private { 362c1f46dcSZachary Turner 37*b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter, 38*b9c1b51eSKate Stone public IOHandlerDelegateMultiline { 392c1f46dcSZachary Turner public: 40c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3 41c5b41d67SZachary Turner typedef PyObject *(*SWIGInitCallback)(void); 42c5b41d67SZachary Turner #else 432c1f46dcSZachary Turner typedef void (*SWIGInitCallback)(void); 44c5b41d67SZachary Turner #endif 452c1f46dcSZachary Turner 46*b9c1b51eSKate Stone typedef bool (*SWIGBreakpointCallbackFunction)( 47*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 482c1f46dcSZachary Turner const lldb::StackFrameSP &frame_sp, 492c1f46dcSZachary Turner const lldb::BreakpointLocationSP &bp_loc_sp); 502c1f46dcSZachary Turner 51*b9c1b51eSKate Stone typedef bool (*SWIGWatchpointCallbackFunction)( 52*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 53*b9c1b51eSKate Stone const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp); 542c1f46dcSZachary Turner 55*b9c1b51eSKate Stone typedef bool (*SWIGPythonTypeScriptCallbackFunction)( 56*b9c1b51eSKate Stone const char *python_function_name, void *session_dictionary, 57*b9c1b51eSKate Stone const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 58*b9c1b51eSKate Stone const lldb::TypeSummaryOptionsSP &options, std::string &retval); 592c1f46dcSZachary Turner 60*b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateSyntheticProvider)( 61*b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 622c1f46dcSZachary Turner const lldb::ValueObjectSP &valobj_sp); 632c1f46dcSZachary Turner 64*b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateCommandObject)( 65*b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 662c1f46dcSZachary Turner const lldb::DebuggerSP debugger_sp); 672c1f46dcSZachary Turner 68*b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateScriptedThreadPlan)( 69*b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 702c1f46dcSZachary Turner const lldb::ThreadPlanSP &thread_plan_sp); 712c1f46dcSZachary Turner 72*b9c1b51eSKate Stone typedef bool (*SWIGPythonCallThreadPlan)(void *implementor, 73*b9c1b51eSKate Stone const char *method_name, 74*b9c1b51eSKate Stone Event *event_sp, bool &got_error); 752c1f46dcSZachary Turner 762c1f46dcSZachary Turner typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name, 772c1f46dcSZachary Turner const char *session_dictionary_name, 782c1f46dcSZachary Turner const lldb::ProcessSP &process_sp); 792c1f46dcSZachary Turner 80*b9c1b51eSKate Stone typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor, 81*b9c1b51eSKate Stone uint32_t max); 82edb35d95SEugene Zelenko 832c1f46dcSZachary Turner typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx); 84edb35d95SEugene Zelenko 85*b9c1b51eSKate Stone typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor, 86*b9c1b51eSKate Stone const char *child_name); 87edb35d95SEugene Zelenko 882c1f46dcSZachary Turner typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data); 89edb35d95SEugene Zelenko 90*b9c1b51eSKate Stone typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)( 91*b9c1b51eSKate Stone void *data); 92edb35d95SEugene Zelenko 932c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data); 94edb35d95SEugene Zelenko 952c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data); 96edb35d95SEugene Zelenko 972c1f46dcSZachary Turner typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor); 982c1f46dcSZachary Turner 99*b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommand)( 100*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 101*b9c1b51eSKate Stone lldb::DebuggerSP &debugger, const char *args, 1022c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1032c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1042c1f46dcSZachary Turner 105*b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommandObject)( 106*b9c1b51eSKate Stone void *implementor, lldb::DebuggerSP &debugger, const char *args, 1072c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1082c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1092c1f46dcSZachary Turner 1102c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name, 1112c1f46dcSZachary Turner const char *session_dictionary_name, 1122c1f46dcSZachary Turner lldb::DebuggerSP &debugger); 1132c1f46dcSZachary Turner 114*b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Process)( 115*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 116*b9c1b51eSKate Stone lldb::ProcessSP &process, std::string &output); 117edb35d95SEugene Zelenko 118*b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Thread)( 119*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 120*b9c1b51eSKate Stone lldb::ThreadSP &thread, std::string &output); 1212c1f46dcSZachary Turner 122*b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Target)( 123*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 124*b9c1b51eSKate Stone lldb::TargetSP &target, std::string &output); 1252c1f46dcSZachary Turner 126*b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Frame)( 127*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 128*b9c1b51eSKate Stone lldb::StackFrameSP &frame, std::string &output); 1292c1f46dcSZachary Turner 130*b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Value)( 131*b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 132*b9c1b51eSKate Stone lldb::ValueObjectSP &value, std::string &output); 1332c1f46dcSZachary Turner 134*b9c1b51eSKate Stone typedef void *(*SWIGPython_GetDynamicSetting)( 135*b9c1b51eSKate Stone void *module, const char *setting, const lldb::TargetSP &target_sp); 1362c1f46dcSZachary Turner 1372c1f46dcSZachary Turner friend class ::IOHandlerPythonInterpreter; 1382c1f46dcSZachary Turner 1392c1f46dcSZachary Turner ScriptInterpreterPython(CommandInterpreter &interpreter); 1402c1f46dcSZachary Turner 141280eb8abSPavel Labath ~ScriptInterpreterPython() override; 1422c1f46dcSZachary Turner 143*b9c1b51eSKate Stone bool Interrupt() override; 1442c1f46dcSZachary Turner 145*b9c1b51eSKate Stone bool ExecuteOneLine( 146*b9c1b51eSKate Stone const char *command, CommandReturnObject *result, 1472c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1482c1f46dcSZachary Turner 149*b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1502c1f46dcSZachary Turner 151*b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 152*b9c1b51eSKate Stone const char *in_string, ScriptInterpreter::ScriptReturnType return_type, 1532c1f46dcSZachary Turner void *ret_value, 1542c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1552c1f46dcSZachary Turner 156*b9c1b51eSKate Stone lldb_private::Error ExecuteMultipleLines( 157*b9c1b51eSKate Stone const char *in_string, 1582c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1592c1f46dcSZachary Turner 1602c1f46dcSZachary Turner Error 1612c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter(StringList &function_def) override; 1622c1f46dcSZachary Turner 163*b9c1b51eSKate Stone bool GenerateTypeScriptFunction(StringList &input, std::string &output, 164*b9c1b51eSKate Stone const void *name_token = nullptr) override; 1652c1f46dcSZachary Turner 166*b9c1b51eSKate Stone bool GenerateTypeSynthClass(StringList &input, std::string &output, 167*b9c1b51eSKate Stone const void *name_token = nullptr) override; 1682c1f46dcSZachary Turner 169*b9c1b51eSKate Stone bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 170*b9c1b51eSKate Stone const void *name_token = nullptr) override; 1712c1f46dcSZachary Turner 1722c1f46dcSZachary Turner // use this if the function code is just a one-liner script 173*b9c1b51eSKate Stone bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, 174*b9c1b51eSKate Stone const void *name_token = nullptr) override; 1752c1f46dcSZachary Turner 176*b9c1b51eSKate Stone bool GenerateScriptAliasFunction(StringList &input, 177*b9c1b51eSKate Stone std::string &output) override; 1782c1f46dcSZachary Turner 179*b9c1b51eSKate Stone StructuredData::ObjectSP 180*b9c1b51eSKate Stone CreateSyntheticScriptedProvider(const char *class_name, 181*b9c1b51eSKate Stone lldb::ValueObjectSP valobj) override; 1822c1f46dcSZachary Turner 183*b9c1b51eSKate Stone StructuredData::GenericSP 184*b9c1b51eSKate Stone CreateScriptCommandObject(const char *class_name) override; 1852c1f46dcSZachary Turner 186*b9c1b51eSKate Stone StructuredData::ObjectSP 187*b9c1b51eSKate Stone CreateScriptedThreadPlan(const char *class_name, 188*b9c1b51eSKate Stone lldb::ThreadPlanSP thread_plan) override; 1892c1f46dcSZachary Turner 190*b9c1b51eSKate Stone bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 191*b9c1b51eSKate Stone Event *event, 192*b9c1b51eSKate Stone bool &script_error) override; 193edb35d95SEugene Zelenko 194*b9c1b51eSKate Stone bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 195*b9c1b51eSKate Stone Event *event, bool &script_error) override; 196edb35d95SEugene Zelenko 197*b9c1b51eSKate Stone bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 198*b9c1b51eSKate Stone bool &script_error) override; 199c915a7d2SJim Ingham 200*b9c1b51eSKate Stone lldb::StateType 201*b9c1b51eSKate Stone ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 202*b9c1b51eSKate Stone bool &script_error) override; 2032c1f46dcSZachary Turner 204*b9c1b51eSKate Stone StructuredData::GenericSP 205*b9c1b51eSKate Stone OSPlugin_CreatePluginObject(const char *class_name, 206*b9c1b51eSKate Stone lldb::ProcessSP process_sp) override; 2072c1f46dcSZachary Turner 208*b9c1b51eSKate Stone StructuredData::DictionarySP 209*b9c1b51eSKate Stone OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2102c1f46dcSZachary Turner 211*b9c1b51eSKate Stone StructuredData::ArraySP 212*b9c1b51eSKate Stone OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2132c1f46dcSZachary Turner 214*b9c1b51eSKate Stone StructuredData::StringSP 215*b9c1b51eSKate Stone OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, 216*b9c1b51eSKate Stone lldb::tid_t thread_id) override; 2172c1f46dcSZachary Turner 218*b9c1b51eSKate Stone StructuredData::DictionarySP 219*b9c1b51eSKate Stone OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, 220*b9c1b51eSKate Stone lldb::tid_t tid, lldb::addr_t context) override; 2212c1f46dcSZachary Turner 222*b9c1b51eSKate Stone StructuredData::ObjectSP 223*b9c1b51eSKate Stone LoadPluginModule(const FileSpec &file_spec, 2242c1f46dcSZachary Turner lldb_private::Error &error) override; 2252c1f46dcSZachary Turner 226*b9c1b51eSKate Stone StructuredData::DictionarySP 227*b9c1b51eSKate Stone GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 228*b9c1b51eSKate Stone const char *setting_name, 229*b9c1b51eSKate Stone lldb_private::Error &error) override; 2302c1f46dcSZachary Turner 231*b9c1b51eSKate Stone size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, 232*b9c1b51eSKate Stone uint32_t max) override; 2332c1f46dcSZachary Turner 234*b9c1b51eSKate Stone lldb::ValueObjectSP 235*b9c1b51eSKate Stone GetChildAtIndex(const StructuredData::ObjectSP &implementor, 236*b9c1b51eSKate Stone uint32_t idx) override; 2372c1f46dcSZachary Turner 238*b9c1b51eSKate Stone int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 239*b9c1b51eSKate Stone const char *child_name) override; 2402c1f46dcSZachary Turner 241*b9c1b51eSKate Stone bool UpdateSynthProviderInstance( 242*b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2432c1f46dcSZachary Turner 244*b9c1b51eSKate Stone bool MightHaveChildrenSynthProviderInstance( 245*b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2462c1f46dcSZachary Turner 247*b9c1b51eSKate Stone lldb::ValueObjectSP 248*b9c1b51eSKate Stone GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 249*b9c1b51eSKate Stone 250*b9c1b51eSKate Stone ConstString 251*b9c1b51eSKate Stone GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override; 2526eec8d6cSEnrico Granata 2532c1f46dcSZachary Turner bool 254*b9c1b51eSKate Stone RunScriptBasedCommand(const char *impl_function, const char *args, 2552c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2562c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 2572c1f46dcSZachary Turner Error &error, 2582c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2592c1f46dcSZachary Turner 2602c1f46dcSZachary Turner bool 261*b9c1b51eSKate Stone RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp, const char *args, 2622c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2632c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 2642c1f46dcSZachary Turner Error &error, 2652c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2662c1f46dcSZachary Turner 267*b9c1b51eSKate Stone Error GenerateFunction(const char *signature, 268*b9c1b51eSKate Stone const StringList &input) override; 2692c1f46dcSZachary Turner 270*b9c1b51eSKate Stone Error GenerateBreakpointCommandCallbackData(StringList &input, 271*b9c1b51eSKate Stone std::string &output) override; 2722c1f46dcSZachary Turner 273*b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 274*b9c1b51eSKate Stone std::string &output) override; 2752c1f46dcSZachary Turner 2762c1f46dcSZachary Turner // static size_t 2772c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 2782c1f46dcSZachary Turner // InputReader &reader, 279*b9c1b51eSKate Stone // lldb::InputReaderAction 280*b9c1b51eSKate Stone // notification, 2812c1f46dcSZachary Turner // const char *bytes, 2822c1f46dcSZachary Turner // size_t bytes_len); 2832c1f46dcSZachary Turner // 2842c1f46dcSZachary Turner // static size_t 2852c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 2862c1f46dcSZachary Turner // InputReader &reader, 287*b9c1b51eSKate Stone // lldb::InputReaderAction 288*b9c1b51eSKate Stone // notification, 2892c1f46dcSZachary Turner // const char *bytes, 2902c1f46dcSZachary Turner // size_t bytes_len); 2912c1f46dcSZachary Turner 292*b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 2932c1f46dcSZachary Turner StoppointCallbackContext *context, 2942c1f46dcSZachary Turner lldb::user_id_t break_id, 2952c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 2962c1f46dcSZachary Turner 297*b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 2982c1f46dcSZachary Turner StoppointCallbackContext *context, 2992c1f46dcSZachary Turner lldb::user_id_t watch_id); 3002c1f46dcSZachary Turner 301*b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 302*b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 303*b9c1b51eSKate Stone const TypeSummaryOptions &options, 304*b9c1b51eSKate Stone std::string &retval) override; 3052c1f46dcSZachary Turner 306*b9c1b51eSKate Stone void Clear() override; 3072c1f46dcSZachary Turner 308*b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3092c1f46dcSZachary Turner 310*b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 311*b9c1b51eSKate Stone std::string &dest) override; 3122c1f46dcSZachary Turner 3132c1f46dcSZachary Turner uint32_t 3142c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3152c1f46dcSZachary Turner 316*b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 317*b9c1b51eSKate Stone std::string &dest) override; 3182c1f46dcSZachary Turner 319*b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3202c1f46dcSZachary Turner if (!name || !name[0]) 3212c1f46dcSZachary Turner return false; 3222c1f46dcSZachary Turner std::string temp; 3232c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3242c1f46dcSZachary Turner } 3252c1f46dcSZachary Turner 326*b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 327*b9c1b51eSKate Stone std::string &output, Error &error) override; 328*b9c1b51eSKate Stone 329*b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 330*b9c1b51eSKate Stone std::string &output, Error &error) override; 331*b9c1b51eSKate Stone 332*b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 333*b9c1b51eSKate Stone std::string &output, Error &error) override; 334*b9c1b51eSKate Stone 335*b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 336*b9c1b51eSKate Stone std::string &output, Error &error) override; 337*b9c1b51eSKate Stone 338*b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 339*b9c1b51eSKate Stone std::string &output, Error &error) override; 3402c1f46dcSZachary Turner 3412c1f46dcSZachary Turner bool 342*b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 343*b9c1b51eSKate Stone lldb_private::Error &error, 3442c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3452c1f46dcSZachary Turner 346*b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3472c1f46dcSZachary Turner 348*b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3492c1f46dcSZachary Turner 350*b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 351*b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3522c1f46dcSZachary Turner CommandReturnObject &result) override; 3532c1f46dcSZachary Turner 3542c1f46dcSZachary Turner void 3552c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3562c1f46dcSZachary Turner CommandReturnObject &result) override; 3572c1f46dcSZachary Turner 3582c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 359*b9c1b51eSKate Stone Error SetBreakpointCommandCallback(BreakpointOptions *bp_options, 3602c1f46dcSZachary Turner const char *callback_body) override; 3612c1f46dcSZachary Turner 362*b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 3632c1f46dcSZachary Turner const char *function_name) override; 3642c1f46dcSZachary Turner 3652c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 366*b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 3672c1f46dcSZachary Turner const char *oneliner) override; 3682c1f46dcSZachary Turner 369*b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 3702c1f46dcSZachary Turner 3712c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 3722c1f46dcSZachary Turner 373*b9c1b51eSKate Stone static void InitializePrivate(); 374ba456807SPavel Labath 375*b9c1b51eSKate Stone static void InitializeInterpreter( 376*b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 3772c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 3782c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 3792c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 3802c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 3812c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 3822c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 3832c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 3842c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 3852c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 3862c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 3872c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 388*b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 389*b9c1b51eSKate Stone swig_mighthavechildren_provider, 3902c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 3912c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 3922c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 3932c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 3942c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 3952c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 3962c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 3972c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 3982c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 3992c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4002c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4012c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 4022c1f46dcSZachary Turner SWIGPythonCallThreadPlan swig_call_thread_plan); 4032c1f46dcSZachary Turner 404*b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4052c1f46dcSZachary Turner 406*b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4072c1f46dcSZachary Turner 408*b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4092c1f46dcSZachary Turner if (s) 4102c1f46dcSZachary Turner m_command_thread_state = s; 4112c1f46dcSZachary Turner } 4122c1f46dcSZachary Turner 4132c1f46dcSZachary Turner //---------------------------------------------------------------------- 4142c1f46dcSZachary Turner // IOHandlerDelegate 4152c1f46dcSZachary Turner //---------------------------------------------------------------------- 416*b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4172c1f46dcSZachary Turner 418*b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 419*b9c1b51eSKate Stone std::string &data) override; 4202c1f46dcSZachary Turner 4212c1f46dcSZachary Turner //------------------------------------------------------------------ 4222c1f46dcSZachary Turner // Static Functions 4232c1f46dcSZachary Turner //------------------------------------------------------------------ 424*b9c1b51eSKate Stone static void Initialize(); 4252c1f46dcSZachary Turner 426*b9c1b51eSKate Stone static void Terminate(); 4272c1f46dcSZachary Turner 4282c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4292c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4302c1f46dcSZachary Turner 431*b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4322c1f46dcSZachary Turner 433*b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4342c1f46dcSZachary Turner 4352c1f46dcSZachary Turner //------------------------------------------------------------------ 4362c1f46dcSZachary Turner // PluginInterface protocol 4372c1f46dcSZachary Turner //------------------------------------------------------------------ 438*b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4392c1f46dcSZachary Turner 440*b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4412c1f46dcSZachary Turner 442*b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4432c1f46dcSZachary Turner public: 444*b9c1b51eSKate Stone enum OnEntry { 4452c1f46dcSZachary Turner AcquireLock = 0x0001, 4462c1f46dcSZachary Turner InitSession = 0x0002, 4472c1f46dcSZachary Turner InitGlobals = 0x0004, 4482c1f46dcSZachary Turner NoSTDIN = 0x0008 4492c1f46dcSZachary Turner }; 4502c1f46dcSZachary Turner 451*b9c1b51eSKate Stone enum OnLeave { 4522c1f46dcSZachary Turner FreeLock = 0x0001, 453*b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 454*b9c1b51eSKate Stone // when calling constructor 4552c1f46dcSZachary Turner TearDownSession = 0x0004 4562c1f46dcSZachary Turner }; 4572c1f46dcSZachary Turner 458edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 4592c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 460*b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 461*b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 4622c1f46dcSZachary Turner 463280eb8abSPavel Labath ~Locker() override; 4642c1f46dcSZachary Turner 4652c1f46dcSZachary Turner private: 466*b9c1b51eSKate Stone bool DoAcquireLock(); 4672c1f46dcSZachary Turner 468*b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 4692c1f46dcSZachary Turner 470*b9c1b51eSKate Stone bool DoFreeLock(); 4712c1f46dcSZachary Turner 472*b9c1b51eSKate Stone bool DoTearDownSession(); 4732c1f46dcSZachary Turner 474*b9c1b51eSKate Stone static void ReleasePythonLock(); 4752c1f46dcSZachary Turner 4762c1f46dcSZachary Turner bool m_teardown_session; 4772c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 4782c1f46dcSZachary Turner // FILE* m_tmp_fh; 4792c1f46dcSZachary Turner PyGILState_STATE m_GILState; 4802c1f46dcSZachary Turner }; 481edb35d95SEugene Zelenko 4822c1f46dcSZachary Turner protected: 483*b9c1b51eSKate Stone class SynchronicityHandler { 484edb35d95SEugene Zelenko private: 485edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 486edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 487edb35d95SEugene Zelenko bool m_old_asynch; 488edb35d95SEugene Zelenko 489edb35d95SEugene Zelenko public: 490*b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 491edb35d95SEugene Zelenko 492edb35d95SEugene Zelenko ~SynchronicityHandler(); 493edb35d95SEugene Zelenko }; 4949c40264fSZachary Turner 495*b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 4962c1f46dcSZachary Turner 4972c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 4982c1f46dcSZachary Turner 499*b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 500edb35d95SEugene Zelenko 501*b9c1b51eSKate Stone void LeaveSession(); 502edb35d95SEugene Zelenko 503*b9c1b51eSKate Stone void SaveTerminalState(int fd); 504edb35d95SEugene Zelenko 505*b9c1b51eSKate Stone void RestoreTerminalState(); 506edb35d95SEugene Zelenko 507*b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5082c1f46dcSZachary Turner 509*b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5102c1f46dcSZachary Turner 511*b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5122c1f46dcSZachary Turner if (m_lock_count > 0) 5132c1f46dcSZachary Turner --m_lock_count; 5142c1f46dcSZachary Turner return m_lock_count; 5152c1f46dcSZachary Turner } 5162c1f46dcSZachary Turner 5172c1f46dcSZachary Turner enum ActiveIOHandler { 5182c1f46dcSZachary Turner eIOHandlerNone, 5192c1f46dcSZachary Turner eIOHandlerBreakpoint, 5202c1f46dcSZachary Turner eIOHandlerWatchpoint 5212c1f46dcSZachary Turner }; 522f8b22f8fSZachary Turner 523f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5242c1f46dcSZachary Turner 525*b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5262c1f46dcSZachary Turner 527*b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5282c1f46dcSZachary Turner 529*b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5302c1f46dcSZachary Turner 531*b9c1b51eSKate Stone bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 532*b9c1b51eSKate Stone const char *mode); 533a31baf08SGreg Clayton 53432064024SZachary Turner PythonFile m_saved_stdin; 53532064024SZachary Turner PythonFile m_saved_stdout; 53632064024SZachary Turner PythonFile m_saved_stderr; 5372c1f46dcSZachary Turner PythonObject m_main_module; 5382c1f46dcSZachary Turner PythonObject m_lldb_module; 5392c1f46dcSZachary Turner PythonDictionary m_session_dict; 5402c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5412c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5422c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5432c1f46dcSZachary Turner std::string m_dictionary_name; 5442c1f46dcSZachary Turner TerminalState m_terminal_state; 5452c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5462c1f46dcSZachary Turner bool m_session_is_active; 5472c1f46dcSZachary Turner bool m_pty_slave_is_open; 5482c1f46dcSZachary Turner bool m_valid_session; 5492c1f46dcSZachary Turner uint32_t m_lock_count; 5502c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 5512c1f46dcSZachary Turner }; 552edb35d95SEugene Zelenko 5532c1f46dcSZachary Turner } // namespace lldb_private 5542c1f46dcSZachary Turner 555280eb8abSPavel Labath #endif // LLDB_DISABLE_PYTHON 5562c1f46dcSZachary Turner 557280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 558