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)