1*2c1f46dcSZachary Turner //===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// 2*2c1f46dcSZachary Turner // 3*2c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 4*2c1f46dcSZachary Turner // 5*2c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 6*2c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 7*2c1f46dcSZachary Turner // 8*2c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 9*2c1f46dcSZachary Turner 10*2c1f46dcSZachary Turner 11*2c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 12*2c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 13*2c1f46dcSZachary Turner 14*2c1f46dcSZachary Turner #ifdef LLDB_DISABLE_PYTHON 15*2c1f46dcSZachary Turner 16*2c1f46dcSZachary Turner // Python is disabled in this build 17*2c1f46dcSZachary Turner 18*2c1f46dcSZachary Turner #else 19*2c1f46dcSZachary Turner 20*2c1f46dcSZachary Turner #include "lldb/lldb-private.h" 21*2c1f46dcSZachary Turner #include "PythonDataObjects.h" 22*2c1f46dcSZachary Turner #include "lldb/Core/IOHandler.h" 23*2c1f46dcSZachary Turner #include "lldb/Interpreter/ScriptInterpreter.h" 24*2c1f46dcSZachary Turner #include "lldb/Host/Terminal.h" 25*2c1f46dcSZachary Turner 26*2c1f46dcSZachary Turner class IOHandlerPythonInterpreter; 27*2c1f46dcSZachary Turner 28*2c1f46dcSZachary Turner namespace lldb_private { 29*2c1f46dcSZachary Turner 30*2c1f46dcSZachary Turner class ScriptInterpreterPython : 31*2c1f46dcSZachary Turner public ScriptInterpreter, 32*2c1f46dcSZachary Turner public IOHandlerDelegateMultiline 33*2c1f46dcSZachary Turner { 34*2c1f46dcSZachary Turner public: 35*2c1f46dcSZachary Turner typedef void (*SWIGInitCallback) (void); 36*2c1f46dcSZachary Turner 37*2c1f46dcSZachary Turner typedef bool (*SWIGBreakpointCallbackFunction) (const char *python_function_name, 38*2c1f46dcSZachary Turner const char *session_dictionary_name, 39*2c1f46dcSZachary Turner const lldb::StackFrameSP& frame_sp, 40*2c1f46dcSZachary Turner const lldb::BreakpointLocationSP &bp_loc_sp); 41*2c1f46dcSZachary Turner 42*2c1f46dcSZachary Turner typedef bool (*SWIGWatchpointCallbackFunction) (const char *python_function_name, 43*2c1f46dcSZachary Turner const char *session_dictionary_name, 44*2c1f46dcSZachary Turner const lldb::StackFrameSP& frame_sp, 45*2c1f46dcSZachary Turner const lldb::WatchpointSP &wp_sp); 46*2c1f46dcSZachary Turner 47*2c1f46dcSZachary Turner typedef bool (*SWIGPythonTypeScriptCallbackFunction) (const char *python_function_name, 48*2c1f46dcSZachary Turner void *session_dictionary, 49*2c1f46dcSZachary Turner const lldb::ValueObjectSP& valobj_sp, 50*2c1f46dcSZachary Turner void** pyfunct_wrapper, 51*2c1f46dcSZachary Turner const lldb::TypeSummaryOptionsSP& options, 52*2c1f46dcSZachary Turner std::string& retval); 53*2c1f46dcSZachary Turner 54*2c1f46dcSZachary Turner typedef void* (*SWIGPythonCreateSyntheticProvider) (const char *python_class_name, 55*2c1f46dcSZachary Turner const char *session_dictionary_name, 56*2c1f46dcSZachary Turner const lldb::ValueObjectSP& valobj_sp); 57*2c1f46dcSZachary Turner 58*2c1f46dcSZachary Turner typedef void* (*SWIGPythonCreateCommandObject) (const char *python_class_name, 59*2c1f46dcSZachary Turner const char *session_dictionary_name, 60*2c1f46dcSZachary Turner const lldb::DebuggerSP debugger_sp); 61*2c1f46dcSZachary Turner 62*2c1f46dcSZachary Turner typedef void* (*SWIGPythonCreateScriptedThreadPlan) (const char *python_class_name, 63*2c1f46dcSZachary Turner const char *session_dictionary_name, 64*2c1f46dcSZachary Turner const lldb::ThreadPlanSP& thread_plan_sp); 65*2c1f46dcSZachary Turner 66*2c1f46dcSZachary Turner typedef bool (*SWIGPythonCallThreadPlan) (void *implementor, const char *method_name, Event *event_sp, bool &got_error); 67*2c1f46dcSZachary Turner 68*2c1f46dcSZachary Turner typedef void* (*SWIGPythonCreateOSPlugin) (const char *python_class_name, 69*2c1f46dcSZachary Turner const char *session_dictionary_name, 70*2c1f46dcSZachary Turner const lldb::ProcessSP& process_sp); 71*2c1f46dcSZachary Turner 72*2c1f46dcSZachary Turner typedef size_t (*SWIGPythonCalculateNumChildren) (void *implementor); 73*2c1f46dcSZachary Turner typedef void* (*SWIGPythonGetChildAtIndex) (void *implementor, uint32_t idx); 74*2c1f46dcSZachary Turner typedef int (*SWIGPythonGetIndexOfChildWithName) (void *implementor, const char* child_name); 75*2c1f46dcSZachary Turner typedef void* (*SWIGPythonCastPyObjectToSBValue) (void* data); 76*2c1f46dcSZachary Turner typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue) (void* data); 77*2c1f46dcSZachary Turner typedef bool (*SWIGPythonUpdateSynthProviderInstance) (void* data); 78*2c1f46dcSZachary Turner typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance) (void* data); 79*2c1f46dcSZachary Turner typedef void* (*SWIGPythonGetValueSynthProviderInstance) (void *implementor); 80*2c1f46dcSZachary Turner 81*2c1f46dcSZachary Turner typedef bool (*SWIGPythonCallCommand) (const char *python_function_name, 82*2c1f46dcSZachary Turner const char *session_dictionary_name, 83*2c1f46dcSZachary Turner lldb::DebuggerSP& debugger, 84*2c1f46dcSZachary Turner const char* args, 85*2c1f46dcSZachary Turner lldb_private::CommandReturnObject& cmd_retobj, 86*2c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 87*2c1f46dcSZachary Turner 88*2c1f46dcSZachary Turner typedef bool (*SWIGPythonCallCommandObject) (void *implementor, 89*2c1f46dcSZachary Turner lldb::DebuggerSP& debugger, 90*2c1f46dcSZachary Turner const char* args, 91*2c1f46dcSZachary Turner lldb_private::CommandReturnObject& cmd_retobj, 92*2c1f46dcSZachary Turner lldb::ExecutionContextRefSP exe_ctx_ref_sp); 93*2c1f46dcSZachary Turner 94*2c1f46dcSZachary Turner 95*2c1f46dcSZachary Turner typedef bool (*SWIGPythonCallModuleInit) (const char *python_module_name, 96*2c1f46dcSZachary Turner const char *session_dictionary_name, 97*2c1f46dcSZachary Turner lldb::DebuggerSP& debugger); 98*2c1f46dcSZachary Turner 99*2c1f46dcSZachary Turner typedef bool (*SWIGPythonScriptKeyword_Process) (const char* python_function_name, 100*2c1f46dcSZachary Turner const char* session_dictionary_name, 101*2c1f46dcSZachary Turner lldb::ProcessSP& process, 102*2c1f46dcSZachary Turner std::string& output); 103*2c1f46dcSZachary Turner typedef bool (*SWIGPythonScriptKeyword_Thread) (const char* python_function_name, 104*2c1f46dcSZachary Turner const char* session_dictionary_name, 105*2c1f46dcSZachary Turner lldb::ThreadSP& thread, 106*2c1f46dcSZachary Turner std::string& output); 107*2c1f46dcSZachary Turner 108*2c1f46dcSZachary Turner typedef bool (*SWIGPythonScriptKeyword_Target) (const char* python_function_name, 109*2c1f46dcSZachary Turner const char* session_dictionary_name, 110*2c1f46dcSZachary Turner lldb::TargetSP& target, 111*2c1f46dcSZachary Turner std::string& output); 112*2c1f46dcSZachary Turner 113*2c1f46dcSZachary Turner typedef bool (*SWIGPythonScriptKeyword_Frame) (const char* python_function_name, 114*2c1f46dcSZachary Turner const char* session_dictionary_name, 115*2c1f46dcSZachary Turner lldb::StackFrameSP& frame, 116*2c1f46dcSZachary Turner std::string& output); 117*2c1f46dcSZachary Turner 118*2c1f46dcSZachary Turner typedef bool (*SWIGPythonScriptKeyword_Value) (const char* python_function_name, 119*2c1f46dcSZachary Turner const char* session_dictionary_name, 120*2c1f46dcSZachary Turner lldb::ValueObjectSP& value, 121*2c1f46dcSZachary Turner std::string& output); 122*2c1f46dcSZachary Turner 123*2c1f46dcSZachary Turner typedef void* (*SWIGPython_GetDynamicSetting) (void* module, 124*2c1f46dcSZachary Turner const char* setting, 125*2c1f46dcSZachary Turner const lldb::TargetSP& target_sp); 126*2c1f46dcSZachary Turner 127*2c1f46dcSZachary Turner friend class ::IOHandlerPythonInterpreter; 128*2c1f46dcSZachary Turner 129*2c1f46dcSZachary Turner ScriptInterpreterPython (CommandInterpreter &interpreter); 130*2c1f46dcSZachary Turner 131*2c1f46dcSZachary Turner ~ScriptInterpreterPython (); 132*2c1f46dcSZachary Turner 133*2c1f46dcSZachary Turner bool 134*2c1f46dcSZachary Turner Interrupt() override; 135*2c1f46dcSZachary Turner 136*2c1f46dcSZachary Turner bool 137*2c1f46dcSZachary Turner ExecuteOneLine (const char *command, 138*2c1f46dcSZachary Turner CommandReturnObject *result, 139*2c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 140*2c1f46dcSZachary Turner 141*2c1f46dcSZachary Turner void 142*2c1f46dcSZachary Turner ExecuteInterpreterLoop () override; 143*2c1f46dcSZachary Turner 144*2c1f46dcSZachary Turner bool 145*2c1f46dcSZachary Turner ExecuteOneLineWithReturn (const char *in_string, 146*2c1f46dcSZachary Turner ScriptInterpreter::ScriptReturnType return_type, 147*2c1f46dcSZachary Turner void *ret_value, 148*2c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 149*2c1f46dcSZachary Turner 150*2c1f46dcSZachary Turner lldb_private::Error 151*2c1f46dcSZachary Turner ExecuteMultipleLines (const char *in_string, 152*2c1f46dcSZachary Turner const ExecuteScriptOptions &options = ExecuteScriptOptions()) override; 153*2c1f46dcSZachary Turner 154*2c1f46dcSZachary Turner Error 155*2c1f46dcSZachary Turner ExportFunctionDefinitionToInterpreter (StringList &function_def) override; 156*2c1f46dcSZachary Turner 157*2c1f46dcSZachary Turner bool 158*2c1f46dcSZachary Turner GenerateTypeScriptFunction (StringList &input, std::string& output, const void* name_token = NULL) override; 159*2c1f46dcSZachary Turner 160*2c1f46dcSZachary Turner bool 161*2c1f46dcSZachary Turner GenerateTypeSynthClass (StringList &input, std::string& output, const void* name_token = NULL) override; 162*2c1f46dcSZachary Turner 163*2c1f46dcSZachary Turner bool 164*2c1f46dcSZachary Turner GenerateTypeSynthClass (const char* oneliner, std::string& output, const void* name_token = NULL) override; 165*2c1f46dcSZachary Turner 166*2c1f46dcSZachary Turner // use this if the function code is just a one-liner script 167*2c1f46dcSZachary Turner bool 168*2c1f46dcSZachary Turner GenerateTypeScriptFunction (const char* oneliner, std::string& output, const void* name_token = NULL) override; 169*2c1f46dcSZachary Turner 170*2c1f46dcSZachary Turner bool 171*2c1f46dcSZachary Turner GenerateScriptAliasFunction (StringList &input, std::string& output) override; 172*2c1f46dcSZachary Turner 173*2c1f46dcSZachary Turner StructuredData::ObjectSP CreateSyntheticScriptedProvider(const char *class_name, lldb::ValueObjectSP valobj) override; 174*2c1f46dcSZachary Turner 175*2c1f46dcSZachary Turner StructuredData::GenericSP CreateScriptCommandObject (const char *class_name) override; 176*2c1f46dcSZachary Turner 177*2c1f46dcSZachary Turner StructuredData::ObjectSP CreateScriptedThreadPlan(const char *class_name, lldb::ThreadPlanSP thread_plan) override; 178*2c1f46dcSZachary Turner 179*2c1f46dcSZachary Turner bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) override; 180*2c1f46dcSZachary Turner bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) override; 181*2c1f46dcSZachary Turner lldb::StateType ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, bool &script_error) override; 182*2c1f46dcSZachary Turner 183*2c1f46dcSZachary Turner StructuredData::GenericSP OSPlugin_CreatePluginObject(const char *class_name, lldb::ProcessSP process_sp) override; 184*2c1f46dcSZachary Turner 185*2c1f46dcSZachary Turner StructuredData::DictionarySP OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 186*2c1f46dcSZachary Turner 187*2c1f46dcSZachary Turner StructuredData::ArraySP OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) override; 188*2c1f46dcSZachary Turner 189*2c1f46dcSZachary Turner StructuredData::StringSP OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t thread_id) override; 190*2c1f46dcSZachary Turner 191*2c1f46dcSZachary Turner StructuredData::DictionarySP OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t tid, 192*2c1f46dcSZachary Turner lldb::addr_t context) override; 193*2c1f46dcSZachary Turner 194*2c1f46dcSZachary Turner StructuredData::ObjectSP LoadPluginModule(const FileSpec &file_spec, lldb_private::Error &error) override; 195*2c1f46dcSZachary Turner 196*2c1f46dcSZachary Turner StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, const char *setting_name, 197*2c1f46dcSZachary Turner lldb_private::Error &error) override; 198*2c1f46dcSZachary Turner 199*2c1f46dcSZachary Turner size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor) override; 200*2c1f46dcSZachary Turner 201*2c1f46dcSZachary Turner lldb::ValueObjectSP GetChildAtIndex(const StructuredData::ObjectSP &implementor, uint32_t idx) override; 202*2c1f46dcSZachary Turner 203*2c1f46dcSZachary Turner int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, const char *child_name) override; 204*2c1f46dcSZachary Turner 205*2c1f46dcSZachary Turner bool UpdateSynthProviderInstance(const StructuredData::ObjectSP &implementor) override; 206*2c1f46dcSZachary Turner 207*2c1f46dcSZachary Turner bool MightHaveChildrenSynthProviderInstance(const StructuredData::ObjectSP &implementor) override; 208*2c1f46dcSZachary Turner 209*2c1f46dcSZachary Turner lldb::ValueObjectSP GetSyntheticValue(const StructuredData::ObjectSP &implementor) override; 210*2c1f46dcSZachary Turner 211*2c1f46dcSZachary Turner bool 212*2c1f46dcSZachary Turner RunScriptBasedCommand(const char* impl_function, 213*2c1f46dcSZachary Turner const char* args, 214*2c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 215*2c1f46dcSZachary Turner lldb_private::CommandReturnObject& cmd_retobj, 216*2c1f46dcSZachary Turner Error& error, 217*2c1f46dcSZachary Turner const lldb_private::ExecutionContext& exe_ctx) override; 218*2c1f46dcSZachary Turner 219*2c1f46dcSZachary Turner bool 220*2c1f46dcSZachary Turner RunScriptBasedCommand (StructuredData::GenericSP impl_obj_sp, 221*2c1f46dcSZachary Turner const char* args, 222*2c1f46dcSZachary Turner ScriptedCommandSynchronicity synchronicity, 223*2c1f46dcSZachary Turner lldb_private::CommandReturnObject& cmd_retobj, 224*2c1f46dcSZachary Turner Error& error, 225*2c1f46dcSZachary Turner const lldb_private::ExecutionContext& exe_ctx) override; 226*2c1f46dcSZachary Turner 227*2c1f46dcSZachary Turner Error 228*2c1f46dcSZachary Turner GenerateFunction(const char *signature, const StringList &input) override; 229*2c1f46dcSZachary Turner 230*2c1f46dcSZachary Turner Error 231*2c1f46dcSZachary Turner GenerateBreakpointCommandCallbackData (StringList &input, std::string& output) override; 232*2c1f46dcSZachary Turner 233*2c1f46dcSZachary Turner bool 234*2c1f46dcSZachary Turner GenerateWatchpointCommandCallbackData (StringList &input, std::string& output) override; 235*2c1f46dcSZachary Turner 236*2c1f46dcSZachary Turner // static size_t 237*2c1f46dcSZachary Turner // GenerateBreakpointOptionsCommandCallback (void *baton, 238*2c1f46dcSZachary Turner // InputReader &reader, 239*2c1f46dcSZachary Turner // lldb::InputReaderAction notification, 240*2c1f46dcSZachary Turner // const char *bytes, 241*2c1f46dcSZachary Turner // size_t bytes_len); 242*2c1f46dcSZachary Turner // 243*2c1f46dcSZachary Turner // static size_t 244*2c1f46dcSZachary Turner // GenerateWatchpointOptionsCommandCallback (void *baton, 245*2c1f46dcSZachary Turner // InputReader &reader, 246*2c1f46dcSZachary Turner // lldb::InputReaderAction notification, 247*2c1f46dcSZachary Turner // const char *bytes, 248*2c1f46dcSZachary Turner // size_t bytes_len); 249*2c1f46dcSZachary Turner 250*2c1f46dcSZachary Turner static bool 251*2c1f46dcSZachary Turner BreakpointCallbackFunction (void *baton, 252*2c1f46dcSZachary Turner StoppointCallbackContext *context, 253*2c1f46dcSZachary Turner lldb::user_id_t break_id, 254*2c1f46dcSZachary Turner lldb::user_id_t break_loc_id); 255*2c1f46dcSZachary Turner 256*2c1f46dcSZachary Turner static bool 257*2c1f46dcSZachary Turner WatchpointCallbackFunction (void *baton, 258*2c1f46dcSZachary Turner StoppointCallbackContext *context, 259*2c1f46dcSZachary Turner lldb::user_id_t watch_id); 260*2c1f46dcSZachary Turner 261*2c1f46dcSZachary Turner bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, StructuredData::ObjectSP &callee_wrapper_sp, 262*2c1f46dcSZachary Turner const TypeSummaryOptions &options, std::string &retval) override; 263*2c1f46dcSZachary Turner 264*2c1f46dcSZachary Turner void 265*2c1f46dcSZachary Turner Clear () override; 266*2c1f46dcSZachary Turner 267*2c1f46dcSZachary Turner bool 268*2c1f46dcSZachary Turner GetDocumentationForItem (const char* item, std::string& dest) override; 269*2c1f46dcSZachary Turner 270*2c1f46dcSZachary Turner bool 271*2c1f46dcSZachary Turner GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string& dest) override; 272*2c1f46dcSZachary Turner 273*2c1f46dcSZachary Turner uint32_t 274*2c1f46dcSZachary Turner GetFlagsForCommandObject (StructuredData::GenericSP cmd_obj_sp) override; 275*2c1f46dcSZachary Turner 276*2c1f46dcSZachary Turner bool 277*2c1f46dcSZachary Turner GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string& dest) override; 278*2c1f46dcSZachary Turner 279*2c1f46dcSZachary Turner bool 280*2c1f46dcSZachary Turner CheckObjectExists (const char* name) override 281*2c1f46dcSZachary Turner { 282*2c1f46dcSZachary Turner if (!name || !name[0]) 283*2c1f46dcSZachary Turner return false; 284*2c1f46dcSZachary Turner std::string temp; 285*2c1f46dcSZachary Turner return GetDocumentationForItem (name,temp); 286*2c1f46dcSZachary Turner } 287*2c1f46dcSZachary Turner 288*2c1f46dcSZachary Turner bool 289*2c1f46dcSZachary Turner RunScriptFormatKeyword (const char* impl_function, 290*2c1f46dcSZachary Turner Process* process, 291*2c1f46dcSZachary Turner std::string& output, 292*2c1f46dcSZachary Turner Error& error) override; 293*2c1f46dcSZachary Turner 294*2c1f46dcSZachary Turner bool 295*2c1f46dcSZachary Turner RunScriptFormatKeyword (const char* impl_function, 296*2c1f46dcSZachary Turner Thread* thread, 297*2c1f46dcSZachary Turner std::string& output, 298*2c1f46dcSZachary Turner Error& error) override; 299*2c1f46dcSZachary Turner 300*2c1f46dcSZachary Turner bool 301*2c1f46dcSZachary Turner RunScriptFormatKeyword (const char* impl_function, 302*2c1f46dcSZachary Turner Target* target, 303*2c1f46dcSZachary Turner std::string& output, 304*2c1f46dcSZachary Turner Error& error) override; 305*2c1f46dcSZachary Turner 306*2c1f46dcSZachary Turner bool 307*2c1f46dcSZachary Turner RunScriptFormatKeyword (const char* impl_function, 308*2c1f46dcSZachary Turner StackFrame* frame, 309*2c1f46dcSZachary Turner std::string& output, 310*2c1f46dcSZachary Turner Error& error) override; 311*2c1f46dcSZachary Turner 312*2c1f46dcSZachary Turner bool 313*2c1f46dcSZachary Turner RunScriptFormatKeyword (const char* impl_function, 314*2c1f46dcSZachary Turner ValueObject* value, 315*2c1f46dcSZachary Turner std::string& output, 316*2c1f46dcSZachary Turner Error& error) override; 317*2c1f46dcSZachary Turner 318*2c1f46dcSZachary Turner bool LoadScriptingModule(const char *filename, bool can_reload, bool init_session, lldb_private::Error &error, 319*2c1f46dcSZachary Turner StructuredData::ObjectSP *module_sp = nullptr) override; 320*2c1f46dcSZachary Turner 321*2c1f46dcSZachary Turner bool 322*2c1f46dcSZachary Turner IsReservedWord (const char* word) override; 323*2c1f46dcSZachary Turner 324*2c1f46dcSZachary Turner std::unique_ptr<ScriptInterpreterLocker> 325*2c1f46dcSZachary Turner AcquireInterpreterLock () override; 326*2c1f46dcSZachary Turner 327*2c1f46dcSZachary Turner void 328*2c1f46dcSZachary Turner CollectDataForBreakpointCommandCallback (std::vector<BreakpointOptions *> &bp_options_vec, 329*2c1f46dcSZachary Turner CommandReturnObject &result) override; 330*2c1f46dcSZachary Turner 331*2c1f46dcSZachary Turner void 332*2c1f46dcSZachary Turner CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options, 333*2c1f46dcSZachary Turner CommandReturnObject &result) override; 334*2c1f46dcSZachary Turner 335*2c1f46dcSZachary Turner /// Set the callback body text into the callback for the breakpoint. 336*2c1f46dcSZachary Turner Error 337*2c1f46dcSZachary Turner SetBreakpointCommandCallback (BreakpointOptions *bp_options, 338*2c1f46dcSZachary Turner const char *callback_body) override; 339*2c1f46dcSZachary Turner 340*2c1f46dcSZachary Turner void 341*2c1f46dcSZachary Turner SetBreakpointCommandCallbackFunction (BreakpointOptions *bp_options, 342*2c1f46dcSZachary Turner const char *function_name) override; 343*2c1f46dcSZachary Turner 344*2c1f46dcSZachary Turner /// Set a one-liner as the callback for the watchpoint. 345*2c1f46dcSZachary Turner void 346*2c1f46dcSZachary Turner SetWatchpointCommandCallback (WatchpointOptions *wp_options, 347*2c1f46dcSZachary Turner const char *oneliner) override; 348*2c1f46dcSZachary Turner 349*2c1f46dcSZachary Turner StringList 350*2c1f46dcSZachary Turner ReadCommandInputFromUser (FILE *in_file); 351*2c1f46dcSZachary Turner 352*2c1f46dcSZachary Turner void ResetOutputFileHandle(FILE *new_fh) override; 353*2c1f46dcSZachary Turner 354*2c1f46dcSZachary Turner static void 355*2c1f46dcSZachary Turner InitializePrivate (); 356*2c1f46dcSZachary Turner 357*2c1f46dcSZachary Turner static void 358*2c1f46dcSZachary Turner InitializeInterpreter (SWIGInitCallback python_swig_init_callback, 359*2c1f46dcSZachary Turner SWIGBreakpointCallbackFunction swig_breakpoint_callback, 360*2c1f46dcSZachary Turner SWIGWatchpointCallbackFunction swig_watchpoint_callback, 361*2c1f46dcSZachary Turner SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 362*2c1f46dcSZachary Turner SWIGPythonCreateSyntheticProvider swig_synthetic_script, 363*2c1f46dcSZachary Turner SWIGPythonCreateCommandObject swig_create_cmd, 364*2c1f46dcSZachary Turner SWIGPythonCalculateNumChildren swig_calc_children, 365*2c1f46dcSZachary Turner SWIGPythonGetChildAtIndex swig_get_child_index, 366*2c1f46dcSZachary Turner SWIGPythonGetIndexOfChildWithName swig_get_index_child, 367*2c1f46dcSZachary Turner SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue , 368*2c1f46dcSZachary Turner SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 369*2c1f46dcSZachary Turner SWIGPythonUpdateSynthProviderInstance swig_update_provider, 370*2c1f46dcSZachary Turner SWIGPythonMightHaveChildrenSynthProviderInstance swig_mighthavechildren_provider, 371*2c1f46dcSZachary Turner SWIGPythonGetValueSynthProviderInstance swig_getvalue_provider, 372*2c1f46dcSZachary Turner SWIGPythonCallCommand swig_call_command, 373*2c1f46dcSZachary Turner SWIGPythonCallCommandObject swig_call_command_object, 374*2c1f46dcSZachary Turner SWIGPythonCallModuleInit swig_call_module_init, 375*2c1f46dcSZachary Turner SWIGPythonCreateOSPlugin swig_create_os_plugin, 376*2c1f46dcSZachary Turner SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 377*2c1f46dcSZachary Turner SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 378*2c1f46dcSZachary Turner SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 379*2c1f46dcSZachary Turner SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 380*2c1f46dcSZachary Turner SWIGPythonScriptKeyword_Value swig_run_script_keyword_value, 381*2c1f46dcSZachary Turner SWIGPython_GetDynamicSetting swig_plugin_get, 382*2c1f46dcSZachary Turner SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, 383*2c1f46dcSZachary Turner SWIGPythonCallThreadPlan swig_call_thread_plan); 384*2c1f46dcSZachary Turner 385*2c1f46dcSZachary Turner const char * 386*2c1f46dcSZachary Turner GetDictionaryName () 387*2c1f46dcSZachary Turner { 388*2c1f46dcSZachary Turner return m_dictionary_name.c_str(); 389*2c1f46dcSZachary Turner } 390*2c1f46dcSZachary Turner 391*2c1f46dcSZachary Turner 392*2c1f46dcSZachary Turner PyThreadState * 393*2c1f46dcSZachary Turner GetThreadState() 394*2c1f46dcSZachary Turner { 395*2c1f46dcSZachary Turner return m_command_thread_state; 396*2c1f46dcSZachary Turner } 397*2c1f46dcSZachary Turner 398*2c1f46dcSZachary Turner void 399*2c1f46dcSZachary Turner SetThreadState (PyThreadState *s) 400*2c1f46dcSZachary Turner { 401*2c1f46dcSZachary Turner if (s) 402*2c1f46dcSZachary Turner m_command_thread_state = s; 403*2c1f46dcSZachary Turner } 404*2c1f46dcSZachary Turner 405*2c1f46dcSZachary Turner //---------------------------------------------------------------------- 406*2c1f46dcSZachary Turner // IOHandlerDelegate 407*2c1f46dcSZachary Turner //---------------------------------------------------------------------- 408*2c1f46dcSZachary Turner void 409*2c1f46dcSZachary Turner IOHandlerActivated (IOHandler &io_handler) override; 410*2c1f46dcSZachary Turner 411*2c1f46dcSZachary Turner void 412*2c1f46dcSZachary Turner IOHandlerInputComplete (IOHandler &io_handler, std::string &data) override; 413*2c1f46dcSZachary Turner 414*2c1f46dcSZachary Turner 415*2c1f46dcSZachary Turner //------------------------------------------------------------------ 416*2c1f46dcSZachary Turner // Static Functions 417*2c1f46dcSZachary Turner //------------------------------------------------------------------ 418*2c1f46dcSZachary Turner static void 419*2c1f46dcSZachary Turner Initialize(); 420*2c1f46dcSZachary Turner 421*2c1f46dcSZachary Turner static void 422*2c1f46dcSZachary Turner Terminate(); 423*2c1f46dcSZachary Turner 424*2c1f46dcSZachary Turner static lldb::ScriptInterpreterSP 425*2c1f46dcSZachary Turner CreateInstance(CommandInterpreter &interpreter); 426*2c1f46dcSZachary Turner 427*2c1f46dcSZachary Turner static lldb_private::ConstString 428*2c1f46dcSZachary Turner GetPluginNameStatic(); 429*2c1f46dcSZachary Turner 430*2c1f46dcSZachary Turner static const char * 431*2c1f46dcSZachary Turner GetPluginDescriptionStatic(); 432*2c1f46dcSZachary Turner 433*2c1f46dcSZachary Turner //------------------------------------------------------------------ 434*2c1f46dcSZachary Turner // PluginInterface protocol 435*2c1f46dcSZachary Turner //------------------------------------------------------------------ 436*2c1f46dcSZachary Turner virtual lldb_private::ConstString 437*2c1f46dcSZachary Turner GetPluginName(); 438*2c1f46dcSZachary Turner 439*2c1f46dcSZachary Turner virtual uint32_t 440*2c1f46dcSZachary Turner GetPluginVersion(); 441*2c1f46dcSZachary Turner 442*2c1f46dcSZachary Turner protected: 443*2c1f46dcSZachary Turner 444*2c1f46dcSZachary Turner bool 445*2c1f46dcSZachary Turner EnterSession (uint16_t on_entry_flags, 446*2c1f46dcSZachary Turner FILE *in, 447*2c1f46dcSZachary Turner FILE *out, 448*2c1f46dcSZachary Turner FILE *err); 449*2c1f46dcSZachary Turner 450*2c1f46dcSZachary Turner void 451*2c1f46dcSZachary Turner LeaveSession (); 452*2c1f46dcSZachary Turner 453*2c1f46dcSZachary Turner void 454*2c1f46dcSZachary Turner SaveTerminalState (int fd); 455*2c1f46dcSZachary Turner 456*2c1f46dcSZachary Turner void 457*2c1f46dcSZachary Turner RestoreTerminalState (); 458*2c1f46dcSZachary Turner 459*2c1f46dcSZachary Turner class SynchronicityHandler 460*2c1f46dcSZachary Turner { 461*2c1f46dcSZachary Turner private: 462*2c1f46dcSZachary Turner lldb::DebuggerSP m_debugger_sp; 463*2c1f46dcSZachary Turner ScriptedCommandSynchronicity m_synch_wanted; 464*2c1f46dcSZachary Turner bool m_old_asynch; 465*2c1f46dcSZachary Turner public: 466*2c1f46dcSZachary Turner SynchronicityHandler(lldb::DebuggerSP, 467*2c1f46dcSZachary Turner ScriptedCommandSynchronicity); 468*2c1f46dcSZachary Turner ~SynchronicityHandler(); 469*2c1f46dcSZachary Turner }; 470*2c1f46dcSZachary Turner 471*2c1f46dcSZachary Turner public: 472*2c1f46dcSZachary Turner class Locker : public ScriptInterpreterLocker 473*2c1f46dcSZachary Turner { 474*2c1f46dcSZachary Turner public: 475*2c1f46dcSZachary Turner 476*2c1f46dcSZachary Turner enum OnEntry 477*2c1f46dcSZachary Turner { 478*2c1f46dcSZachary Turner AcquireLock = 0x0001, 479*2c1f46dcSZachary Turner InitSession = 0x0002, 480*2c1f46dcSZachary Turner InitGlobals = 0x0004, 481*2c1f46dcSZachary Turner NoSTDIN = 0x0008 482*2c1f46dcSZachary Turner }; 483*2c1f46dcSZachary Turner 484*2c1f46dcSZachary Turner enum OnLeave 485*2c1f46dcSZachary Turner { 486*2c1f46dcSZachary Turner FreeLock = 0x0001, 487*2c1f46dcSZachary Turner FreeAcquiredLock = 0x0002, // do not free the lock if we already held it when calling constructor 488*2c1f46dcSZachary Turner TearDownSession = 0x0004 489*2c1f46dcSZachary Turner }; 490*2c1f46dcSZachary Turner 491*2c1f46dcSZachary Turner Locker (ScriptInterpreterPython *py_interpreter = NULL, 492*2c1f46dcSZachary Turner uint16_t on_entry = AcquireLock | InitSession, 493*2c1f46dcSZachary Turner uint16_t on_leave = FreeLock | TearDownSession, 494*2c1f46dcSZachary Turner FILE *in = NULL, 495*2c1f46dcSZachary Turner FILE *out = NULL, 496*2c1f46dcSZachary Turner FILE *err = NULL); 497*2c1f46dcSZachary Turner 498*2c1f46dcSZachary Turner ~Locker (); 499*2c1f46dcSZachary Turner 500*2c1f46dcSZachary Turner private: 501*2c1f46dcSZachary Turner 502*2c1f46dcSZachary Turner bool 503*2c1f46dcSZachary Turner DoAcquireLock (); 504*2c1f46dcSZachary Turner 505*2c1f46dcSZachary Turner bool 506*2c1f46dcSZachary Turner DoInitSession (uint16_t on_entry_flags, FILE *in, FILE *out, FILE *err); 507*2c1f46dcSZachary Turner 508*2c1f46dcSZachary Turner bool 509*2c1f46dcSZachary Turner DoFreeLock (); 510*2c1f46dcSZachary Turner 511*2c1f46dcSZachary Turner bool 512*2c1f46dcSZachary Turner DoTearDownSession (); 513*2c1f46dcSZachary Turner 514*2c1f46dcSZachary Turner static void 515*2c1f46dcSZachary Turner ReleasePythonLock (); 516*2c1f46dcSZachary Turner 517*2c1f46dcSZachary Turner bool m_teardown_session; 518*2c1f46dcSZachary Turner ScriptInterpreterPython *m_python_interpreter; 519*2c1f46dcSZachary Turner // FILE* m_tmp_fh; 520*2c1f46dcSZachary Turner PyGILState_STATE m_GILState; 521*2c1f46dcSZachary Turner }; 522*2c1f46dcSZachary Turner protected: 523*2c1f46dcSZachary Turner enum class AddLocation 524*2c1f46dcSZachary Turner { 525*2c1f46dcSZachary Turner Beginning, 526*2c1f46dcSZachary Turner End 527*2c1f46dcSZachary Turner }; 528*2c1f46dcSZachary Turner 529*2c1f46dcSZachary Turner static void AddToSysPath(AddLocation location, std::string path); 530*2c1f46dcSZachary Turner 531*2c1f46dcSZachary Turner uint32_t 532*2c1f46dcSZachary Turner IsExecutingPython () const 533*2c1f46dcSZachary Turner { 534*2c1f46dcSZachary Turner return m_lock_count > 0; 535*2c1f46dcSZachary Turner } 536*2c1f46dcSZachary Turner 537*2c1f46dcSZachary Turner uint32_t 538*2c1f46dcSZachary Turner IncrementLockCount() 539*2c1f46dcSZachary Turner { 540*2c1f46dcSZachary Turner return ++m_lock_count; 541*2c1f46dcSZachary Turner } 542*2c1f46dcSZachary Turner 543*2c1f46dcSZachary Turner uint32_t 544*2c1f46dcSZachary Turner DecrementLockCount() 545*2c1f46dcSZachary Turner { 546*2c1f46dcSZachary Turner if (m_lock_count > 0) 547*2c1f46dcSZachary Turner --m_lock_count; 548*2c1f46dcSZachary Turner return m_lock_count; 549*2c1f46dcSZachary Turner } 550*2c1f46dcSZachary Turner 551*2c1f46dcSZachary Turner enum ActiveIOHandler { 552*2c1f46dcSZachary Turner eIOHandlerNone, 553*2c1f46dcSZachary Turner eIOHandlerBreakpoint, 554*2c1f46dcSZachary Turner eIOHandlerWatchpoint 555*2c1f46dcSZachary Turner }; 556*2c1f46dcSZachary Turner PythonObject & 557*2c1f46dcSZachary Turner GetMainModule (); 558*2c1f46dcSZachary Turner 559*2c1f46dcSZachary Turner PythonDictionary & 560*2c1f46dcSZachary Turner GetSessionDictionary (); 561*2c1f46dcSZachary Turner 562*2c1f46dcSZachary Turner PythonDictionary & 563*2c1f46dcSZachary Turner GetSysModuleDictionary (); 564*2c1f46dcSZachary Turner 565*2c1f46dcSZachary Turner bool 566*2c1f46dcSZachary Turner GetEmbeddedInterpreterModuleObjects (); 567*2c1f46dcSZachary Turner 568*2c1f46dcSZachary Turner PythonObject m_saved_stdin; 569*2c1f46dcSZachary Turner PythonObject m_saved_stdout; 570*2c1f46dcSZachary Turner PythonObject m_saved_stderr; 571*2c1f46dcSZachary Turner PythonObject m_main_module; 572*2c1f46dcSZachary Turner PythonObject m_lldb_module; 573*2c1f46dcSZachary Turner PythonDictionary m_session_dict; 574*2c1f46dcSZachary Turner PythonDictionary m_sys_module_dict; 575*2c1f46dcSZachary Turner PythonObject m_run_one_line_function; 576*2c1f46dcSZachary Turner PythonObject m_run_one_line_str_global; 577*2c1f46dcSZachary Turner std::string m_dictionary_name; 578*2c1f46dcSZachary Turner TerminalState m_terminal_state; 579*2c1f46dcSZachary Turner ActiveIOHandler m_active_io_handler; 580*2c1f46dcSZachary Turner bool m_session_is_active; 581*2c1f46dcSZachary Turner bool m_pty_slave_is_open; 582*2c1f46dcSZachary Turner bool m_valid_session; 583*2c1f46dcSZachary Turner uint32_t m_lock_count; 584*2c1f46dcSZachary Turner PyThreadState *m_command_thread_state; 585*2c1f46dcSZachary Turner }; 586*2c1f46dcSZachary Turner } // namespace lldb_private 587*2c1f46dcSZachary Turner 588*2c1f46dcSZachary Turner #endif // #ifdef LLDB_DISABLE_PYTHON 589*2c1f46dcSZachary Turner 590*2c1f46dcSZachary Turner #endif // #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H 591