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 843815e702SJim Ingham typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)( 853815e702SJim Ingham const char *python_class_name, const char *session_dictionary_name, 863815e702SJim Ingham lldb_private::StructuredDataImpl *args_impl, 873815e702SJim Ingham lldb::BreakpointSP &bkpt_sp); 883815e702SJim Ingham 893815e702SJim Ingham typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor, 903815e702SJim Ingham const char *method_name, 913815e702SJim Ingham lldb_private::SymbolContext *sym_ctx); 923815e702SJim Ingham 932c1f46dcSZachary Turner typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name, 942c1f46dcSZachary Turner const char *session_dictionary_name, 952c1f46dcSZachary Turner const lldb::ProcessSP &process_sp); 962c1f46dcSZachary Turner 97*41ae8e74SKuba Mracek typedef void *(*SWIGPythonCreateFrameRecognizer)( 98*41ae8e74SKuba Mracek const char *python_class_name, const char *session_dictionary_name); 99*41ae8e74SKuba Mracek 100*41ae8e74SKuba Mracek typedef void *(*SWIGPythonGetRecognizedArguments)( 101*41ae8e74SKuba Mracek void *implementor, const lldb::StackFrameSP &frame_sp); 102*41ae8e74SKuba Mracek 103b9c1b51eSKate Stone typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor, 104b9c1b51eSKate Stone uint32_t max); 105edb35d95SEugene Zelenko 1062c1f46dcSZachary Turner typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx); 107edb35d95SEugene Zelenko 108b9c1b51eSKate Stone typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor, 109b9c1b51eSKate Stone const char *child_name); 110edb35d95SEugene Zelenko 1112c1f46dcSZachary Turner typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data); 112edb35d95SEugene Zelenko 113b9c1b51eSKate Stone typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)( 114b9c1b51eSKate Stone void *data); 115edb35d95SEugene Zelenko 1162c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data); 117edb35d95SEugene Zelenko 1182c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data); 119edb35d95SEugene Zelenko 1202c1f46dcSZachary Turner typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor); 1212c1f46dcSZachary Turner 122b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommand)( 123b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 124b9c1b51eSKate Stone lldb::DebuggerSP &debugger, const char *args, 1252c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1262c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1272c1f46dcSZachary Turner 128b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommandObject)( 129b9c1b51eSKate Stone void *implementor, lldb::DebuggerSP &debugger, const char *args, 1302c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1312c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1322c1f46dcSZachary Turner 1332c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name, 1342c1f46dcSZachary Turner const char *session_dictionary_name, 1352c1f46dcSZachary Turner lldb::DebuggerSP &debugger); 1362c1f46dcSZachary Turner 137b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Process)( 138b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 139b9c1b51eSKate Stone lldb::ProcessSP &process, std::string &output); 140edb35d95SEugene Zelenko 141b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Thread)( 142b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 143b9c1b51eSKate Stone lldb::ThreadSP &thread, std::string &output); 1442c1f46dcSZachary Turner 145b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Target)( 146b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 147b9c1b51eSKate Stone lldb::TargetSP &target, std::string &output); 1482c1f46dcSZachary Turner 149b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Frame)( 150b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 151b9c1b51eSKate Stone lldb::StackFrameSP &frame, std::string &output); 1522c1f46dcSZachary Turner 153b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Value)( 154b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 155b9c1b51eSKate Stone lldb::ValueObjectSP &value, std::string &output); 1562c1f46dcSZachary Turner 157b9c1b51eSKate Stone typedef void *(*SWIGPython_GetDynamicSetting)( 158b9c1b51eSKate Stone void *module, const char *setting, const lldb::TargetSP &target_sp); 1592c1f46dcSZachary Turner 1602c1f46dcSZachary Turner friend class ::IOHandlerPythonInterpreter; 1612c1f46dcSZachary Turner 1622c1f46dcSZachary Turner ScriptInterpreterPython(CommandInterpreter &interpreter); 1632c1f46dcSZachary Turner 164280eb8abSPavel Labath ~ScriptInterpreterPython() override; 1652c1f46dcSZachary Turner 166b9c1b51eSKate Stone bool Interrupt() override; 1672c1f46dcSZachary Turner 168b9c1b51eSKate Stone bool ExecuteOneLine( 1694d51a902SRaphael Isemann llvm::StringRef command, CommandReturnObject *result, 1702c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1712c1f46dcSZachary Turner 172b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1732c1f46dcSZachary Turner 174b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 1754d51a902SRaphael Isemann llvm::StringRef in_string, 1764d51a902SRaphael Isemann ScriptInterpreter::ScriptReturnType return_type, void *ret_value, 1772c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1782c1f46dcSZachary Turner 17997206d57SZachary Turner lldb_private::Status ExecuteMultipleLines( 180b9c1b51eSKate Stone const char *in_string, 1812c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1822c1f46dcSZachary Turner 18397206d57SZachary Turner Status 1842c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter(StringList &function_def) override; 1852c1f46dcSZachary Turner 186b9c1b51eSKate Stone bool GenerateTypeScriptFunction(StringList &input, std::string &output, 187b9c1b51eSKate Stone const void *name_token = nullptr) override; 1882c1f46dcSZachary Turner 189b9c1b51eSKate Stone bool GenerateTypeSynthClass(StringList &input, std::string &output, 190b9c1b51eSKate Stone const void *name_token = nullptr) override; 1912c1f46dcSZachary Turner 192b9c1b51eSKate Stone bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 193b9c1b51eSKate Stone const void *name_token = nullptr) override; 1942c1f46dcSZachary Turner 1952c1f46dcSZachary Turner // use this if the function code is just a one-liner script 196b9c1b51eSKate Stone bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, 197b9c1b51eSKate Stone const void *name_token = nullptr) override; 1982c1f46dcSZachary Turner 199b9c1b51eSKate Stone bool GenerateScriptAliasFunction(StringList &input, 200b9c1b51eSKate Stone std::string &output) override; 2012c1f46dcSZachary Turner 202b9c1b51eSKate Stone StructuredData::ObjectSP 203b9c1b51eSKate Stone CreateSyntheticScriptedProvider(const char *class_name, 204b9c1b51eSKate Stone lldb::ValueObjectSP valobj) override; 2052c1f46dcSZachary Turner 206b9c1b51eSKate Stone StructuredData::GenericSP 207b9c1b51eSKate Stone CreateScriptCommandObject(const char *class_name) override; 2082c1f46dcSZachary Turner 209b9c1b51eSKate Stone StructuredData::ObjectSP 210b9c1b51eSKate Stone CreateScriptedThreadPlan(const char *class_name, 211b9c1b51eSKate Stone lldb::ThreadPlanSP thread_plan) override; 2122c1f46dcSZachary Turner 213b9c1b51eSKate Stone bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 214b9c1b51eSKate Stone Event *event, 215b9c1b51eSKate Stone bool &script_error) override; 216edb35d95SEugene Zelenko 217b9c1b51eSKate Stone bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 218b9c1b51eSKate Stone Event *event, bool &script_error) override; 219edb35d95SEugene Zelenko 220b9c1b51eSKate Stone bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 221b9c1b51eSKate Stone bool &script_error) override; 222c915a7d2SJim Ingham 223b9c1b51eSKate Stone lldb::StateType 224b9c1b51eSKate Stone ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 225b9c1b51eSKate Stone bool &script_error) override; 2262c1f46dcSZachary Turner 227b9c1b51eSKate Stone StructuredData::GenericSP 2283815e702SJim Ingham CreateScriptedBreakpointResolver(const char *class_name, 2293815e702SJim Ingham StructuredDataImpl *args_data, 2303815e702SJim Ingham lldb::BreakpointSP &bkpt_sp) override; 2313815e702SJim Ingham bool 2323815e702SJim Ingham ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP 2333815e702SJim Ingham implementor_sp, 2343815e702SJim Ingham SymbolContext *sym_ctx) override; 2353815e702SJim Ingham 2363815e702SJim Ingham lldb::SearchDepth 2373815e702SJim Ingham ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP 2383815e702SJim Ingham implementor_sp) override; 2393815e702SJim Ingham 2403815e702SJim Ingham StructuredData::GenericSP 241*41ae8e74SKuba Mracek CreateFrameRecognizer(const char *class_name) override; 242*41ae8e74SKuba Mracek 243*41ae8e74SKuba Mracek lldb::ValueObjectListSP 244*41ae8e74SKuba Mracek GetRecognizedArguments(const StructuredData::ObjectSP &implementor, 245*41ae8e74SKuba Mracek lldb::StackFrameSP frame_sp) override; 246*41ae8e74SKuba Mracek 247*41ae8e74SKuba Mracek StructuredData::GenericSP 248b9c1b51eSKate Stone OSPlugin_CreatePluginObject(const char *class_name, 249b9c1b51eSKate Stone lldb::ProcessSP process_sp) override; 2502c1f46dcSZachary Turner 251b9c1b51eSKate Stone StructuredData::DictionarySP 252b9c1b51eSKate Stone OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2532c1f46dcSZachary Turner 254b9c1b51eSKate Stone StructuredData::ArraySP 255b9c1b51eSKate Stone OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2562c1f46dcSZachary Turner 257b9c1b51eSKate Stone StructuredData::StringSP 258b9c1b51eSKate Stone OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, 259b9c1b51eSKate Stone lldb::tid_t thread_id) override; 2602c1f46dcSZachary Turner 261b9c1b51eSKate Stone StructuredData::DictionarySP 262b9c1b51eSKate Stone OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, 263b9c1b51eSKate Stone lldb::tid_t tid, lldb::addr_t context) override; 2642c1f46dcSZachary Turner 265b9c1b51eSKate Stone StructuredData::ObjectSP 266b9c1b51eSKate Stone LoadPluginModule(const FileSpec &file_spec, 26797206d57SZachary Turner lldb_private::Status &error) override; 2682c1f46dcSZachary Turner 269b9c1b51eSKate Stone StructuredData::DictionarySP 270b9c1b51eSKate Stone GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 271b9c1b51eSKate Stone const char *setting_name, 27297206d57SZachary Turner lldb_private::Status &error) override; 2732c1f46dcSZachary Turner 274b9c1b51eSKate Stone size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, 275b9c1b51eSKate Stone uint32_t max) override; 2762c1f46dcSZachary Turner 277b9c1b51eSKate Stone lldb::ValueObjectSP 278b9c1b51eSKate Stone GetChildAtIndex(const StructuredData::ObjectSP &implementor, 279b9c1b51eSKate Stone uint32_t idx) override; 2802c1f46dcSZachary Turner 281b9c1b51eSKate Stone int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 282b9c1b51eSKate Stone const char *child_name) override; 2832c1f46dcSZachary Turner 284b9c1b51eSKate Stone bool UpdateSynthProviderInstance( 285b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2862c1f46dcSZachary Turner 287b9c1b51eSKate Stone bool MightHaveChildrenSynthProviderInstance( 288b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2892c1f46dcSZachary Turner 290b9c1b51eSKate Stone lldb::ValueObjectSP 291b9c1b51eSKate Stone GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 292b9c1b51eSKate Stone 293b9c1b51eSKate Stone ConstString 294b9c1b51eSKate Stone GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override; 2956eec8d6cSEnrico Granata 2962c1f46dcSZachary Turner bool 2974d51a902SRaphael Isemann RunScriptBasedCommand(const char *impl_function, llvm::StringRef args, 2982c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2992c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 30097206d57SZachary Turner Status &error, 3012c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 3022c1f46dcSZachary Turner 3034d51a902SRaphael Isemann bool RunScriptBasedCommand( 3044d51a902SRaphael Isemann StructuredData::GenericSP impl_obj_sp, llvm::StringRef args, 3052c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 3064d51a902SRaphael Isemann lldb_private::CommandReturnObject &cmd_retobj, Status &error, 3072c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 3082c1f46dcSZachary Turner 30997206d57SZachary Turner Status GenerateFunction(const char *signature, 310b9c1b51eSKate Stone const StringList &input) override; 3112c1f46dcSZachary Turner 31297206d57SZachary Turner Status GenerateBreakpointCommandCallbackData(StringList &input, 313b9c1b51eSKate Stone std::string &output) override; 3142c1f46dcSZachary Turner 315b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 316b9c1b51eSKate Stone std::string &output) override; 3172c1f46dcSZachary Turner 3182c1f46dcSZachary Turner // static size_t 3192c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 3202c1f46dcSZachary Turner // InputReader &reader, 321b9c1b51eSKate Stone // lldb::InputReaderAction 322b9c1b51eSKate Stone // notification, 3232c1f46dcSZachary Turner // const char *bytes, 3242c1f46dcSZachary Turner // size_t bytes_len); 3252c1f46dcSZachary Turner // 3262c1f46dcSZachary Turner // static size_t 3272c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 3282c1f46dcSZachary Turner // InputReader &reader, 329b9c1b51eSKate Stone // lldb::InputReaderAction 330b9c1b51eSKate Stone // notification, 3312c1f46dcSZachary Turner // const char *bytes, 3322c1f46dcSZachary Turner // size_t bytes_len); 3332c1f46dcSZachary Turner 334b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 3352c1f46dcSZachary Turner StoppointCallbackContext *context, 3362c1f46dcSZachary Turner lldb::user_id_t break_id, 3372c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 3382c1f46dcSZachary Turner 339b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 3402c1f46dcSZachary Turner StoppointCallbackContext *context, 3412c1f46dcSZachary Turner lldb::user_id_t watch_id); 3422c1f46dcSZachary Turner 343b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 344b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 345b9c1b51eSKate Stone const TypeSummaryOptions &options, 346b9c1b51eSKate Stone std::string &retval) override; 3472c1f46dcSZachary Turner 348b9c1b51eSKate Stone void Clear() override; 3492c1f46dcSZachary Turner 350b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3512c1f46dcSZachary Turner 352b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 353b9c1b51eSKate Stone std::string &dest) override; 3542c1f46dcSZachary Turner 3552c1f46dcSZachary Turner uint32_t 3562c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3572c1f46dcSZachary Turner 358b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 359b9c1b51eSKate Stone std::string &dest) override; 3602c1f46dcSZachary Turner 361b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3622c1f46dcSZachary Turner if (!name || !name[0]) 3632c1f46dcSZachary Turner return false; 3642c1f46dcSZachary Turner std::string temp; 3652c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3662c1f46dcSZachary Turner } 3672c1f46dcSZachary Turner 368b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 36997206d57SZachary Turner std::string &output, Status &error) override; 370b9c1b51eSKate Stone 371b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 37297206d57SZachary Turner std::string &output, Status &error) override; 373b9c1b51eSKate Stone 374b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 37597206d57SZachary Turner std::string &output, Status &error) override; 376b9c1b51eSKate Stone 377b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 37897206d57SZachary Turner std::string &output, Status &error) override; 379b9c1b51eSKate Stone 380b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 38197206d57SZachary Turner std::string &output, Status &error) override; 3822c1f46dcSZachary Turner 3832c1f46dcSZachary Turner bool 384b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 38597206d57SZachary Turner lldb_private::Status &error, 3862c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3872c1f46dcSZachary Turner 388b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3892c1f46dcSZachary Turner 390b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3912c1f46dcSZachary Turner 392b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 393b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3942c1f46dcSZachary Turner CommandReturnObject &result) override; 3952c1f46dcSZachary Turner 3962c1f46dcSZachary Turner void 3972c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3982c1f46dcSZachary Turner CommandReturnObject &result) override; 3992c1f46dcSZachary Turner 4002c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 40197206d57SZachary Turner Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, 4022c1f46dcSZachary Turner const char *callback_body) override; 4032c1f46dcSZachary Turner 404b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 4052c1f46dcSZachary Turner const char *function_name) override; 4062c1f46dcSZachary Turner 407f7e07256SJim Ingham /// This one is for deserialization: 40897206d57SZachary Turner Status SetBreakpointCommandCallback( 409f7e07256SJim Ingham BreakpointOptions *bp_options, 410f7e07256SJim Ingham std::unique_ptr<BreakpointOptions::CommandData> &data_up) override; 411f7e07256SJim Ingham 4122c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 413b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 4142c1f46dcSZachary Turner const char *oneliner) override; 4152c1f46dcSZachary Turner 416b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 4172c1f46dcSZachary Turner 4182c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 4192c1f46dcSZachary Turner 420b9c1b51eSKate Stone static void InitializePrivate(); 421ba456807SPavel Labath 422b9c1b51eSKate Stone static void InitializeInterpreter( 423b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 4242c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 4252c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 4262c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 4272c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 4282c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 4292c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 4302c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 4312c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 4322c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 4332c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 4342c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 435b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 436b9c1b51eSKate Stone swig_mighthavechildren_provider, 4372c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 4382c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 4392c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 4402c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 4412c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 442*41ae8e74SKuba Mracek SWIGPythonCreateFrameRecognizer swig_create_frame_recognizer, 443*41ae8e74SKuba Mracek SWIGPythonGetRecognizedArguments swig_get_recognized_arguments, 4442c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 4452c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 4462c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 4472c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 4482c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4492c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4502c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 4513815e702SJim Ingham SWIGPythonCallThreadPlan swig_call_thread_plan, 4523815e702SJim Ingham SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script, 4533815e702SJim Ingham SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver); 4542c1f46dcSZachary Turner 455b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4562c1f46dcSZachary Turner 457b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4582c1f46dcSZachary Turner 459b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4602c1f46dcSZachary Turner if (s) 4612c1f46dcSZachary Turner m_command_thread_state = s; 4622c1f46dcSZachary Turner } 4632c1f46dcSZachary Turner 4642c1f46dcSZachary Turner //---------------------------------------------------------------------- 4652c1f46dcSZachary Turner // IOHandlerDelegate 4662c1f46dcSZachary Turner //---------------------------------------------------------------------- 467b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4682c1f46dcSZachary Turner 469b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 470b9c1b51eSKate Stone std::string &data) override; 4712c1f46dcSZachary Turner 4722c1f46dcSZachary Turner //------------------------------------------------------------------ 4732c1f46dcSZachary Turner // Static Functions 4742c1f46dcSZachary Turner //------------------------------------------------------------------ 475b9c1b51eSKate Stone static void Initialize(); 4762c1f46dcSZachary Turner 477b9c1b51eSKate Stone static void Terminate(); 4782c1f46dcSZachary Turner 4792c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4802c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4812c1f46dcSZachary Turner 482b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4832c1f46dcSZachary Turner 484b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4852c1f46dcSZachary Turner 4862df331b0SPavel Labath static FileSpec GetPythonDir(); 4872df331b0SPavel Labath 4882c1f46dcSZachary Turner //------------------------------------------------------------------ 4892c1f46dcSZachary Turner // PluginInterface protocol 4902c1f46dcSZachary Turner //------------------------------------------------------------------ 491b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4922c1f46dcSZachary Turner 493b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4942c1f46dcSZachary Turner 495b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4962c1f46dcSZachary Turner public: 497b9c1b51eSKate Stone enum OnEntry { 4982c1f46dcSZachary Turner AcquireLock = 0x0001, 4992c1f46dcSZachary Turner InitSession = 0x0002, 5002c1f46dcSZachary Turner InitGlobals = 0x0004, 5012c1f46dcSZachary Turner NoSTDIN = 0x0008 5022c1f46dcSZachary Turner }; 5032c1f46dcSZachary Turner 504b9c1b51eSKate Stone enum OnLeave { 5052c1f46dcSZachary Turner FreeLock = 0x0001, 506b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 507b9c1b51eSKate Stone // when calling constructor 5082c1f46dcSZachary Turner TearDownSession = 0x0004 5092c1f46dcSZachary Turner }; 5102c1f46dcSZachary Turner 511edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 5122c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 513b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 514b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 5152c1f46dcSZachary Turner 516280eb8abSPavel Labath ~Locker() override; 5172c1f46dcSZachary Turner 5182c1f46dcSZachary Turner private: 519b9c1b51eSKate Stone bool DoAcquireLock(); 5202c1f46dcSZachary Turner 521b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 5222c1f46dcSZachary Turner 523b9c1b51eSKate Stone bool DoFreeLock(); 5242c1f46dcSZachary Turner 525b9c1b51eSKate Stone bool DoTearDownSession(); 5262c1f46dcSZachary Turner 527b9c1b51eSKate Stone static void ReleasePythonLock(); 5282c1f46dcSZachary Turner 5292c1f46dcSZachary Turner bool m_teardown_session; 5302c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 5312c1f46dcSZachary Turner // FILE* m_tmp_fh; 5322c1f46dcSZachary Turner PyGILState_STATE m_GILState; 5332c1f46dcSZachary Turner }; 534edb35d95SEugene Zelenko 5352c1f46dcSZachary Turner protected: 536b9c1b51eSKate Stone class SynchronicityHandler { 537edb35d95SEugene Zelenko private: 538edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 539edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 540edb35d95SEugene Zelenko bool m_old_asynch; 541edb35d95SEugene Zelenko 542edb35d95SEugene Zelenko public: 543b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 544edb35d95SEugene Zelenko 545edb35d95SEugene Zelenko ~SynchronicityHandler(); 546edb35d95SEugene Zelenko }; 5479c40264fSZachary Turner 548b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 5492c1f46dcSZachary Turner 5502c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 5512c1f46dcSZachary Turner 5522df331b0SPavel Labath static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path); 5532df331b0SPavel Labath static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path); 5542df331b0SPavel Labath static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path); 5552df331b0SPavel Labath 556b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 557edb35d95SEugene Zelenko 558b9c1b51eSKate Stone void LeaveSession(); 559edb35d95SEugene Zelenko 560b9c1b51eSKate Stone void SaveTerminalState(int fd); 561edb35d95SEugene Zelenko 562b9c1b51eSKate Stone void RestoreTerminalState(); 563edb35d95SEugene Zelenko 564b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5652c1f46dcSZachary Turner 566b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5672c1f46dcSZachary Turner 568b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5692c1f46dcSZachary Turner if (m_lock_count > 0) 5702c1f46dcSZachary Turner --m_lock_count; 5712c1f46dcSZachary Turner return m_lock_count; 5722c1f46dcSZachary Turner } 5732c1f46dcSZachary Turner 5742c1f46dcSZachary Turner enum ActiveIOHandler { 5752c1f46dcSZachary Turner eIOHandlerNone, 5762c1f46dcSZachary Turner eIOHandlerBreakpoint, 5772c1f46dcSZachary Turner eIOHandlerWatchpoint 5782c1f46dcSZachary Turner }; 579f8b22f8fSZachary Turner 580f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5812c1f46dcSZachary Turner 582b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5832c1f46dcSZachary Turner 584b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5852c1f46dcSZachary Turner 586b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5872c1f46dcSZachary Turner 58823502721SJason Molenda bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 589b9c1b51eSKate Stone const char *mode); 590a31baf08SGreg Clayton 59123502721SJason Molenda PythonFile m_saved_stdin; 59223502721SJason Molenda PythonFile m_saved_stdout; 59323502721SJason Molenda PythonFile m_saved_stderr; 5942c1f46dcSZachary Turner PythonObject m_main_module; 5952c1f46dcSZachary Turner PythonObject m_lldb_module; 5962c1f46dcSZachary Turner PythonDictionary m_session_dict; 5972c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5982c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5992c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 6002c1f46dcSZachary Turner std::string m_dictionary_name; 6012c1f46dcSZachary Turner TerminalState m_terminal_state; 6022c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 6032c1f46dcSZachary Turner bool m_session_is_active; 6042c1f46dcSZachary Turner bool m_pty_slave_is_open; 6052c1f46dcSZachary Turner bool m_valid_session; 6062c1f46dcSZachary Turner uint32_t m_lock_count; 6072c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 6082c1f46dcSZachary Turner }; 609edb35d95SEugene Zelenko 6102c1f46dcSZachary Turner } // namespace lldb_private 6112c1f46dcSZachary Turner 612d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON 613d68983e3SPavel Labath 614280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 615