12c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// 22c1f46dcSZachary Turner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62c1f46dcSZachary Turner // 72c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 82c1f46dcSZachary Turner 92c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 102c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 112c1f46dcSZachary Turner 12d68983e3SPavel Labath #ifdef LLDB_DISABLE_PYTHON 13d68983e3SPavel Labath 14d68983e3SPavel Labath // Python is disabled in this build 15d68983e3SPavel Labath 16d68983e3SPavel Labath #else 17d68983e3SPavel Labath 18edb35d95SEugene Zelenko #include <memory> 19edb35d95SEugene Zelenko #include <string> 20edb35d95SEugene Zelenko #include <vector> 21edb35d95SEugene Zelenko 222c1f46dcSZachary Turner #include "PythonDataObjects.h" 23f7e07256SJim Ingham #include "lldb/Breakpoint/BreakpointOptions.h" 242c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h" 252c1f46dcSZachary Turner #include "lldb/Host/Terminal.h" 26b9c1b51eSKate Stone #include "lldb/Interpreter/ScriptInterpreter.h" 27b9c1b51eSKate Stone #include "lldb/lldb-private.h" 282c1f46dcSZachary Turner 292c1f46dcSZachary Turner class IOHandlerPythonInterpreter; 302c1f46dcSZachary Turner 312c1f46dcSZachary Turner namespace lldb_private { 322c1f46dcSZachary Turner 33b9c1b51eSKate Stone class ScriptInterpreterPython : public ScriptInterpreter, 34b9c1b51eSKate Stone public IOHandlerDelegateMultiline { 352c1f46dcSZachary Turner public: 36f7e07256SJim Ingham class CommandDataPython : public BreakpointOptions::CommandData { 37f7e07256SJim Ingham public: 38f7e07256SJim Ingham CommandDataPython() : BreakpointOptions::CommandData() { 39f7e07256SJim Ingham interpreter = lldb::eScriptLanguagePython; 40f7e07256SJim Ingham } 41f7e07256SJim Ingham }; 42f7e07256SJim Ingham 43c5b41d67SZachary Turner #if PY_MAJOR_VERSION >= 3 44c5b41d67SZachary Turner typedef PyObject *(*SWIGInitCallback)(void); 45c5b41d67SZachary Turner #else 462c1f46dcSZachary Turner typedef void (*SWIGInitCallback)(void); 47c5b41d67SZachary Turner #endif 482c1f46dcSZachary Turner 49b9c1b51eSKate Stone typedef bool (*SWIGBreakpointCallbackFunction)( 50b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 512c1f46dcSZachary Turner const lldb::StackFrameSP &frame_sp, 522c1f46dcSZachary Turner const lldb::BreakpointLocationSP &bp_loc_sp); 532c1f46dcSZachary Turner 54b9c1b51eSKate Stone typedef bool (*SWIGWatchpointCallbackFunction)( 55b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 56b9c1b51eSKate Stone const lldb::StackFrameSP &frame_sp, const lldb::WatchpointSP &wp_sp); 572c1f46dcSZachary Turner 58b9c1b51eSKate Stone typedef bool (*SWIGPythonTypeScriptCallbackFunction)( 59b9c1b51eSKate Stone const char *python_function_name, void *session_dictionary, 60b9c1b51eSKate Stone const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 61b9c1b51eSKate Stone const lldb::TypeSummaryOptionsSP &options, std::string &retval); 622c1f46dcSZachary Turner 63b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateSyntheticProvider)( 64b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 652c1f46dcSZachary Turner const lldb::ValueObjectSP &valobj_sp); 662c1f46dcSZachary Turner 67b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateCommandObject)( 68b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 692c1f46dcSZachary Turner const lldb::DebuggerSP debugger_sp); 702c1f46dcSZachary Turner 71b9c1b51eSKate Stone typedef void *(*SWIGPythonCreateScriptedThreadPlan)( 72b9c1b51eSKate Stone const char *python_class_name, const char *session_dictionary_name, 732c1f46dcSZachary Turner const lldb::ThreadPlanSP &thread_plan_sp); 742c1f46dcSZachary Turner 75b9c1b51eSKate Stone typedef bool (*SWIGPythonCallThreadPlan)(void *implementor, 76b9c1b51eSKate Stone const char *method_name, 77b9c1b51eSKate Stone Event *event_sp, bool &got_error); 782c1f46dcSZachary Turner 793815e702SJim Ingham typedef void *(*SWIGPythonCreateScriptedBreakpointResolver)( 803815e702SJim Ingham const char *python_class_name, const char *session_dictionary_name, 813815e702SJim Ingham lldb_private::StructuredDataImpl *args_impl, 823815e702SJim Ingham lldb::BreakpointSP &bkpt_sp); 833815e702SJim Ingham 843815e702SJim Ingham typedef unsigned int (*SWIGPythonCallBreakpointResolver)(void *implementor, 853815e702SJim Ingham const char *method_name, 863815e702SJim Ingham lldb_private::SymbolContext *sym_ctx); 873815e702SJim Ingham 882c1f46dcSZachary Turner typedef void *(*SWIGPythonCreateOSPlugin)(const char *python_class_name, 892c1f46dcSZachary Turner const char *session_dictionary_name, 902c1f46dcSZachary Turner const lldb::ProcessSP &process_sp); 912c1f46dcSZachary Turner 9241ae8e74SKuba Mracek typedef void *(*SWIGPythonCreateFrameRecognizer)( 9341ae8e74SKuba Mracek const char *python_class_name, const char *session_dictionary_name); 9441ae8e74SKuba Mracek 9541ae8e74SKuba Mracek typedef void *(*SWIGPythonGetRecognizedArguments)( 9641ae8e74SKuba Mracek void *implementor, const lldb::StackFrameSP &frame_sp); 9741ae8e74SKuba Mracek 98b9c1b51eSKate Stone typedef size_t (*SWIGPythonCalculateNumChildren)(void *implementor, 99b9c1b51eSKate Stone uint32_t max); 100edb35d95SEugene Zelenko 1012c1f46dcSZachary Turner typedef void *(*SWIGPythonGetChildAtIndex)(void *implementor, uint32_t idx); 102edb35d95SEugene Zelenko 103b9c1b51eSKate Stone typedef int (*SWIGPythonGetIndexOfChildWithName)(void *implementor, 104b9c1b51eSKate Stone const char *child_name); 105edb35d95SEugene Zelenko 1062c1f46dcSZachary Turner typedef void *(*SWIGPythonCastPyObjectToSBValue)(void *data); 107edb35d95SEugene Zelenko 108b9c1b51eSKate Stone typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue)( 109b9c1b51eSKate Stone void *data); 110edb35d95SEugene Zelenko 1112c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance)(void *data); 112edb35d95SEugene Zelenko 1132c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance)(void *data); 114edb35d95SEugene Zelenko 1152c1f46dcSZachary Turner typedef void *(*SWIGPythonGetValueSynthProviderInstance)(void *implementor); 1162c1f46dcSZachary Turner 117b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommand)( 118b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 119b9c1b51eSKate Stone lldb::DebuggerSP &debugger, const char *args, 1202c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1212c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1222c1f46dcSZachary Turner 123b9c1b51eSKate Stone typedef bool (*SWIGPythonCallCommandObject)( 124b9c1b51eSKate Stone void *implementor, lldb::DebuggerSP &debugger, const char *args, 1252c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 1262c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 1272c1f46dcSZachary Turner 1282c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit)(const char *python_module_name, 1292c1f46dcSZachary Turner const char *session_dictionary_name, 1302c1f46dcSZachary Turner lldb::DebuggerSP &debugger); 1312c1f46dcSZachary Turner 132b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Process)( 133b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 134b9c1b51eSKate Stone lldb::ProcessSP &process, std::string &output); 135edb35d95SEugene Zelenko 136b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Thread)( 137b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 138b9c1b51eSKate Stone lldb::ThreadSP &thread, std::string &output); 1392c1f46dcSZachary Turner 140b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Target)( 141b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 142b9c1b51eSKate Stone lldb::TargetSP &target, std::string &output); 1432c1f46dcSZachary Turner 144b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Frame)( 145b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 146b9c1b51eSKate Stone lldb::StackFrameSP &frame, std::string &output); 1472c1f46dcSZachary Turner 148b9c1b51eSKate Stone typedef bool (*SWIGPythonScriptKeyword_Value)( 149b9c1b51eSKate Stone const char *python_function_name, const char *session_dictionary_name, 150b9c1b51eSKate Stone lldb::ValueObjectSP &value, std::string &output); 1512c1f46dcSZachary Turner 152b9c1b51eSKate Stone typedef void *(*SWIGPython_GetDynamicSetting)( 153b9c1b51eSKate Stone void *module, const char *setting, const lldb::TargetSP &target_sp); 1542c1f46dcSZachary Turner 1552c1f46dcSZachary Turner friend class ::IOHandlerPythonInterpreter; 1562c1f46dcSZachary Turner 1572c1f46dcSZachary Turner ScriptInterpreterPython(CommandInterpreter &interpreter); 1582c1f46dcSZachary Turner 159280eb8abSPavel Labath ~ScriptInterpreterPython() override; 1602c1f46dcSZachary Turner 161b9c1b51eSKate Stone bool Interrupt() override; 1622c1f46dcSZachary Turner 163b9c1b51eSKate Stone bool ExecuteOneLine( 1644d51a902SRaphael Isemann llvm::StringRef command, CommandReturnObject *result, 1652c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1662c1f46dcSZachary Turner 167b9c1b51eSKate Stone void ExecuteInterpreterLoop() override; 1682c1f46dcSZachary Turner 169b9c1b51eSKate Stone bool ExecuteOneLineWithReturn( 1704d51a902SRaphael Isemann llvm::StringRef in_string, 1714d51a902SRaphael Isemann ScriptInterpreter::ScriptReturnType return_type, void *ret_value, 1722c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1732c1f46dcSZachary Turner 17497206d57SZachary Turner lldb_private::Status ExecuteMultipleLines( 175b9c1b51eSKate Stone const char *in_string, 1762c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 1772c1f46dcSZachary Turner 17897206d57SZachary Turner Status 1792c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter(StringList &function_def) override; 1802c1f46dcSZachary Turner 181b9c1b51eSKate Stone bool GenerateTypeScriptFunction(StringList &input, std::string &output, 182b9c1b51eSKate Stone const void *name_token = nullptr) override; 1832c1f46dcSZachary Turner 184b9c1b51eSKate Stone bool GenerateTypeSynthClass(StringList &input, std::string &output, 185b9c1b51eSKate Stone const void *name_token = nullptr) override; 1862c1f46dcSZachary Turner 187b9c1b51eSKate Stone bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 188b9c1b51eSKate Stone const void *name_token = nullptr) override; 1892c1f46dcSZachary Turner 1902c1f46dcSZachary Turner // use this if the function code is just a one-liner script 191b9c1b51eSKate Stone bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, 192b9c1b51eSKate Stone const void *name_token = nullptr) override; 1932c1f46dcSZachary Turner 194b9c1b51eSKate Stone bool GenerateScriptAliasFunction(StringList &input, 195b9c1b51eSKate Stone std::string &output) override; 1962c1f46dcSZachary Turner 197b9c1b51eSKate Stone StructuredData::ObjectSP 198b9c1b51eSKate Stone CreateSyntheticScriptedProvider(const char *class_name, 199b9c1b51eSKate Stone lldb::ValueObjectSP valobj) override; 2002c1f46dcSZachary Turner 201b9c1b51eSKate Stone StructuredData::GenericSP 202b9c1b51eSKate Stone CreateScriptCommandObject(const char *class_name) override; 2032c1f46dcSZachary Turner 204b9c1b51eSKate Stone StructuredData::ObjectSP 205b9c1b51eSKate Stone CreateScriptedThreadPlan(const char *class_name, 206b9c1b51eSKate Stone lldb::ThreadPlanSP thread_plan) override; 2072c1f46dcSZachary Turner 208b9c1b51eSKate Stone bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 209b9c1b51eSKate Stone Event *event, 210b9c1b51eSKate Stone bool &script_error) override; 211edb35d95SEugene Zelenko 212b9c1b51eSKate Stone bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 213b9c1b51eSKate Stone Event *event, bool &script_error) override; 214edb35d95SEugene Zelenko 215b9c1b51eSKate Stone bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 216b9c1b51eSKate Stone bool &script_error) override; 217c915a7d2SJim Ingham 218b9c1b51eSKate Stone lldb::StateType 219b9c1b51eSKate Stone ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 220b9c1b51eSKate Stone bool &script_error) override; 2212c1f46dcSZachary Turner 222b9c1b51eSKate Stone StructuredData::GenericSP 2233815e702SJim Ingham CreateScriptedBreakpointResolver(const char *class_name, 2243815e702SJim Ingham StructuredDataImpl *args_data, 2253815e702SJim Ingham lldb::BreakpointSP &bkpt_sp) override; 2263815e702SJim Ingham bool 2273815e702SJim Ingham ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP 2283815e702SJim Ingham implementor_sp, 2293815e702SJim Ingham SymbolContext *sym_ctx) override; 2303815e702SJim Ingham 2313815e702SJim Ingham lldb::SearchDepth 2323815e702SJim Ingham ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP 2333815e702SJim Ingham implementor_sp) override; 2343815e702SJim Ingham 2353815e702SJim Ingham StructuredData::GenericSP 23641ae8e74SKuba Mracek CreateFrameRecognizer(const char *class_name) override; 23741ae8e74SKuba Mracek 23841ae8e74SKuba Mracek lldb::ValueObjectListSP 23941ae8e74SKuba Mracek GetRecognizedArguments(const StructuredData::ObjectSP &implementor, 24041ae8e74SKuba Mracek lldb::StackFrameSP frame_sp) override; 24141ae8e74SKuba Mracek 24241ae8e74SKuba Mracek StructuredData::GenericSP 243b9c1b51eSKate Stone OSPlugin_CreatePluginObject(const char *class_name, 244b9c1b51eSKate Stone lldb::ProcessSP process_sp) override; 2452c1f46dcSZachary Turner 246b9c1b51eSKate Stone StructuredData::DictionarySP 247b9c1b51eSKate Stone OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2482c1f46dcSZachary Turner 249b9c1b51eSKate Stone StructuredData::ArraySP 250b9c1b51eSKate Stone OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 2512c1f46dcSZachary Turner 252b9c1b51eSKate Stone StructuredData::StringSP 253b9c1b51eSKate Stone OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, 254b9c1b51eSKate Stone lldb::tid_t thread_id) override; 2552c1f46dcSZachary Turner 256b9c1b51eSKate Stone StructuredData::DictionarySP 257b9c1b51eSKate Stone OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, 258b9c1b51eSKate Stone lldb::tid_t tid, lldb::addr_t context) override; 2592c1f46dcSZachary Turner 260b9c1b51eSKate Stone StructuredData::ObjectSP 261b9c1b51eSKate Stone LoadPluginModule(const FileSpec &file_spec, 26297206d57SZachary Turner lldb_private::Status &error) override; 2632c1f46dcSZachary Turner 264b9c1b51eSKate Stone StructuredData::DictionarySP 265b9c1b51eSKate Stone GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 266b9c1b51eSKate Stone const char *setting_name, 26797206d57SZachary Turner lldb_private::Status &error) override; 2682c1f46dcSZachary Turner 269b9c1b51eSKate Stone size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, 270b9c1b51eSKate Stone uint32_t max) override; 2712c1f46dcSZachary Turner 272b9c1b51eSKate Stone lldb::ValueObjectSP 273b9c1b51eSKate Stone GetChildAtIndex(const StructuredData::ObjectSP &implementor, 274b9c1b51eSKate Stone uint32_t idx) override; 2752c1f46dcSZachary Turner 276b9c1b51eSKate Stone int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 277b9c1b51eSKate Stone const char *child_name) override; 2782c1f46dcSZachary Turner 279b9c1b51eSKate Stone bool UpdateSynthProviderInstance( 280b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2812c1f46dcSZachary Turner 282b9c1b51eSKate Stone bool MightHaveChildrenSynthProviderInstance( 283b9c1b51eSKate Stone const StructuredData::ObjectSP &implementor) override; 2842c1f46dcSZachary Turner 285b9c1b51eSKate Stone lldb::ValueObjectSP 286b9c1b51eSKate Stone GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 287b9c1b51eSKate Stone 288b9c1b51eSKate Stone ConstString 289b9c1b51eSKate Stone GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) override; 2906eec8d6cSEnrico Granata 2912c1f46dcSZachary Turner bool 2924d51a902SRaphael Isemann RunScriptBasedCommand(const char *impl_function, llvm::StringRef args, 2932c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 2942c1f46dcSZachary Turner lldb_private::CommandReturnObject &cmd_retobj, 29597206d57SZachary Turner Status &error, 2962c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 2972c1f46dcSZachary Turner 2984d51a902SRaphael Isemann bool RunScriptBasedCommand( 2994d51a902SRaphael Isemann StructuredData::GenericSP impl_obj_sp, llvm::StringRef args, 3002c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 3014d51a902SRaphael Isemann lldb_private::CommandReturnObject &cmd_retobj, Status &error, 3022c1f46dcSZachary Turner const lldb_private::ExecutionContext &exe_ctx) override; 3032c1f46dcSZachary Turner 30497206d57SZachary Turner Status GenerateFunction(const char *signature, 305b9c1b51eSKate Stone const StringList &input) override; 3062c1f46dcSZachary Turner 30797206d57SZachary Turner Status GenerateBreakpointCommandCallbackData(StringList &input, 308b9c1b51eSKate Stone std::string &output) override; 3092c1f46dcSZachary Turner 310b9c1b51eSKate Stone bool GenerateWatchpointCommandCallbackData(StringList &input, 311b9c1b51eSKate Stone std::string &output) override; 3122c1f46dcSZachary Turner 3132c1f46dcSZachary Turner // static size_t 3142c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 3152c1f46dcSZachary Turner // InputReader &reader, 316b9c1b51eSKate Stone // lldb::InputReaderAction 317b9c1b51eSKate Stone // notification, 3182c1f46dcSZachary Turner // const char *bytes, 3192c1f46dcSZachary Turner // size_t bytes_len); 3202c1f46dcSZachary Turner // 3212c1f46dcSZachary Turner // static size_t 3222c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 3232c1f46dcSZachary Turner // InputReader &reader, 324b9c1b51eSKate Stone // lldb::InputReaderAction 325b9c1b51eSKate Stone // notification, 3262c1f46dcSZachary Turner // const char *bytes, 3272c1f46dcSZachary Turner // size_t bytes_len); 3282c1f46dcSZachary Turner 329b9c1b51eSKate Stone static bool BreakpointCallbackFunction(void *baton, 3302c1f46dcSZachary Turner StoppointCallbackContext *context, 3312c1f46dcSZachary Turner lldb::user_id_t break_id, 3322c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 3332c1f46dcSZachary Turner 334b9c1b51eSKate Stone static bool WatchpointCallbackFunction(void *baton, 3352c1f46dcSZachary Turner StoppointCallbackContext *context, 3362c1f46dcSZachary Turner lldb::user_id_t watch_id); 3372c1f46dcSZachary Turner 338b9c1b51eSKate Stone bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, 339b9c1b51eSKate Stone StructuredData::ObjectSP &callee_wrapper_sp, 340b9c1b51eSKate Stone const TypeSummaryOptions &options, 341b9c1b51eSKate Stone std::string &retval) override; 3422c1f46dcSZachary Turner 343b9c1b51eSKate Stone void Clear() override; 3442c1f46dcSZachary Turner 345b9c1b51eSKate Stone bool GetDocumentationForItem(const char *item, std::string &dest) override; 3462c1f46dcSZachary Turner 347b9c1b51eSKate Stone bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 348b9c1b51eSKate Stone std::string &dest) override; 3492c1f46dcSZachary Turner 3502c1f46dcSZachary Turner uint32_t 3512c1f46dcSZachary Turner GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) override; 3522c1f46dcSZachary Turner 353b9c1b51eSKate Stone bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 354b9c1b51eSKate Stone std::string &dest) override; 3552c1f46dcSZachary Turner 356b9c1b51eSKate Stone bool CheckObjectExists(const char *name) override { 3572c1f46dcSZachary Turner if (!name || !name[0]) 3582c1f46dcSZachary Turner return false; 3592c1f46dcSZachary Turner std::string temp; 3602c1f46dcSZachary Turner return GetDocumentationForItem(name, temp); 3612c1f46dcSZachary Turner } 3622c1f46dcSZachary Turner 363b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Process *process, 36497206d57SZachary Turner std::string &output, Status &error) override; 365b9c1b51eSKate Stone 366b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 36797206d57SZachary Turner std::string &output, Status &error) override; 368b9c1b51eSKate Stone 369b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, Target *target, 37097206d57SZachary Turner std::string &output, Status &error) override; 371b9c1b51eSKate Stone 372b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, 37397206d57SZachary Turner std::string &output, Status &error) override; 374b9c1b51eSKate Stone 375b9c1b51eSKate Stone bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, 37697206d57SZachary Turner std::string &output, Status &error) override; 3772c1f46dcSZachary Turner 3782c1f46dcSZachary Turner bool 379b9c1b51eSKate Stone LoadScriptingModule(const char *filename, bool can_reload, bool init_session, 38097206d57SZachary Turner lldb_private::Status &error, 3812c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 3822c1f46dcSZachary Turner 383b9c1b51eSKate Stone bool IsReservedWord(const char *word) override; 3842c1f46dcSZachary Turner 385b9c1b51eSKate Stone std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock() override; 3862c1f46dcSZachary Turner 387b9c1b51eSKate Stone void CollectDataForBreakpointCommandCallback( 388b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 3892c1f46dcSZachary Turner CommandReturnObject &result) override; 3902c1f46dcSZachary Turner 3912c1f46dcSZachary Turner void 3922c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 3932c1f46dcSZachary Turner CommandReturnObject &result) override; 3942c1f46dcSZachary Turner 3952c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 39697206d57SZachary Turner Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, 3972c1f46dcSZachary Turner const char *callback_body) override; 3982c1f46dcSZachary Turner 399b9c1b51eSKate Stone void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, 4002c1f46dcSZachary Turner const char *function_name) override; 4012c1f46dcSZachary Turner 402f7e07256SJim Ingham /// This one is for deserialization: 40397206d57SZachary Turner Status SetBreakpointCommandCallback( 404f7e07256SJim Ingham BreakpointOptions *bp_options, 405f7e07256SJim Ingham std::unique_ptr<BreakpointOptions::CommandData> &data_up) override; 406f7e07256SJim Ingham 4072c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 408b9c1b51eSKate Stone void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 4092c1f46dcSZachary Turner const char *oneliner) override; 4102c1f46dcSZachary Turner 411b9c1b51eSKate Stone StringList ReadCommandInputFromUser(FILE *in_file); 4122c1f46dcSZachary Turner 4132c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 4142c1f46dcSZachary Turner 415b9c1b51eSKate Stone static void InitializePrivate(); 416ba456807SPavel Labath 417b9c1b51eSKate Stone static void InitializeInterpreter( 418b9c1b51eSKate Stone SWIGInitCallback python_swig_init_callback, 4192c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 4202c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 4212c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 4222c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 4232c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 4242c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 4252c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 4262c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 4272c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue, 4282c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 4292c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 430b9c1b51eSKate Stone SWIGPythonMightHaveChildrenSynthProviderInstance 431b9c1b51eSKate Stone swig_mighthavechildren_provider, 4322c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 4332c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 4342c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 4352c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 4362c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 43741ae8e74SKuba Mracek SWIGPythonCreateFrameRecognizer swig_create_frame_recognizer, 43841ae8e74SKuba Mracek SWIGPythonGetRecognizedArguments swig_get_recognized_arguments, 4392c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 4402c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 4412c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 4422c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 4432c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 4442c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 4452c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 4463815e702SJim Ingham SWIGPythonCallThreadPlan swig_call_thread_plan, 4473815e702SJim Ingham SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script, 4483815e702SJim Ingham SWIGPythonCallBreakpointResolver swig_call_breakpoint_resolver); 4492c1f46dcSZachary Turner 450b9c1b51eSKate Stone const char *GetDictionaryName() { return m_dictionary_name.c_str(); } 4512c1f46dcSZachary Turner 452b9c1b51eSKate Stone PyThreadState *GetThreadState() { return m_command_thread_state; } 4532c1f46dcSZachary Turner 454b9c1b51eSKate Stone void SetThreadState(PyThreadState *s) { 4552c1f46dcSZachary Turner if (s) 4562c1f46dcSZachary Turner m_command_thread_state = s; 4572c1f46dcSZachary Turner } 4582c1f46dcSZachary Turner 4592c1f46dcSZachary Turner //---------------------------------------------------------------------- 4602c1f46dcSZachary Turner // IOHandlerDelegate 4612c1f46dcSZachary Turner //---------------------------------------------------------------------- 462b9c1b51eSKate Stone void IOHandlerActivated(IOHandler &io_handler) override; 4632c1f46dcSZachary Turner 464b9c1b51eSKate Stone void IOHandlerInputComplete(IOHandler &io_handler, 465b9c1b51eSKate Stone std::string &data) override; 4662c1f46dcSZachary Turner 4672c1f46dcSZachary Turner //------------------------------------------------------------------ 4682c1f46dcSZachary Turner // Static Functions 4692c1f46dcSZachary Turner //------------------------------------------------------------------ 470b9c1b51eSKate Stone static void Initialize(); 4712c1f46dcSZachary Turner 472b9c1b51eSKate Stone static void Terminate(); 4732c1f46dcSZachary Turner 4742c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 4752c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 4762c1f46dcSZachary Turner 477b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 4782c1f46dcSZachary Turner 479b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 4802c1f46dcSZachary Turner 4812df331b0SPavel Labath static FileSpec GetPythonDir(); 4822df331b0SPavel Labath 4832c1f46dcSZachary Turner //------------------------------------------------------------------ 4842c1f46dcSZachary Turner // PluginInterface protocol 4852c1f46dcSZachary Turner //------------------------------------------------------------------ 486b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 4872c1f46dcSZachary Turner 488b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 4892c1f46dcSZachary Turner 490b9c1b51eSKate Stone class Locker : public ScriptInterpreterLocker { 4912c1f46dcSZachary Turner public: 492b9c1b51eSKate Stone enum OnEntry { 4932c1f46dcSZachary Turner AcquireLock = 0x0001, 4942c1f46dcSZachary Turner InitSession = 0x0002, 4952c1f46dcSZachary Turner InitGlobals = 0x0004, 4962c1f46dcSZachary Turner NoSTDIN = 0x0008 4972c1f46dcSZachary Turner }; 4982c1f46dcSZachary Turner 499b9c1b51eSKate Stone enum OnLeave { 5002c1f46dcSZachary Turner FreeLock = 0x0001, 501b9c1b51eSKate Stone FreeAcquiredLock = 0x0002, // do not free the lock if we already held it 502b9c1b51eSKate Stone // when calling constructor 5032c1f46dcSZachary Turner TearDownSession = 0x0004 5042c1f46dcSZachary Turner }; 5052c1f46dcSZachary Turner 506edb35d95SEugene Zelenko Locker(ScriptInterpreterPython *py_interpreter = nullptr, 5072c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 508b9c1b51eSKate Stone uint16_t on_leave = FreeLock | TearDownSession, FILE *in = nullptr, 509b9c1b51eSKate Stone FILE *out = nullptr, FILE *err = nullptr); 5102c1f46dcSZachary Turner 511280eb8abSPavel Labath ~Locker() override; 5122c1f46dcSZachary Turner 5132c1f46dcSZachary Turner private: 514b9c1b51eSKate Stone bool DoAcquireLock(); 5152c1f46dcSZachary Turner 516b9c1b51eSKate Stone bool DoInitSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 5172c1f46dcSZachary Turner 518b9c1b51eSKate Stone bool DoFreeLock(); 5192c1f46dcSZachary Turner 520b9c1b51eSKate Stone bool DoTearDownSession(); 5212c1f46dcSZachary Turner 522b9c1b51eSKate Stone static void ReleasePythonLock(); 5232c1f46dcSZachary Turner 5242c1f46dcSZachary Turner bool m_teardown_session; 5252c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 5262c1f46dcSZachary Turner // FILE* m_tmp_fh; 5272c1f46dcSZachary Turner PyGILState_STATE m_GILState; 5282c1f46dcSZachary Turner }; 529edb35d95SEugene Zelenko 5302c1f46dcSZachary Turner protected: 531b9c1b51eSKate Stone class SynchronicityHandler { 532edb35d95SEugene Zelenko private: 533edb35d95SEugene Zelenko lldb::DebuggerSP m_debugger_sp; 534edb35d95SEugene Zelenko ScriptedCommandSynchronicity m_synch_wanted; 535edb35d95SEugene Zelenko bool m_old_asynch; 536edb35d95SEugene Zelenko 537edb35d95SEugene Zelenko public: 538b9c1b51eSKate Stone SynchronicityHandler(lldb::DebuggerSP, ScriptedCommandSynchronicity); 539edb35d95SEugene Zelenko 540edb35d95SEugene Zelenko ~SynchronicityHandler(); 541edb35d95SEugene Zelenko }; 5429c40264fSZachary Turner 543b9c1b51eSKate Stone enum class AddLocation { Beginning, End }; 5442c1f46dcSZachary Turner 5452c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 5462c1f46dcSZachary Turner 5472df331b0SPavel Labath static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path); 5482df331b0SPavel Labath static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path); 5492df331b0SPavel Labath static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path); 5502df331b0SPavel Labath 551b9c1b51eSKate Stone bool EnterSession(uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 552edb35d95SEugene Zelenko 553b9c1b51eSKate Stone void LeaveSession(); 554edb35d95SEugene Zelenko 555b9c1b51eSKate Stone void SaveTerminalState(int fd); 556edb35d95SEugene Zelenko 557b9c1b51eSKate Stone void RestoreTerminalState(); 558edb35d95SEugene Zelenko 559b9c1b51eSKate Stone uint32_t IsExecutingPython() const { return m_lock_count > 0; } 5602c1f46dcSZachary Turner 561b9c1b51eSKate Stone uint32_t IncrementLockCount() { return ++m_lock_count; } 5622c1f46dcSZachary Turner 563b9c1b51eSKate Stone uint32_t DecrementLockCount() { 5642c1f46dcSZachary Turner if (m_lock_count > 0) 5652c1f46dcSZachary Turner --m_lock_count; 5662c1f46dcSZachary Turner return m_lock_count; 5672c1f46dcSZachary Turner } 5682c1f46dcSZachary Turner 5692c1f46dcSZachary Turner enum ActiveIOHandler { 5702c1f46dcSZachary Turner eIOHandlerNone, 5712c1f46dcSZachary Turner eIOHandlerBreakpoint, 5722c1f46dcSZachary Turner eIOHandlerWatchpoint 5732c1f46dcSZachary Turner }; 574f8b22f8fSZachary Turner 575f8b22f8fSZachary Turner PythonObject &GetMainModule(); 5762c1f46dcSZachary Turner 577b9c1b51eSKate Stone PythonDictionary &GetSessionDictionary(); 5782c1f46dcSZachary Turner 579b9c1b51eSKate Stone PythonDictionary &GetSysModuleDictionary(); 5802c1f46dcSZachary Turner 581b9c1b51eSKate Stone bool GetEmbeddedInterpreterModuleObjects(); 5822c1f46dcSZachary Turner 58323502721SJason Molenda bool SetStdHandle(File &file, const char *py_name, PythonFile &save_file, 584b9c1b51eSKate Stone const char *mode); 585a31baf08SGreg Clayton 58623502721SJason Molenda PythonFile m_saved_stdin; 58723502721SJason Molenda PythonFile m_saved_stdout; 58823502721SJason Molenda PythonFile m_saved_stderr; 5892c1f46dcSZachary Turner PythonObject m_main_module; 5902c1f46dcSZachary Turner PythonObject m_lldb_module; 5912c1f46dcSZachary Turner PythonDictionary m_session_dict; 5922c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 5932c1f46dcSZachary Turner PythonObject m_run_one_line_function; 5942c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 5952c1f46dcSZachary Turner std::string m_dictionary_name; 5962c1f46dcSZachary Turner TerminalState m_terminal_state; 5972c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 5982c1f46dcSZachary Turner bool m_session_is_active; 5992c1f46dcSZachary Turner bool m_pty_slave_is_open; 6002c1f46dcSZachary Turner bool m_valid_session; 6012c1f46dcSZachary Turner uint32_t m_lock_count; 6022c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 6032c1f46dcSZachary Turner }; 604edb35d95SEugene Zelenko 6052c1f46dcSZachary Turner } // namespace lldb_private 6062c1f46dcSZachary Turner 607d68983e3SPavel Labath #endif // LLDB_DISABLE_PYTHON 608d68983e3SPavel Labath 609280eb8abSPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 610