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