ScriptInterpreterPython.h revision fd670c24e72a1425434020483689c3cb17f0d975
1ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//===-- ScriptInterpreterPython.h -------------------------------*- C++ -*-===//
2ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//
3ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//                     The LLVM Compiler Infrastructure
4ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//
5ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik// This file is distributed under the University of Illinois Open Source
6ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik// License. See LICENSE.TXT for details.
7ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//
8ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik//===----------------------------------------------------------------------===//
9ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
10ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
11ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef liblldb_ScriptInterpreterPython_h_
12ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#define liblldb_ScriptInterpreterPython_h_
13ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
14ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifdef LLDB_DISABLE_PYTHON
15ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
16ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik// Python is disabled in this build
17ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
18ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#else
19ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
20ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#if defined (__APPLE__)
21ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <Python/Python.h>
22ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#else
23ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <Python.h>
24ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
25ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
26ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include "lldb/lldb-private.h"
27ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include "lldb/Interpreter/ScriptInterpreter.h"
28ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include "lldb/Core/InputReader.h"
29ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include "lldb/Host/Terminal.h"
30ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
31ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craiknamespace lldb_private {
32ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
33ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikclass ScriptInterpreterPython : public ScriptInterpreter
34ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
35ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikpublic:
36ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
37ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ScriptInterpreterPython (CommandInterpreter &interpreter);
38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
39ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ~ScriptInterpreterPython ();
40ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
41ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    bool
42ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ExecuteOneLine (const char *command,
43ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                    CommandReturnObject *result,
44ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                    const ExecuteScriptOptions &options = ExecuteScriptOptions());
45ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
46ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    void
47ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ExecuteInterpreterLoop ();
48ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
49ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    bool
50ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ExecuteOneLineWithReturn (const char *in_string,
51ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                              ScriptInterpreter::ScriptReturnType return_type,
52ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                              void *ret_value,
53ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                              const ExecuteScriptOptions &options = ExecuteScriptOptions());
54ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
55ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    bool
56ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    ExecuteMultipleLines (const char *in_string,
57ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik                          const ExecuteScriptOptions &options = ExecuteScriptOptions());
58
59    bool
60    ExportFunctionDefinitionToInterpreter (StringList &function_def);
61
62    bool
63    GenerateTypeScriptFunction (StringList &input, std::string& output, void* name_token = NULL);
64
65    bool
66    GenerateTypeSynthClass (StringList &input, std::string& output, void* name_token = NULL);
67
68    bool
69    GenerateTypeSynthClass (const char* oneliner, std::string& output, void* name_token = NULL);
70
71    // use this if the function code is just a one-liner script
72    bool
73    GenerateTypeScriptFunction (const char* oneliner, std::string& output, void* name_token = NULL);
74
75    virtual bool
76    GenerateScriptAliasFunction (StringList &input, std::string& output);
77
78    lldb::ScriptInterpreterObjectSP
79    CreateSyntheticScriptedProvider (std::string class_name,
80                                     lldb::ValueObjectSP valobj);
81
82    virtual lldb::ScriptInterpreterObjectSP
83    CreateOSPlugin (std::string class_name,
84                    lldb::ProcessSP process_sp);
85
86    virtual lldb::ScriptInterpreterObjectSP
87    OSPlugin_QueryForRegisterInfo (lldb::ScriptInterpreterObjectSP object);
88
89    virtual lldb::ScriptInterpreterObjectSP
90    OSPlugin_QueryForThreadsInfo (lldb::ScriptInterpreterObjectSP object);
91
92    virtual lldb::ScriptInterpreterObjectSP
93    OSPlugin_QueryForRegisterContextData (lldb::ScriptInterpreterObjectSP object,
94                                          lldb::tid_t thread_id);
95
96    virtual uint32_t
97    CalculateNumChildren (const lldb::ScriptInterpreterObjectSP& implementor);
98
99    virtual lldb::ValueObjectSP
100    GetChildAtIndex (const lldb::ScriptInterpreterObjectSP& implementor, uint32_t idx);
101
102    virtual int
103    GetIndexOfChildWithName (const lldb::ScriptInterpreterObjectSP& implementor, const char* child_name);
104
105    virtual bool
106    UpdateSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor);
107
108    virtual bool
109    MightHaveChildrenSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor);
110
111    virtual bool
112    RunScriptBasedCommand(const char* impl_function,
113                          const char* args,
114                          ScriptedCommandSynchronicity synchronicity,
115                          lldb_private::CommandReturnObject& cmd_retobj,
116                          Error& error);
117
118    bool
119    GenerateFunction(const char *signature, const StringList &input);
120
121    bool
122    GenerateBreakpointCommandCallbackData (StringList &input, std::string& output);
123
124    bool
125    GenerateWatchpointCommandCallbackData (StringList &input, std::string& output);
126
127    static size_t
128    GenerateBreakpointOptionsCommandCallback (void *baton,
129                                              InputReader &reader,
130                                              lldb::InputReaderAction notification,
131                                              const char *bytes,
132                                              size_t bytes_len);
133
134    static size_t
135    GenerateWatchpointOptionsCommandCallback (void *baton,
136                                              InputReader &reader,
137                                              lldb::InputReaderAction notification,
138                                              const char *bytes,
139                                              size_t bytes_len);
140
141    static bool
142    BreakpointCallbackFunction (void *baton,
143                                StoppointCallbackContext *context,
144                                lldb::user_id_t break_id,
145                                lldb::user_id_t break_loc_id);
146
147    static bool
148    WatchpointCallbackFunction (void *baton,
149                                StoppointCallbackContext *context,
150                                lldb::user_id_t watch_id);
151
152    virtual bool
153    GetScriptedSummary (const char *function_name,
154                        lldb::ValueObjectSP valobj,
155                        lldb::ScriptInterpreterObjectSP& callee_wrapper_sp,
156                        std::string& retval);
157
158    virtual bool
159    GetDocumentationForItem (const char* item, std::string& dest);
160
161    virtual bool
162    LoadScriptingModule (const char* filename,
163                         bool can_reload,
164                         bool init_session,
165                         lldb_private::Error& error);
166
167    virtual lldb::ScriptInterpreterObjectSP
168    MakeScriptObject (void* object);
169
170    void
171    CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options,
172                                             CommandReturnObject &result);
173
174    void
175    CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options,
176                                             CommandReturnObject &result);
177
178    /// Set a Python one-liner as the callback for the breakpoint.
179    void
180    SetBreakpointCommandCallback (BreakpointOptions *bp_options,
181                                  const char *oneliner);
182
183    /// Set a one-liner as the callback for the watchpoint.
184    void
185    SetWatchpointCommandCallback (WatchpointOptions *wp_options,
186                                  const char *oneliner);
187
188    StringList
189    ReadCommandInputFromUser (FILE *in_file);
190
191    virtual void
192    ResetOutputFileHandle (FILE *new_fh);
193
194    static lldb::thread_result_t
195    RunEmbeddedPythonInterpreter (lldb::thread_arg_t baton);
196
197    static void
198    InitializePrivate ();
199
200    static void
201    InitializeInterpreter (SWIGInitCallback python_swig_init_callback);
202
203protected:
204
205    void
206    EnterSession ();
207
208    void
209    LeaveSession ();
210
211    void
212    SaveTerminalState (int fd);
213
214    void
215    RestoreTerminalState ();
216
217private:
218
219    class SynchronicityHandler
220    {
221    private:
222        lldb::DebuggerSP             m_debugger_sp;
223        ScriptedCommandSynchronicity m_synch_wanted;
224        bool                         m_old_asynch;
225    public:
226        SynchronicityHandler(lldb::DebuggerSP,
227                             ScriptedCommandSynchronicity);
228        ~SynchronicityHandler();
229    };
230
231    class ScriptInterpreterPythonObject : public ScriptInterpreterObject
232    {
233    public:
234        ScriptInterpreterPythonObject() :
235        ScriptInterpreterObject()
236        {}
237
238        ScriptInterpreterPythonObject(void* obj) :
239        ScriptInterpreterObject(obj)
240        {
241            Py_XINCREF(m_object);
242        }
243
244        virtual
245        ~ScriptInterpreterPythonObject()
246        {
247            Py_XDECREF(m_object);
248            m_object = NULL;
249        }
250        private:
251            DISALLOW_COPY_AND_ASSIGN (ScriptInterpreterPythonObject);
252    };
253
254	class Locker
255	{
256	public:
257
258        enum OnEntry
259        {
260            AcquireLock         = 0x0001,
261            InitSession         = 0x0002
262        };
263
264        enum OnLeave
265        {
266            FreeLock            = 0x0001,
267            FreeAcquiredLock    = 0x0002,    // do not free the lock if we already held it when calling constructor
268            TearDownSession     = 0x0004
269        };
270
271        Locker (ScriptInterpreterPython *py_interpreter = NULL,
272                uint16_t on_entry = AcquireLock | InitSession,
273                uint16_t on_leave = FreeLock | TearDownSession,
274                FILE* wait_msg_handle = NULL);
275
276    	~Locker ();
277
278	private:
279
280        bool
281        DoAcquireLock ();
282
283        bool
284        DoInitSession ();
285
286        bool
287        DoFreeLock ();
288
289        bool
290        DoTearDownSession ();
291
292        static void
293        ReleasePythonLock ();
294
295    	bool                     m_need_session;
296    	ScriptInterpreterPython *m_python_interpreter;
297    	FILE*                    m_tmp_fh;
298        PyGILState_STATE         m_GILState;
299	};
300
301    class PythonInputReaderManager
302    {
303    public:
304        PythonInputReaderManager (ScriptInterpreterPython *interpreter);
305
306        operator bool()
307        {
308            return m_error;
309        }
310
311        ~PythonInputReaderManager();
312
313    private:
314
315        static size_t
316        InputReaderCallback (void *baton,
317                                           InputReader &reader,
318                                           lldb::InputReaderAction notification,
319                                           const char *bytes,
320                                           size_t bytes_len);
321
322        static lldb::thread_result_t
323        RunPythonInputReader (lldb::thread_arg_t baton);
324
325        ScriptInterpreterPython *m_interpreter;
326        lldb::DebuggerSP m_debugger_sp;
327        lldb::InputReaderSP m_reader_sp;
328        bool m_error;
329    };
330
331    static size_t
332    InputReaderCallback (void *baton,
333                         InputReader &reader,
334                         lldb::InputReaderAction notification,
335                         const char *bytes,
336                         size_t bytes_len);
337
338
339    lldb_utility::PseudoTerminal m_embedded_thread_pty;
340    lldb_utility::PseudoTerminal m_embedded_python_pty;
341    lldb::InputReaderSP m_embedded_thread_input_reader_sp;
342    lldb::InputReaderSP m_embedded_python_input_reader_sp;
343    FILE *m_dbg_stdout;
344    PyObject *m_new_sysout;
345    PyObject *m_old_sysout;
346    PyObject *m_old_syserr;
347    PyObject *m_run_one_line;
348    std::string m_dictionary_name;
349    TerminalState m_terminal_state;
350    bool m_session_is_active;
351    bool m_pty_slave_is_open;
352    bool m_valid_session;
353};
354} // namespace lldb_private
355
356#endif // #ifdef LLDB_DISABLE_PYTHON
357
358#endif // #ifndef liblldb_ScriptInterpreterPython_h_
359