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 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( 154*4d51a902SRaphael Isemann llvm::StringRef command, CommandReturnObject *result, 1552c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1562c1f46dcSZachary Turner 157b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1582c1f46dcSZachary Turner 159b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 160*4d51a902SRaphael Isemann llvm::StringRef in_string, 161*4d51a902SRaphael Isemann ScriptInterpreter::ScriptReturnType return_type, 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 262*4d51a902SRaphael Isemann RunScriptBasedCommand(const char *impl_function, llvm::StringRef 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 268*4d51a902SRaphael Isemann bool RunScriptBasedCommand( 269*4d51a902SRaphael Isemann StructuredData::GenericSP impl_obj_sp, llvm::StringRef args, 2702c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 271*4d51a902SRaphael Isemann lldb_private::CommandReturnObject &cmd_retobj, Status &error, 2722c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2732c1f46dcSZachary Turner 27497206d57SZachary Turner Status GenerateFunction(const char *signature, 275b9c1b51eSKate Stone const StringList &input) override; 2762c1f46dcSZachary Turner 27797206d57SZachary Turner Status GenerateBreakpointCommandCallbackData(StringList &input, 278b9c1b51eSKate Stone std::string &output) override; 2792c1f46dcSZachary Turner 280b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 281b9c1b51eSKate Stone std::string &output) override; 2822c1f46dcSZachary Turner 2832c1f46dcSZachary Turner // static size_t 2842c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 2852c1f46dcSZachary Turner // InputReader &reader, 286b9c1b51eSKate Stone // lldb::InputReaderAction 287b9c1b51eSKate Stone // notification, 2882c1f46dcSZachary Turner // const char *bytes, 2892c1f46dcSZachary Turner // size_t bytes_len); 2902c1f46dcSZachary Turner // 2912c1f46dcSZachary Turner // static size_t 2922c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 2932c1f46dcSZachary Turner // InputReader &reader, 294b9c1b51eSKate Stone // lldb::InputReaderAction 295b9c1b51eSKate Stone // notification, 2962c1f46dcSZachary Turner // const char *bytes, 2972c1f46dcSZachary Turner // size_t bytes_len); 2982c1f46dcSZachary Turner 299b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 3002c1f46dcSZachary Turner StoppointCallbackContext *context, 3012c1f46dcSZachary Turner lldb::user_id_t break_id, 3022c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 3032c1f46dcSZachary Turner 304b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 3052c1f46dcSZachary Turner StoppointCallbackContext *context, 3062c1f46dcSZachary Turner lldb::user_id_t watch_id); 3072c1f46dcSZachary Turner 308b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 309b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 310b9c1b51eSKate Stone const TypeSummaryOptions &options, 311b9c1b51eSKate Stone std::string &retval) override; 3122c1f46dcSZachary Turner 313b9c1b51eSKate Stone void Clear() override; 3142c1f46dcSZachary Turner 315b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3162c1f46dcSZachary Turner 317b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 318b9c1b51eSKate Stone std::string &dest) override; 3192c1f46dcSZachary Turner 3202c1f46dcSZachary Turner uint32_t 3212c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3222c1f46dcSZachary Turner 323b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 324b9c1b51eSKate Stone std::string &dest) override; 3252c1f46dcSZachary Turner 326b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3272c1f46dcSZachary Turner if (!name || !name[0]) 3282c1f46dcSZachary Turner return false; 3292c1f46dcSZachary Turner std::string temp; 3302c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3312c1f46dcSZachary Turner } 3322c1f46dcSZachary Turner 333b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 33497206d57SZachary Turner std::string &output, Status &error) override; 335b9c1b51eSKate Stone 336b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 33797206d57SZachary Turner std::string &output, Status &error) override; 338b9c1b51eSKate Stone 339b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 34097206d57SZachary Turner std::string &output, Status &error) override; 341b9c1b51eSKate Stone 342b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 34397206d57SZachary Turner std::string &output, Status &error) override; 344b9c1b51eSKate Stone 345b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 34697206d57SZachary Turner std::string &output, Status &error) override; 3472c1f46dcSZachary Turner 3482c1f46dcSZachary Turner bool 349b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 35097206d57SZachary Turner lldb_private::Status &error, 3512c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3522c1f46dcSZachary Turner 353b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3542c1f46dcSZachary Turner 355b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3562c1f46dcSZachary Turner 357b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 358b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3592c1f46dcSZachary Turner CommandReturnObject &result) override; 3602c1f46dcSZachary Turner 3612c1f46dcSZachary Turner void 3622c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3632c1f46dcSZachary Turner CommandReturnObject &result) override; 3642c1f46dcSZachary Turner 3652c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 36697206d57SZachary Turner Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, 3672c1f46dcSZachary Turner const char *callback_body) override; 3682c1f46dcSZachary Turner 369b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 3702c1f46dcSZachary Turner const char *function_name) override; 3712c1f46dcSZachary Turner 372f7e07256SJim Ingham /// This one is for deserialization: 37397206d57SZachary Turner Status SetBreakpointCommandCallback( 374f7e07256SJim Ingham BreakpointOptions *bp_options, 375f7e07256SJim Ingham std::unique_ptr<BreakpointOptions::CommandData> &data_up) override; 376f7e07256SJim Ingham 3772c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 378b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 3792c1f46dcSZachary Turner const char *oneliner) override; 3802c1f46dcSZachary Turner 381b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 3822c1f46dcSZachary Turner 3832c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 3842c1f46dcSZachary Turner 385b9c1b51eSKate Stone static void InitializePrivate(); 386ba456807SPavel Labath 387b9c1b51eSKate Stone static void InitializeInterpreter( 388b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 3892c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 3902c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 3912c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 3922c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 3932c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 3942c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 3952c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 3962c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 3972c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 3982c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 3992c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 400b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 401b9c1b51eSKate Stone swig_mighthavechildren_provider, 4022c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 4032c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 4042c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 4052c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 4062c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 4072c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 4082c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 4092c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 4102c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 4112c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4122c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4132c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 4142c1f46dcSZachary Turner SWIGPythonCallThreadPlan swig_call_thread_plan); 4152c1f46dcSZachary Turner 416b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4172c1f46dcSZachary Turner 418b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4192c1f46dcSZachary Turner 420b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4212c1f46dcSZachary Turner if (s) 4222c1f46dcSZachary Turner m_command_thread_state = s; 4232c1f46dcSZachary Turner } 4242c1f46dcSZachary Turner 4252c1f46dcSZachary Turner //---------------------------------------------------------------------- 4262c1f46dcSZachary Turner // IOHandlerDelegate 4272c1f46dcSZachary Turner //---------------------------------------------------------------------- 428b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4292c1f46dcSZachary Turner 430b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 431b9c1b51eSKate Stone std::string &data) override; 4322c1f46dcSZachary Turner 4332c1f46dcSZachary Turner //------------------------------------------------------------------ 4342c1f46dcSZachary Turner // Static Functions 4352c1f46dcSZachary Turner //------------------------------------------------------------------ 436b9c1b51eSKate Stone static void Initialize(); 4372c1f46dcSZachary Turner 438b9c1b51eSKate Stone static void Terminate(); 4392c1f46dcSZachary Turner 4402c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4412c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4422c1f46dcSZachary Turner 443b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4442c1f46dcSZachary Turner 445b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4462c1f46dcSZachary Turner 4472df331b0SPavel Labath static FileSpec GetPythonDir(); 4482df331b0SPavel Labath 4492c1f46dcSZachary Turner //------------------------------------------------------------------ 4502c1f46dcSZachary Turner // PluginInterface protocol 4512c1f46dcSZachary Turner //------------------------------------------------------------------ 452b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4532c1f46dcSZachary Turner 454b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4552c1f46dcSZachary Turner 456b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4572c1f46dcSZachary Turner public: 458b9c1b51eSKate Stone enum OnEntry { 4592c1f46dcSZachary Turner AcquireLock = 0x0001, 4602c1f46dcSZachary Turner InitSession = 0x0002, 4612c1f46dcSZachary Turner InitGlobals = 0x0004, 4622c1f46dcSZachary Turner NoSTDIN = 0x0008 4632c1f46dcSZachary Turner }; 4642c1f46dcSZachary Turner 465b9c1b51eSKate Stone enum OnLeave { 4662c1f46dcSZachary Turner FreeLock = 0x0001, 467b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 468b9c1b51eSKate Stone // when calling constructor 4692c1f46dcSZachary Turner TearDownSession = 0x0004 4702c1f46dcSZachary Turner }; 4712c1f46dcSZachary Turner 472edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 4732c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 474b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 475b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 4762c1f46dcSZachary Turner 477280eb8abSPavel Labath ~Locker() override; 4782c1f46dcSZachary Turner 4792c1f46dcSZachary Turner private: 480b9c1b51eSKate Stone bool DoAcquireLock(); 4812c1f46dcSZachary Turner 482b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 4832c1f46dcSZachary Turner 484b9c1b51eSKate Stone bool DoFreeLock(); 4852c1f46dcSZachary Turner 486b9c1b51eSKate Stone bool DoTearDownSession(); 4872c1f46dcSZachary Turner 488b9c1b51eSKate Stone static void ReleasePythonLock(); 4892c1f46dcSZachary Turner 4902c1f46dcSZachary Turner bool m_teardown_session; 4912c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 4922c1f46dcSZachary Turner // FILE* m_tmp_fh; 4932c1f46dcSZachary Turner PyGILState_STATE m_GILState; 4942c1f46dcSZachary Turner }; 495edb35d95SEugene Zelenko 4962c1f46dcSZachary Turner protected: 497b9c1b51eSKate Stone class SynchronicityHandler { 498edb35d95SEugene Zelenko private: 499edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 500edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 501edb35d95SEugene Zelenko bool m_old_asynch; 502edb35d95SEugene Zelenko 503edb35d95SEugene Zelenko public: 504b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 505edb35d95SEugene Zelenko 506edb35d95SEugene Zelenko ~SynchronicityHandler(); 507edb35d95SEugene Zelenko }; 5089c40264fSZachary Turner 509b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 5102c1f46dcSZachary Turner 5112c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 5122c1f46dcSZachary Turner 5132df331b0SPavel Labath static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path); 5142df331b0SPavel Labath static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path); 5152df331b0SPavel Labath static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path); 5162df331b0SPavel Labath 517b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 518edb35d95SEugene Zelenko 519b9c1b51eSKate Stone void LeaveSession(); 520edb35d95SEugene Zelenko 521b9c1b51eSKate Stone void SaveTerminalState(int fd); 522edb35d95SEugene Zelenko 523b9c1b51eSKate Stone void RestoreTerminalState(); 524edb35d95SEugene Zelenko 525b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5262c1f46dcSZachary Turner 527b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5282c1f46dcSZachary Turner 529b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5302c1f46dcSZachary Turner if (m_lock_count > 0) 5312c1f46dcSZachary Turner --m_lock_count; 5322c1f46dcSZachary Turner return m_lock_count; 5332c1f46dcSZachary Turner } 5342c1f46dcSZachary Turner 5352c1f46dcSZachary Turner enum ActiveIOHandler { 5362c1f46dcSZachary Turner eIOHandlerNone, 5372c1f46dcSZachary Turner eIOHandlerBreakpoint, 5382c1f46dcSZachary Turner eIOHandlerWatchpoint 5392c1f46dcSZachary Turner }; 540f8b22f8fSZachary Turner 541f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5422c1f46dcSZachary Turner 543b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5442c1f46dcSZachary Turner 545b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5462c1f46dcSZachary Turner 547b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5482c1f46dcSZachary Turner 54923502721SJason Molenda bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 550b9c1b51eSKate Stone const char *mode); 551a31baf08SGreg Clayton 55223502721SJason Molenda PythonFile m_saved_stdin; 55323502721SJason Molenda PythonFile m_saved_stdout; 55423502721SJason Molenda PythonFile m_saved_stderr; 5552c1f46dcSZachary Turner PythonObject m_main_module; 5562c1f46dcSZachary Turner PythonObject m_lldb_module; 5572c1f46dcSZachary Turner PythonDictionary m_session_dict; 5582c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5592c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5602c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5612c1f46dcSZachary Turner std::string m_dictionary_name; 5622c1f46dcSZachary Turner TerminalState m_terminal_state; 5632c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5642c1f46dcSZachary Turner bool m_session_is_active; 5652c1f46dcSZachary Turner bool m_pty_slave_is_open; 5662c1f46dcSZachary Turner bool m_valid_session; 5672c1f46dcSZachary Turner uint32_t m_lock_count; 5682c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 5692c1f46dcSZachary Turner }; 570edb35d95SEugene Zelenko 5712c1f46dcSZachary Turner } // namespace lldb_private 5722c1f46dcSZachary Turner 573d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON 574d68983e3SPavel Labath 575280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 576