ScriptInterpreterPython.h revision 800332c3988c78ea002b64b698f38b58ed95d3ba
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef liblldb_ScriptInterpreterPython_h_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define liblldb_ScriptInterpreterPython_h_ 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LLDB_DISABLE_PYTHON 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Python is disabled in this build 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (__APPLE__) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <Python/Python.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Python.h> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/lldb-private.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Interpreter/ScriptInterpreter.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/Core/InputReader.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/Host/Terminal.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace lldb_private { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScriptInterpreterPython : public ScriptInterpreter 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptInterpreterPython (CommandInterpreter &interpreter); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~ScriptInterpreterPython (); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteOneLine (const char *command, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandReturnObject *result, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_io, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool set_lldb_globals = true); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteInterpreterLoop (); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteOneLineWithReturn (const char *in_string, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScriptInterpreter::ScriptReturnType return_type, 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void *ret_value, 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enable_io, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool set_lldb_globals = true); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteMultipleLines (const char *in_string, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enable_io, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool set_lldb_globals = true); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExportFunctionDefinitionToInterpreter (StringList &function_def); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateTypeScriptFunction (StringList &input, std::string& output, void* name_token = NULL); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateTypeSynthClass (StringList &input, std::string& output, void* name_token = NULL); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateTypeSynthClass (const char* oneliner, std::string& output, void* name_token = NULL); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use this if the function code is just a one-liner script 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateTypeScriptFunction (const char* oneliner, std::string& output, void* name_token = NULL); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateScriptAliasFunction (StringList &input, std::string& output); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::ScriptInterpreterObjectSP 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSyntheticScriptedProvider (std::string class_name, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::ValueObjectSP valobj); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual lldb::ScriptInterpreterObjectSP 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateOSPlugin (std::string class_name, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::ProcessSP process_sp); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual lldb::ScriptInterpreterObjectSP 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OSPlugin_QueryForRegisterInfo (lldb::ScriptInterpreterObjectSP object); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual lldb::ScriptInterpreterObjectSP 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OSPlugin_QueryForThreadsInfo (lldb::ScriptInterpreterObjectSP object); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual lldb::ScriptInterpreterObjectSP 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OSPlugin_QueryForRegisterContextData (lldb::ScriptInterpreterObjectSP object, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::tid_t thread_id); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual uint32_t 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateNumChildren (const lldb::ScriptInterpreterObjectSP& implementor); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual lldb::ValueObjectSP 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChildAtIndex (const lldb::ScriptInterpreterObjectSP& implementor, uint32_t idx); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIndexOfChildWithName (const lldb::ScriptInterpreterObjectSP& implementor, const char* child_name); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MightHaveChildrenSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunScriptBasedCommand(const char* impl_function, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* args, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptedCommandSynchronicity synchronicity, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb_private::CommandReturnObject& cmd_retobj, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Error& error); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFunction(const char *signature, const StringList &input); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateBreakpointCommandCallbackData (StringList &input, std::string& output); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateWatchpointCommandCallbackData (StringList &input, std::string& output); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static size_t 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateBreakpointOptionsCommandCallback (void *baton, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReader &reader, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderAction notification, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *bytes, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_len); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static size_t 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateWatchpointOptionsCommandCallback (void *baton, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReader &reader, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderAction notification, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *bytes, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_len); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BreakpointCallbackFunction (void *baton, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoppointCallbackContext *context, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::user_id_t break_id, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::user_id_t break_loc_id); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatchpointCallbackFunction (void *baton, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StoppointCallbackContext *context, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::user_id_t watch_id); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetScriptedSummary (const char *function_name, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::ValueObjectSP valobj, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::ScriptInterpreterObjectSP& callee_wrapper_sp, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string& retval); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDocumentationForItem (const char* item, std::string& dest); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadScriptingModule (const char* filename, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_reload, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool init_session, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb_private::Error& error); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual lldb::ScriptInterpreterObjectSP 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeScriptObject (void* object); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandReturnObject &result); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandReturnObject &result); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Set a Python one-liner as the callback for the breakpoint. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBreakpointCommandCallback (BreakpointOptions *bp_options, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *oneliner); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Set a one-liner as the callback for the watchpoint. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWatchpointCommandCallback (WatchpointOptions *wp_options, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *oneliner); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringList 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadCommandInputFromUser (FILE *in_file); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetOutputFileHandle (FILE *new_fh); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static lldb::thread_result_t 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunEmbeddedPythonInterpreter (lldb::thread_arg_t baton); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializePrivate (); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeInterpreter (SWIGInitCallback python_swig_init_callback); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterSession (); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LeaveSession (); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveTerminalState (int fd); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestoreTerminalState (); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class SynchronicityHandler 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::DebuggerSP m_debugger_sp; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScriptedCommandSynchronicity m_synch_wanted; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_old_asynch; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynchronicityHandler(lldb::DebuggerSP, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptedCommandSynchronicity); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SynchronicityHandler(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ScriptInterpreterPythonObject : public ScriptInterpreterObject 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptInterpreterPythonObject() : 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScriptInterpreterObject() 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptInterpreterPythonObject(void* obj) : 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScriptInterpreterObject(obj) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_XINCREF(m_object); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScriptInterpreterPythonObject() 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_XDECREF(m_object); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_object = NULL; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN (ScriptInterpreterPythonObject); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Locker 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OnEntry 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AcquireLock = 0x0001, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitSession = 0x0002 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum OnLeave 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeLock = 0x0001, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeAcquiredLock = 0x0002, // do not free the lock if we already held it when calling constructor 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TearDownSession = 0x0004 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Locker (ScriptInterpreterPython *py_interpreter = NULL, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t on_entry = AcquireLock | InitSession, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t on_leave = FreeLock | TearDownSession, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE* wait_msg_handle = NULL); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Locker (); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoAcquireLock (); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoInitSession (); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoFreeLock (); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoTearDownSession (); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleasePythonLock (); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool m_need_session; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptInterpreterPython *m_python_interpreter; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE* m_tmp_fh; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyGILState_STATE m_GILState; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class PythonInputReaderManager 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PythonInputReaderManager (ScriptInterpreterPython *interpreter); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator bool() 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return m_error; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PythonInputReaderManager(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static size_t 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReaderCallback (void *baton, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReader &reader, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderAction notification, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char *bytes, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_len); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static lldb::thread_result_t 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPythonInputReader (lldb::thread_arg_t baton); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScriptInterpreterPython *m_interpreter; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::DebuggerSP m_debugger_sp; 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) lldb::InputReaderSP m_reader_sp; 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool m_error; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static size_t 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReaderCallback (void *baton, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputReader &reader, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderAction notification, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *bytes, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_len); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb_utility::PseudoTerminal m_embedded_thread_pty; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb_utility::PseudoTerminal m_embedded_python_pty; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderSP m_embedded_thread_input_reader_sp; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::InputReaderSP m_embedded_python_input_reader_sp; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE *m_dbg_stdout; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *m_new_sysout; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *m_old_sysout; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *m_old_syserr; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *m_run_one_line; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string m_dictionary_name; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminalState m_terminal_state; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool m_session_is_active; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool m_pty_slave_is_open; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool m_valid_session; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace lldb_private 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // #ifdef LLDB_DISABLE_PYTHON 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // #ifndef liblldb_ScriptInterpreterPython_h_ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)