]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Interpreter/ScriptInterpreterPython.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Interpreter / ScriptInterpreterPython.cpp
1 //===-- ScriptInterpreterPython.cpp -----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // In order to guarantee correct working with Python, Python.h *MUST* be
11 // the *FIRST* header file included here.
12 #ifdef LLDB_DISABLE_PYTHON
13
14 // Python is disabled in this build
15
16 #else
17
18 #if defined (__APPLE__)
19 #include <Python/Python.h>
20 #else
21 #include <Python.h>
22 #endif
23
24 #include "lldb/Interpreter/ScriptInterpreterPython.h"
25
26 #include <stdlib.h>
27 #include <stdio.h>
28
29 #include <string>
30
31 #include "lldb/API/SBValue.h"
32 #include "lldb/Breakpoint/BreakpointLocation.h"
33 #include "lldb/Breakpoint/StoppointCallbackContext.h"
34 #include "lldb/Breakpoint/WatchpointOptions.h"
35 #include "lldb/Core/Debugger.h"
36 #include "lldb/Core/Timer.h"
37 #include "lldb/Host/Host.h"
38 #include "lldb/Interpreter/CommandInterpreter.h"
39 #include "lldb/Interpreter/CommandReturnObject.h"
40 #include "lldb/Target/Thread.h"
41
42 using namespace lldb;
43 using namespace lldb_private;
44
45
46 static ScriptInterpreter::SWIGInitCallback g_swig_init_callback = NULL;
47 static ScriptInterpreter::SWIGBreakpointCallbackFunction g_swig_breakpoint_callback = NULL;
48 static ScriptInterpreter::SWIGWatchpointCallbackFunction g_swig_watchpoint_callback = NULL;
49 static ScriptInterpreter::SWIGPythonTypeScriptCallbackFunction g_swig_typescript_callback = NULL;
50 static ScriptInterpreter::SWIGPythonCreateSyntheticProvider g_swig_synthetic_script = NULL;
51 static ScriptInterpreter::SWIGPythonCalculateNumChildren g_swig_calc_children = NULL;
52 static ScriptInterpreter::SWIGPythonGetChildAtIndex g_swig_get_child_index = NULL;
53 static ScriptInterpreter::SWIGPythonGetIndexOfChildWithName g_swig_get_index_child = NULL;
54 static ScriptInterpreter::SWIGPythonCastPyObjectToSBValue g_swig_cast_to_sbvalue  = NULL;
55 static ScriptInterpreter::SWIGPythonUpdateSynthProviderInstance g_swig_update_provider = NULL;
56 static ScriptInterpreter::SWIGPythonMightHaveChildrenSynthProviderInstance g_swig_mighthavechildren_provider = NULL;
57 static ScriptInterpreter::SWIGPythonCallCommand g_swig_call_command = NULL;
58 static ScriptInterpreter::SWIGPythonCallModuleInit g_swig_call_module_init = NULL;
59 static ScriptInterpreter::SWIGPythonCreateOSPlugin g_swig_create_os_plugin = NULL;
60 static ScriptInterpreter::SWIGPythonScriptKeyword_Process g_swig_run_script_keyword_process = NULL;
61 static ScriptInterpreter::SWIGPythonScriptKeyword_Thread g_swig_run_script_keyword_thread = NULL;
62 static ScriptInterpreter::SWIGPythonScriptKeyword_Target g_swig_run_script_keyword_target = NULL;
63 static ScriptInterpreter::SWIGPythonScriptKeyword_Frame g_swig_run_script_keyword_frame = NULL;
64
65 // these are the Pythonic implementations of the required callbacks
66 // these are scripting-language specific, which is why they belong here
67 // we still need to use function pointers to them instead of relying
68 // on linkage-time resolution because the SWIG stuff and this file
69 // get built at different times
70 extern "C" bool
71 LLDBSwigPythonBreakpointCallbackFunction (const char *python_function_name,
72                                           const char *session_dictionary_name,
73                                           const lldb::StackFrameSP& sb_frame,
74                                           const lldb::BreakpointLocationSP& sb_bp_loc);
75
76 extern "C" bool
77 LLDBSwigPythonWatchpointCallbackFunction (const char *python_function_name,
78                                           const char *session_dictionary_name,
79                                           const lldb::StackFrameSP& sb_frame,
80                                           const lldb::WatchpointSP& sb_wp);
81
82 extern "C" bool
83 LLDBSwigPythonCallTypeScript (const char *python_function_name,
84                               void *session_dictionary,
85                               const lldb::ValueObjectSP& valobj_sp,
86                               void** pyfunct_wrapper,
87                               std::string& retval);
88
89 extern "C" void*
90 LLDBSwigPythonCreateSyntheticProvider (const char *python_class_name,
91                                        const char *session_dictionary_name,
92                                        const lldb::ValueObjectSP& valobj_sp);
93
94
95 extern "C" uint32_t
96 LLDBSwigPython_CalculateNumChildren (void *implementor);
97
98 extern "C" void *
99 LLDBSwigPython_GetChildAtIndex (void *implementor, uint32_t idx);
100
101 extern "C" int
102 LLDBSwigPython_GetIndexOfChildWithName (void *implementor, const char* child_name);
103
104 extern "C" void *
105 LLDBSWIGPython_CastPyObjectToSBValue (void* data);
106
107 extern "C" bool
108 LLDBSwigPython_UpdateSynthProviderInstance (void* implementor);
109
110 extern "C" bool
111 LLDBSwigPython_MightHaveChildrenSynthProviderInstance (void* implementor);
112
113 extern "C" bool
114 LLDBSwigPythonCallCommand (const char *python_function_name,
115                            const char *session_dictionary_name,
116                            lldb::DebuggerSP& debugger,
117                            const char* args,
118                            lldb_private::CommandReturnObject &cmd_retobj);
119
120 extern "C" bool
121 LLDBSwigPythonCallModuleInit (const char *python_module_name,
122                               const char *session_dictionary_name,
123                               lldb::DebuggerSP& debugger);
124
125 extern "C" void*
126 LLDBSWIGPythonCreateOSPlugin (const char *python_class_name,
127                               const char *session_dictionary_name,
128                               const lldb::ProcessSP& process_sp);
129
130 extern "C" bool
131 LLDBSWIGPythonRunScriptKeywordProcess (const char* python_function_name,
132                                        const char* session_dictionary_name,
133                                        lldb::ProcessSP& process,
134                                        std::string& output);
135
136 extern "C" bool
137 LLDBSWIGPythonRunScriptKeywordThread (const char* python_function_name,
138                                       const char* session_dictionary_name,
139                                       lldb::ThreadSP& thread,
140                                       std::string& output);
141
142 extern "C" bool
143 LLDBSWIGPythonRunScriptKeywordTarget (const char* python_function_name,
144                                       const char* session_dictionary_name,
145                                       lldb::TargetSP& target,
146                                       std::string& output);
147
148 extern "C" bool
149 LLDBSWIGPythonRunScriptKeywordFrame (const char* python_function_name,
150                                      const char* session_dictionary_name,
151                                      lldb::StackFrameSP& frame,
152                                      std::string& output);
153
154 static int
155 _check_and_flush (FILE *stream)
156 {
157   int prev_fail = ferror (stream);
158   return fflush (stream) || prev_fail ? EOF : 0;
159 }
160
161 ScriptInterpreterPython::Locker::Locker (ScriptInterpreterPython *py_interpreter,
162                                          uint16_t on_entry,
163                                          uint16_t on_leave,
164                                          FILE* wait_msg_handle) :
165     ScriptInterpreterLocker (),
166     m_teardown_session( (on_leave & TearDownSession) == TearDownSession ),
167     m_python_interpreter(py_interpreter),
168     m_tmp_fh(wait_msg_handle)
169 {
170     if (m_python_interpreter && !m_tmp_fh)
171         m_tmp_fh = (m_python_interpreter->m_dbg_stdout ? m_python_interpreter->m_dbg_stdout : stdout);
172
173     DoAcquireLock();
174     if ((on_entry & InitSession) == InitSession)
175     {
176         if (DoInitSession((on_entry & InitGlobals) == InitGlobals) == false)
177         {
178             // Don't teardown the session if we didn't init it.
179             m_teardown_session = false;
180         }
181     }
182 }
183
184 bool
185 ScriptInterpreterPython::Locker::DoAcquireLock()
186 {
187     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT | LIBLLDB_LOG_VERBOSE));
188     m_GILState = PyGILState_Ensure();
189     if (log)
190         log->Printf("Ensured PyGILState. Previous state = %slocked\n", m_GILState == PyGILState_UNLOCKED ? "un" : "");
191     return true;
192 }
193
194 bool
195 ScriptInterpreterPython::Locker::DoInitSession(bool init_lldb_globals)
196 {
197     if (!m_python_interpreter)
198         return false;
199     return m_python_interpreter->EnterSession (init_lldb_globals);
200 }
201
202 bool
203 ScriptInterpreterPython::Locker::DoFreeLock()
204 {
205     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT | LIBLLDB_LOG_VERBOSE));
206     if (log)
207         log->Printf("Releasing PyGILState. Returning to state = %slocked\n", m_GILState == PyGILState_UNLOCKED ? "un" : "");
208     PyGILState_Release(m_GILState);
209     return true;
210 }
211
212 bool
213 ScriptInterpreterPython::Locker::DoTearDownSession()
214 {
215     if (!m_python_interpreter)
216         return false;
217     m_python_interpreter->LeaveSession ();
218     return true;
219 }
220
221 ScriptInterpreterPython::Locker::~Locker()
222 {
223     if (m_teardown_session)
224         DoTearDownSession();
225     DoFreeLock();
226 }
227
228 ScriptInterpreterPython::PythonInputReaderManager::PythonInputReaderManager (ScriptInterpreterPython *interpreter) :
229 m_interpreter(interpreter),
230 m_debugger_sp(),
231 m_reader_sp(),
232 m_error(false)
233 {
234     if (m_interpreter == NULL)
235     {
236         m_error = true;
237         return;
238     }
239     
240     m_debugger_sp = m_interpreter->GetCommandInterpreter().GetDebugger().shared_from_this();
241     
242     if (!m_debugger_sp)
243     {
244         m_error = true;
245         return;
246     }
247
248     m_reader_sp = InputReaderSP(new InputReader(*m_debugger_sp.get()));
249     
250     if (!m_reader_sp)
251     {
252         m_error = true;
253         return;
254     }
255     
256     Error error (m_reader_sp->Initialize (ScriptInterpreterPython::PythonInputReaderManager::InputReaderCallback,
257                                           m_interpreter,                // baton
258                                           eInputReaderGranularityLine,  // token size, to pass to callback function
259                                           NULL,                         // end token
260                                           NULL,                         // prompt
261                                           true));                       // echo input
262     if (error.Fail())
263         m_error = true;
264     else
265     {
266         m_debugger_sp->PushInputReader (m_reader_sp);
267         m_interpreter->m_embedded_thread_input_reader_sp = m_reader_sp;
268     }
269 }
270
271 ScriptInterpreterPython::PythonInputReaderManager::~PythonInputReaderManager()
272 {
273     // Nothing to do if either m_interpreter or m_reader_sp is invalid.
274     if (!m_interpreter || !m_reader_sp)
275         return;
276
277     m_reader_sp->SetIsDone (true);
278     if (m_debugger_sp)
279         m_debugger_sp->PopInputReader(m_reader_sp);
280
281     // Only mess with m_interpreter's counterpart if, indeed, they are the same object.
282     if (m_reader_sp.get() == m_interpreter->m_embedded_thread_input_reader_sp.get())
283     {
284         m_interpreter->m_embedded_thread_pty.CloseSlaveFileDescriptor();
285         m_interpreter->m_embedded_thread_input_reader_sp.reset();
286     }
287 }
288
289 size_t
290 ScriptInterpreterPython::PythonInputReaderManager::InputReaderCallback (void *baton,
291                                                                         InputReader &reader,
292                                                                         InputReaderAction notification,
293                                                                         const char *bytes, 
294                                                                         size_t bytes_len)
295 {
296     lldb::thread_t embedded_interpreter_thread;
297     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
298     
299     if (baton == NULL)
300         return 0;
301     
302     ScriptInterpreterPython *script_interpreter = (ScriptInterpreterPython *) baton;
303     
304     if (script_interpreter->m_script_lang != eScriptLanguagePython)
305         return 0;
306     
307     switch (notification)
308     {
309         case eInputReaderActivate:
310         {
311             // Save terminal settings if we can
312             int input_fd = reader.GetDebugger().GetInputFile().GetDescriptor();
313             if (input_fd == File::kInvalidDescriptor)
314                 input_fd = STDIN_FILENO;
315             
316             script_interpreter->SaveTerminalState(input_fd);
317
318             char error_str[1024];
319             if (script_interpreter->m_embedded_thread_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, error_str, 
320                                                                                     sizeof(error_str)))
321             {
322                 if (log)
323                     log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, Activate, succeeded in opening master pty (fd = %d).",
324                                  script_interpreter->m_embedded_thread_pty.GetMasterFileDescriptor());
325                 {
326                     StreamString run_string;
327                     char error_str[1024];
328                     const char *pty_slave_name = script_interpreter->m_embedded_thread_pty.GetSlaveName (error_str, sizeof (error_str));
329                     if (pty_slave_name != NULL && PyThreadState_GetDict() != NULL)
330                     {
331                         ScriptInterpreterPython::Locker locker(script_interpreter,
332                                                                ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | ScriptInterpreterPython::Locker::InitGlobals,
333                                                                ScriptInterpreterPython::Locker::FreeAcquiredLock);
334                         run_string.Printf ("run_one_line (%s, 'save_stderr = sys.stderr')", script_interpreter->m_dictionary_name.c_str());
335                         PyRun_SimpleString (run_string.GetData());
336                         run_string.Clear ();
337                         
338                         run_string.Printf ("run_one_line (%s, 'sys.stderr = sys.stdout')", script_interpreter->m_dictionary_name.c_str());
339                         PyRun_SimpleString (run_string.GetData());
340                         run_string.Clear ();
341                         
342                         run_string.Printf ("run_one_line (%s, 'save_stdin = sys.stdin')", script_interpreter->m_dictionary_name.c_str());
343                         PyRun_SimpleString (run_string.GetData());
344                         run_string.Clear ();
345                         
346                         run_string.Printf ("run_one_line (%s, \"sys.stdin = open ('%s', 'r')\")", script_interpreter->m_dictionary_name.c_str(),
347                                            pty_slave_name);
348                         PyRun_SimpleString (run_string.GetData());
349                         run_string.Clear ();
350                     }
351                 }
352                 embedded_interpreter_thread = Host::ThreadCreate ("<lldb.script-interpreter.noninteractive-python>",
353                                                                   ScriptInterpreterPython::PythonInputReaderManager::RunPythonInputReader,
354                                                                   script_interpreter, NULL);
355                 if (IS_VALID_LLDB_HOST_THREAD(embedded_interpreter_thread))
356                 {
357                     if (log)
358                         log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, Activate, succeeded in creating thread (thread_t = %p)", (void *)embedded_interpreter_thread);
359                     Error detach_error;
360                     Host::ThreadDetach (embedded_interpreter_thread, &detach_error);
361                 }
362                 else
363                 {
364                     if (log)
365                         log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, Activate, failed in creating thread");
366                     reader.SetIsDone (true);
367                 }
368             }
369             else
370             {
371                 if (log)
372                     log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, Activate, failed to open master pty ");
373                 reader.SetIsDone (true);
374             }
375         }
376             break;
377             
378         case eInputReaderDeactivate:
379                         // When another input reader is pushed, don't leave the session...
380             //script_interpreter->LeaveSession ();
381             break;
382             
383         case eInputReaderReactivate:
384 //        {
385 //            ScriptInterpreterPython::Locker locker(script_interpreter,
386 //                                                   ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession,
387 //                                                   ScriptInterpreterPython::Locker::FreeAcquiredLock);
388 //        }
389             break;
390             
391         case eInputReaderAsynchronousOutputWritten:
392             break;
393             
394         case eInputReaderInterrupt:
395             {
396                 PyThreadState* state = _PyThreadState_Current;
397                 if (!state)
398                     state = script_interpreter->m_command_thread_state;
399                 if (state)
400                 {
401                     long tid = state->thread_id;
402                     _PyThreadState_Current = state;
403                     int num_threads = PyThreadState_SetAsyncExc(tid, PyExc_KeyboardInterrupt);
404                     if (log)
405                         log->Printf("ScriptInterpreterPython::NonInteractiveInputReaderCallback, eInputReaderInterrupt, tid = %ld, num_threads = %d, state = %p",
406                                     tid,num_threads,state);
407                 }
408                 else if (log)
409                     log->Printf("ScriptInterpreterPython::NonInteractiveInputReaderCallback, eInputReaderInterrupt, state = NULL");
410             }
411             break;
412             
413         case eInputReaderEndOfFile:
414             reader.SetIsDone(true);
415             break;
416             
417         case eInputReaderGotToken:
418             if (script_interpreter->m_embedded_thread_pty.GetMasterFileDescriptor() != -1)
419             {
420                 if (log)
421                     log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, GotToken, bytes='%s', byte_len = %lu", bytes,
422                                  bytes_len);
423                 if (bytes && bytes_len)
424                     ::write (script_interpreter->m_embedded_thread_pty.GetMasterFileDescriptor(), bytes, bytes_len);
425                 ::write (script_interpreter->m_embedded_thread_pty.GetMasterFileDescriptor(), "\n", 1);
426             }
427             else
428             {
429                 if (log)
430                     log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, GotToken, bytes='%s', byte_len = %lu, Master File Descriptor is bad.", 
431                                  bytes,
432                                  bytes_len);
433                 reader.SetIsDone (true);
434             }
435             break;
436             
437         case eInputReaderDone:
438             {
439                 StreamString run_string;
440                 char error_str[1024];
441                 const char *pty_slave_name = script_interpreter->m_embedded_thread_pty.GetSlaveName (error_str, sizeof (error_str));
442                 if (pty_slave_name != NULL && PyThreadState_GetDict() != NULL)
443                 {
444                     ScriptInterpreterPython::Locker locker(script_interpreter,
445                                                            ScriptInterpreterPython::Locker::AcquireLock,
446                                                            ScriptInterpreterPython::Locker::FreeAcquiredLock);
447                     run_string.Printf ("run_one_line (%s, 'sys.stdin = save_stdin; sys.stderr = save_stderr')", script_interpreter->m_dictionary_name.c_str());
448                     PyRun_SimpleString (run_string.GetData());
449                     run_string.Clear();
450                 }
451                 // Restore terminal settings if they were validly saved
452                 if (log)
453                     log->Printf ("ScriptInterpreterPython::NonInteractiveInputReaderCallback, Done, closing down input reader.");
454                 
455                 script_interpreter->RestoreTerminalState ();
456                 
457                 script_interpreter->m_embedded_thread_pty.CloseMasterFileDescriptor();
458             }            
459             break;
460     }
461     
462     return bytes_len;
463 }
464
465 ScriptInterpreterPython::ScriptInterpreterPython (CommandInterpreter &interpreter) :
466     ScriptInterpreter (interpreter, eScriptLanguagePython),
467     m_embedded_thread_pty (),
468     m_embedded_python_pty (),
469     m_embedded_thread_input_reader_sp (),
470     m_embedded_python_input_reader_sp (),
471     m_dbg_stdout (interpreter.GetDebugger().GetOutputFile().GetStream()),
472     m_new_sysout (NULL),
473     m_old_sysout (NULL),
474     m_old_syserr (NULL),
475     m_run_one_line (NULL),
476     m_dictionary_name (interpreter.GetDebugger().GetInstanceName().AsCString()),
477     m_terminal_state (),
478     m_session_is_active (false),
479     m_valid_session (true),
480     m_command_thread_state (NULL)
481 {
482
483     static int g_initialized = false;
484     
485     if (!g_initialized)
486     {
487         g_initialized = true;
488         ScriptInterpreterPython::InitializePrivate ();
489     }
490
491     m_dictionary_name.append("_dict");
492     StreamString run_string;
493     run_string.Printf ("%s = dict()", m_dictionary_name.c_str());
494
495     Locker locker(this,
496                   ScriptInterpreterPython::Locker::AcquireLock,
497                   ScriptInterpreterPython::Locker::FreeAcquiredLock);
498     PyRun_SimpleString (run_string.GetData());
499
500     run_string.Clear();
501
502     // Importing 'lldb' module calls SBDebugger::Initialize, which calls Debugger::Initialize, which increments a
503     // global debugger ref-count; therefore we need to check the ref-count before and after importing lldb, and if the
504     // ref-count increased we need to call Debugger::Terminate here to decrement the ref-count so that when the final 
505     // call to Debugger::Terminate is made, the ref-count has the correct value. 
506     //
507     // Bonus question:  Why doesn't the ref-count always increase?  Because sometimes lldb has already been imported, in
508     // which case the code inside it, including the call to SBDebugger::Initialize(), does not get executed.
509     
510     int old_count = Debugger::TestDebuggerRefCount();
511     
512     run_string.Printf ("run_one_line (%s, 'import copy, os, re, sys, uuid, lldb')", m_dictionary_name.c_str());
513     PyRun_SimpleString (run_string.GetData());
514
515     // WARNING: temporary code that loads Cocoa formatters - this should be done on a per-platform basis rather than loading the whole set
516     // and letting the individual formatter classes exploit APIs to check whether they can/cannot do their task
517     run_string.Clear();
518     run_string.Printf ("run_one_line (%s, 'import lldb.formatters, lldb.formatters.cpp, pydoc')", m_dictionary_name.c_str());
519     PyRun_SimpleString (run_string.GetData());
520
521     int new_count = Debugger::TestDebuggerRefCount();
522     
523     if (new_count > old_count)
524         Debugger::Terminate();
525
526     run_string.Clear();
527     run_string.Printf ("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64 "; pydoc.pager = pydoc.plainpager')", m_dictionary_name.c_str(),
528                        interpreter.GetDebugger().GetID());
529     PyRun_SimpleString (run_string.GetData());
530     
531     if (m_dbg_stdout != NULL)
532     {
533         m_new_sysout = PyFile_FromFile (m_dbg_stdout, (char *) "", (char *) "w", _check_and_flush);
534     }
535     
536     // get the output file handle from the debugger (if any)
537     File& out_file = interpreter.GetDebugger().GetOutputFile();
538     if (out_file.IsValid())
539         ResetOutputFileHandle(out_file.GetStream());
540 }
541
542 ScriptInterpreterPython::~ScriptInterpreterPython ()
543 {
544     Debugger &debugger = GetCommandInterpreter().GetDebugger();
545
546     if (m_embedded_thread_input_reader_sp.get() != NULL)
547     {
548         m_embedded_thread_input_reader_sp->SetIsDone (true);
549         m_embedded_thread_pty.CloseSlaveFileDescriptor();
550         const InputReaderSP reader_sp = m_embedded_thread_input_reader_sp;
551         debugger.PopInputReader (reader_sp);
552         m_embedded_thread_input_reader_sp.reset();
553     }
554     
555     if (m_embedded_python_input_reader_sp.get() != NULL)
556     {
557         m_embedded_python_input_reader_sp->SetIsDone (true);
558         m_embedded_python_pty.CloseSlaveFileDescriptor();
559         const InputReaderSP reader_sp = m_embedded_python_input_reader_sp;
560         debugger.PopInputReader (reader_sp);
561         m_embedded_python_input_reader_sp.reset();
562     }
563     
564     if (m_new_sysout)
565     {
566         Locker locker(this,
567                       ScriptInterpreterPython::Locker::AcquireLock,
568                       ScriptInterpreterPython::Locker::FreeLock);
569         Py_XDECREF ((PyObject*)m_new_sysout);
570     }
571 }
572
573 void
574 ScriptInterpreterPython::ResetOutputFileHandle (FILE *fh)
575 {
576     if (fh == NULL)
577         return;
578         
579     m_dbg_stdout = fh;
580
581     Locker locker(this,
582                   ScriptInterpreterPython::Locker::AcquireLock,
583                   ScriptInterpreterPython::Locker::FreeAcquiredLock);
584
585     m_new_sysout = PyFile_FromFile (m_dbg_stdout, (char *) "", (char *) "w", _check_and_flush);
586 }
587
588 void
589 ScriptInterpreterPython::SaveTerminalState (int fd)
590 {
591     // Python mucks with the terminal state of STDIN. If we can possibly avoid
592     // this by setting the file handles up correctly prior to entering the
593     // interpreter we should. For now we save and restore the terminal state
594     // on the input file handle.
595     m_terminal_state.Save (fd, false);
596 }
597
598 void
599 ScriptInterpreterPython::RestoreTerminalState ()
600 {
601     // Python mucks with the terminal state of STDIN. If we can possibly avoid
602     // this by setting the file handles up correctly prior to entering the
603     // interpreter we should. For now we save and restore the terminal state
604     // on the input file handle.
605     m_terminal_state.Restore();
606 }
607
608 void
609 ScriptInterpreterPython::LeaveSession ()
610 {
611     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
612     if (log)
613         log->PutCString("ScriptInterpreterPython::LeaveSession()");
614
615     // checking that we have a valid thread state - since we use our own threading and locking
616     // in some (rare) cases during cleanup Python may end up believing we have no thread state
617     // and PyImport_AddModule will crash if that is the case - since that seems to only happen
618     // when destroying the SBDebugger, we can make do without clearing up stdout and stderr
619
620     // rdar://problem/11292882
621     // When the current thread state is NULL, PyThreadState_Get() issues a fatal error.
622     if (PyThreadState_GetDict())
623     {
624         PyObject *sysmod = PyImport_AddModule ("sys");
625         PyObject *sysdict = PyModule_GetDict (sysmod);
626
627         if (m_new_sysout && sysmod && sysdict)
628         {
629             if (m_old_sysout)
630                 PyDict_SetItemString (sysdict, "stdout", (PyObject*)m_old_sysout);
631             if (m_old_syserr)
632                 PyDict_SetItemString (sysdict, "stderr", (PyObject*)m_old_syserr);
633         }
634     }
635
636     m_session_is_active = false;
637 }
638
639 bool
640 ScriptInterpreterPython::EnterSession (bool init_lldb_globals)
641 {
642     // If we have already entered the session, without having officially 'left' it, then there is no need to 
643     // 'enter' it again.
644     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
645     if (m_session_is_active)
646     {
647         if (log)
648             log->Printf("ScriptInterpreterPython::EnterSession(init_lldb_globals=%i) session is already active, returning without doing anything", init_lldb_globals);
649         return false;
650     }
651
652     if (log)
653         log->Printf("ScriptInterpreterPython::EnterSession(init_lldb_globals=%i)", init_lldb_globals);
654     
655
656     m_session_is_active = true;
657
658     StreamString run_string;
659
660     if (init_lldb_globals)
661     {
662         run_string.Printf (    "run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64, m_dictionary_name.c_str(), GetCommandInterpreter().GetDebugger().GetID());
663         run_string.Printf (    "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", GetCommandInterpreter().GetDebugger().GetID());
664         run_string.PutCString ("; lldb.target = lldb.debugger.GetSelectedTarget()");
665         run_string.PutCString ("; lldb.process = lldb.target.GetProcess()");
666         run_string.PutCString ("; lldb.thread = lldb.process.GetSelectedThread ()");
667         run_string.PutCString ("; lldb.frame = lldb.thread.GetSelectedFrame ()");
668         run_string.PutCString ("')");
669     }
670     else
671     {
672         // If we aren't initing the globals, we should still always set the debugger (since that is always unique.)
673         run_string.Printf (    "run_one_line (%s, \"lldb.debugger_unique_id = %" PRIu64, m_dictionary_name.c_str(), GetCommandInterpreter().GetDebugger().GetID());
674         run_string.Printf (    "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", GetCommandInterpreter().GetDebugger().GetID());
675         run_string.PutCString ("\")");
676     }
677
678     PyRun_SimpleString (run_string.GetData());
679     run_string.Clear();
680
681     PyObject *sysmod = PyImport_AddModule ("sys");
682     PyObject *sysdict = PyModule_GetDict (sysmod);
683
684     if (m_new_sysout && sysmod && sysdict)
685     {
686         m_old_sysout = PyDict_GetItemString(sysdict, "stdout");
687         m_old_syserr = PyDict_GetItemString(sysdict, "stderr");
688         if (m_new_sysout)
689         {
690             PyDict_SetItemString (sysdict, "stdout", (PyObject*)m_new_sysout);
691             PyDict_SetItemString (sysdict, "stderr", (PyObject*)m_new_sysout);
692         }
693     }
694
695     if (PyErr_Occurred())
696         PyErr_Clear ();
697     
698     return true;
699 }
700
701 static PyObject*
702 FindSessionDictionary (const char* dict_name)
703 {
704     static std::map<ConstString,PyObject*> g_dict_map;
705     
706     ConstString dict(dict_name);
707     
708     std::map<ConstString,PyObject*>::iterator iter = g_dict_map.find(dict);
709     
710     if (iter != g_dict_map.end())
711         return iter->second;
712     
713     PyObject *main_mod = PyImport_AddModule ("__main__");
714     if (main_mod != NULL)
715     {
716         PyObject *main_dict = PyModule_GetDict (main_mod);
717         if ((main_dict != NULL)
718             && PyDict_Check (main_dict))
719         {
720             // Go through the main dictionary looking for the correct python script interpreter dictionary
721             PyObject *key, *value;
722             Py_ssize_t pos = 0;
723             
724             while (PyDict_Next (main_dict, &pos, &key, &value))
725             {
726                 // We have stolen references to the key and value objects in the dictionary; we need to increment 
727                 // them now so that Python's garbage collector doesn't collect them out from under us.
728                 Py_INCREF (key);
729                 Py_INCREF (value);
730                 if (strcmp (PyString_AsString (key), dict_name) == 0)
731                 {
732                     g_dict_map[dict] = value;
733                     return value;
734                 }
735             }
736         }
737     }
738     return NULL;
739 }
740
741 static std::string
742 GenerateUniqueName (const char* base_name_wanted,
743                     uint32_t& functions_counter,
744                     void* name_token = NULL)
745 {
746     StreamString sstr;
747     
748     if (!base_name_wanted)
749         return std::string();
750     
751     if (!name_token)
752         sstr.Printf ("%s_%d", base_name_wanted, functions_counter++);
753     else
754         sstr.Printf ("%s_%p", base_name_wanted, name_token);
755     
756     return sstr.GetString();
757 }
758
759 bool
760 ScriptInterpreterPython::ExecuteOneLine (const char *command, CommandReturnObject *result, const ExecuteScriptOptions &options)
761 {
762     if (!m_valid_session)
763         return false;
764         
765     // We want to call run_one_line, passing in the dictionary and the command string.  We cannot do this through
766     // PyRun_SimpleString here because the command string may contain escaped characters, and putting it inside
767     // another string to pass to PyRun_SimpleString messes up the escaping.  So we use the following more complicated
768     // method to pass the command string directly down to Python.
769
770     Locker locker(this,
771                   ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | (options.GetSetLLDBGlobals() ? ScriptInterpreterPython::Locker::InitGlobals : 0),
772                   ScriptInterpreterPython::Locker::FreeAcquiredLock | ScriptInterpreterPython::Locker::TearDownSession);
773
774     bool success = false;
775
776     if (command)
777     {
778         // Find the correct script interpreter dictionary in the main module.
779         PyObject *script_interpreter_dict = FindSessionDictionary(m_dictionary_name.c_str());
780         if (script_interpreter_dict != NULL)
781         {
782             PyObject *pfunc = (PyObject*)m_run_one_line;
783             PyObject *pmod = PyImport_AddModule ("lldb.embedded_interpreter");
784             if (pmod != NULL)
785             {
786                 PyObject *pmod_dict = PyModule_GetDict (pmod);
787                 if ((pmod_dict != NULL)
788                     && PyDict_Check (pmod_dict))
789                 {
790                     if (!pfunc)
791                     {
792                         PyObject *key, *value;
793                         Py_ssize_t pos = 0;
794                         
795                         while (PyDict_Next (pmod_dict, &pos, &key, &value))
796                         {
797                             Py_INCREF (key);
798                             Py_INCREF (value);
799                             if (strcmp (PyString_AsString (key), "run_one_line") == 0)
800                             {
801                                 pfunc = value;
802                                 break;
803                             }
804                         }
805                         m_run_one_line = pfunc;
806                     }
807                     
808                     if (pfunc && PyCallable_Check (pfunc))
809                     {
810                         PyObject *pargs = Py_BuildValue("(Os)",script_interpreter_dict,command);
811                         if (pargs != NULL)
812                         {
813                             PyObject *pvalue = NULL;
814                             { // scope for PythonInputReaderManager
815                                 PythonInputReaderManager py_input(options.GetEnableIO() ? this : NULL);
816                                 pvalue = PyObject_CallObject (pfunc, pargs);
817                             }
818                             Py_XDECREF (pargs);
819                             if (pvalue != NULL)
820                             {
821                                 Py_XDECREF (pvalue);
822                                 success = true;
823                             }
824                             else if (options.GetMaskoutErrors() && PyErr_Occurred ())
825                             {
826                                 PyErr_Print();
827                                 PyErr_Clear();
828                             }
829                         }
830                     }
831                 }
832             }
833             Py_INCREF (script_interpreter_dict);
834         }
835
836         if (success)
837             return true;
838
839         // The one-liner failed.  Append the error message.
840         if (result)
841             result->AppendErrorWithFormat ("python failed attempting to evaluate '%s'\n", command);
842         return false;
843     }
844
845     if (result)
846         result->AppendError ("empty command passed to python\n");
847     return false;
848 }
849
850 size_t
851 ScriptInterpreterPython::InputReaderCallback
852 (
853     void *baton, 
854     InputReader &reader, 
855     InputReaderAction notification,
856     const char *bytes, 
857     size_t bytes_len
858 )
859 {
860     lldb::thread_t embedded_interpreter_thread;
861     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
862
863     if (baton == NULL)
864         return 0;
865         
866     ScriptInterpreterPython *script_interpreter = (ScriptInterpreterPython *) baton;
867     
868     if (script_interpreter->m_script_lang != eScriptLanguagePython)
869         return 0;
870     
871     switch (notification)
872     {
873     case eInputReaderActivate:
874         {
875             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
876             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
877             if (!batch_mode)
878             {
879                 out_stream->Printf ("Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.\n");
880                 out_stream->Flush();
881             }
882
883             // Save terminal settings if we can
884             int input_fd = reader.GetDebugger().GetInputFile().GetDescriptor();
885             if (input_fd == File::kInvalidDescriptor)
886                 input_fd = STDIN_FILENO;
887
888             script_interpreter->SaveTerminalState(input_fd);
889
890             {
891                 ScriptInterpreterPython::Locker locker(script_interpreter,
892                                                        ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | ScriptInterpreterPython::Locker::InitGlobals,
893                                                        ScriptInterpreterPython::Locker::FreeAcquiredLock);
894             }
895
896             char error_str[1024];
897             if (script_interpreter->m_embedded_python_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, error_str, 
898                                                                                     sizeof(error_str)))
899             {
900                 if (log)
901                     log->Printf ("ScriptInterpreterPython::InputReaderCallback, Activate, succeeded in opening master pty (fd = %d).",
902                                   script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor());
903                 embedded_interpreter_thread = Host::ThreadCreate ("<lldb.script-interpreter.embedded-python-loop>",
904                                                                   ScriptInterpreterPython::RunEmbeddedPythonInterpreter,
905                                                                   script_interpreter, NULL);
906                 if (IS_VALID_LLDB_HOST_THREAD(embedded_interpreter_thread))
907                 {
908                     if (log)
909                         log->Printf ("ScriptInterpreterPython::InputReaderCallback, Activate, succeeded in creating thread (thread_t = %p)", (void *)embedded_interpreter_thread);
910                     Error detach_error;
911                     Host::ThreadDetach (embedded_interpreter_thread, &detach_error);
912                 }
913                 else
914                 {
915                     if (log)
916                         log->Printf ("ScriptInterpreterPython::InputReaderCallback, Activate, failed in creating thread");
917                     reader.SetIsDone (true);
918                 }
919             }
920             else
921             {
922                 if (log)
923                     log->Printf ("ScriptInterpreterPython::InputReaderCallback, Activate, failed to open master pty ");
924                 reader.SetIsDone (true);
925             }
926         }
927         break;
928
929     case eInputReaderDeactivate:
930                         // When another input reader is pushed, don't leave the session...
931             //script_interpreter->LeaveSession ();
932         break;
933
934     case eInputReaderReactivate:
935         {
936             ScriptInterpreterPython::Locker locker (script_interpreter,
937                                                     ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession,
938                                                     ScriptInterpreterPython::Locker::FreeAcquiredLock);
939         }
940         break;
941         
942     case eInputReaderAsynchronousOutputWritten:
943         break;
944         
945     case eInputReaderInterrupt:
946         ::write (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor(), "raise KeyboardInterrupt\n", 24);
947         break;
948         
949     case eInputReaderEndOfFile:
950         ::write (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor(), "quit()\n", 7);
951         break;
952
953     case eInputReaderGotToken:
954         if (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor() != -1)
955         {
956             if (log)
957                 log->Printf ("ScriptInterpreterPython::InputReaderCallback, GotToken, bytes='%s', byte_len = %lu", bytes,
958                              bytes_len);
959             if (bytes && bytes_len)
960             {
961                 if ((int) bytes[0] == 4)
962                     ::write (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor(), "quit()", 6);
963                 else
964                     ::write (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor(), bytes, bytes_len);
965             }
966             ::write (script_interpreter->m_embedded_python_pty.GetMasterFileDescriptor(), "\n", 1);
967         }
968         else
969         {
970             if (log)
971                 log->Printf ("ScriptInterpreterPython::InputReaderCallback, GotToken, bytes='%s', byte_len = %lu, Master File Descriptor is bad.", 
972                              bytes,
973                              bytes_len);
974             reader.SetIsDone (true);
975         }
976
977         break;
978         
979     case eInputReaderDone:
980         {
981             Locker locker(script_interpreter,
982                           ScriptInterpreterPython::Locker::AcquireLock,
983                           ScriptInterpreterPython::Locker::FreeAcquiredLock);
984             script_interpreter->LeaveSession ();
985         }
986
987         // Restore terminal settings if they were validly saved
988         if (log)
989             log->Printf ("ScriptInterpreterPython::InputReaderCallback, Done, closing down input reader.");
990             
991         script_interpreter->RestoreTerminalState ();
992
993         script_interpreter->m_embedded_python_pty.CloseMasterFileDescriptor();
994         break;
995     }
996
997     return bytes_len;
998 }
999
1000
1001 void
1002 ScriptInterpreterPython::ExecuteInterpreterLoop ()
1003 {
1004     Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
1005
1006     Debugger &debugger = GetCommandInterpreter().GetDebugger();
1007
1008     // At the moment, the only time the debugger does not have an input file handle is when this is called
1009     // directly from Python, in which case it is both dangerous and unnecessary (not to mention confusing) to
1010     // try to embed a running interpreter loop inside the already running Python interpreter loop, so we won't
1011     // do it.
1012
1013     if (!debugger.GetInputFile().IsValid())
1014         return;
1015
1016     InputReaderSP reader_sp (new InputReader(debugger));
1017     if (reader_sp)
1018     {
1019         Error error (reader_sp->Initialize (ScriptInterpreterPython::InputReaderCallback,
1020                                             this,                         // baton
1021                                             eInputReaderGranularityLine,  // token size, to pass to callback function
1022                                             NULL,                         // end token
1023                                             NULL,                         // prompt
1024                                             true));                       // echo input
1025      
1026         if (error.Success())
1027         {
1028             debugger.PushInputReader (reader_sp);
1029             m_embedded_python_input_reader_sp = reader_sp;
1030         }
1031     }
1032 }
1033
1034 bool
1035 ScriptInterpreterPython::ExecuteOneLineWithReturn (const char *in_string,
1036                                                    ScriptInterpreter::ScriptReturnType return_type,
1037                                                    void *ret_value,
1038                                                    const ExecuteScriptOptions &options)
1039 {
1040
1041     Locker locker(this,
1042                   ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | (options.GetSetLLDBGlobals() ? ScriptInterpreterPython::Locker::InitGlobals : 0),
1043                   ScriptInterpreterPython::Locker::FreeAcquiredLock | ScriptInterpreterPython::Locker::TearDownSession);
1044
1045     PyObject *py_return = NULL;
1046     PyObject *mainmod = PyImport_AddModule ("__main__");
1047     PyObject *globals = PyModule_GetDict (mainmod);
1048     PyObject *locals = NULL;
1049     PyObject *py_error = NULL;
1050     bool ret_success = false;
1051     bool should_decrement_locals = false;
1052     int success;
1053     
1054     locals = FindSessionDictionary(m_dictionary_name.c_str());
1055     
1056     if (locals == NULL)
1057     {
1058         locals = PyObject_GetAttrString (globals, m_dictionary_name.c_str());
1059         should_decrement_locals = true;
1060     }
1061         
1062     if (locals == NULL)
1063     {
1064         locals = globals;
1065         should_decrement_locals = false;
1066     }
1067
1068     py_error = PyErr_Occurred();
1069     if (py_error != NULL)
1070         PyErr_Clear();
1071     
1072     if (in_string != NULL)
1073     {
1074         { // scope for PythonInputReaderManager
1075             PythonInputReaderManager py_input(options.GetEnableIO() ? this : NULL);
1076             py_return = PyRun_String (in_string, Py_eval_input, globals, locals);
1077             if (py_return == NULL)
1078             { 
1079                 py_error = PyErr_Occurred ();
1080                 if (py_error != NULL)
1081                     PyErr_Clear ();
1082
1083                 py_return = PyRun_String (in_string, Py_single_input, globals, locals);
1084             }
1085         }
1086
1087         if (locals != NULL
1088             && should_decrement_locals)
1089             Py_XDECREF (locals);
1090
1091         if (py_return != NULL)
1092         {
1093             switch (return_type)
1094             {
1095                 case eScriptReturnTypeCharPtr: // "char *"
1096                 {
1097                     const char format[3] = "s#";
1098                     success = PyArg_Parse (py_return, format, (char **) ret_value);
1099                     break;
1100                 }
1101                 case eScriptReturnTypeCharStrOrNone: // char* or NULL if py_return == Py_None
1102                 {
1103                     const char format[3] = "z";
1104                     success = PyArg_Parse (py_return, format, (char **) ret_value);
1105                     break;
1106                 }
1107                 case eScriptReturnTypeBool:
1108                 {
1109                     const char format[2] = "b";
1110                     success = PyArg_Parse (py_return, format, (bool *) ret_value);
1111                     break;
1112                 }
1113                 case eScriptReturnTypeShortInt:
1114                 {
1115                     const char format[2] = "h";
1116                     success = PyArg_Parse (py_return, format, (short *) ret_value);
1117                     break;
1118                 }
1119                 case eScriptReturnTypeShortIntUnsigned:
1120                 {
1121                     const char format[2] = "H";
1122                     success = PyArg_Parse (py_return, format, (unsigned short *) ret_value);
1123                     break;
1124                 }
1125                 case eScriptReturnTypeInt:
1126                 {
1127                     const char format[2] = "i";
1128                     success = PyArg_Parse (py_return, format, (int *) ret_value);
1129                     break;
1130                 }
1131                 case eScriptReturnTypeIntUnsigned:
1132                 {
1133                     const char format[2] = "I";
1134                     success = PyArg_Parse (py_return, format, (unsigned int *) ret_value);
1135                     break;
1136                 }
1137                 case eScriptReturnTypeLongInt:
1138                 {
1139                     const char format[2] = "l";
1140                     success = PyArg_Parse (py_return, format, (long *) ret_value);
1141                     break;
1142                 }
1143                 case eScriptReturnTypeLongIntUnsigned:
1144                 {
1145                     const char format[2] = "k";
1146                     success = PyArg_Parse (py_return, format, (unsigned long *) ret_value);
1147                     break;
1148                 }
1149                 case eScriptReturnTypeLongLong:
1150                 {
1151                     const char format[2] = "L";
1152                     success = PyArg_Parse (py_return, format, (long long *) ret_value);
1153                     break;
1154                 }
1155                 case eScriptReturnTypeLongLongUnsigned:
1156                 {
1157                     const char format[2] = "K";
1158                     success = PyArg_Parse (py_return, format, (unsigned long long *) ret_value);
1159                     break;
1160                 }
1161                 case eScriptReturnTypeFloat:
1162                 {
1163                     const char format[2] = "f";
1164                     success = PyArg_Parse (py_return, format, (float *) ret_value);
1165                     break;
1166                 }
1167                 case eScriptReturnTypeDouble:
1168                 {
1169                     const char format[2] = "d";
1170                     success = PyArg_Parse (py_return, format, (double *) ret_value);
1171                     break;
1172                 }
1173                 case eScriptReturnTypeChar:
1174                 {
1175                     const char format[2] = "c";
1176                     success = PyArg_Parse (py_return, format, (char *) ret_value);
1177                     break;
1178                 }
1179             }
1180             Py_XDECREF (py_return);
1181             if (success)
1182                 ret_success = true;
1183             else
1184                 ret_success = false;
1185         }
1186     }
1187
1188     py_error = PyErr_Occurred();
1189     if (py_error != NULL)
1190     {
1191         ret_success = false;
1192         if (options.GetMaskoutErrors())
1193         {
1194             if (PyErr_GivenExceptionMatches (py_error, PyExc_SyntaxError))
1195                 PyErr_Print ();
1196             PyErr_Clear();
1197         }
1198     }
1199
1200     return ret_success;
1201 }
1202
1203 bool
1204 ScriptInterpreterPython::ExecuteMultipleLines (const char *in_string, const ExecuteScriptOptions &options)
1205 {
1206     
1207     
1208     Locker locker(this,
1209                   ScriptInterpreterPython::Locker::AcquireLock      | ScriptInterpreterPython::Locker::InitSession | (options.GetSetLLDBGlobals() ? ScriptInterpreterPython::Locker::InitGlobals : 0),
1210                   ScriptInterpreterPython::Locker::FreeAcquiredLock | ScriptInterpreterPython::Locker::TearDownSession);
1211
1212     bool success = false;
1213     PyObject *py_return = NULL;
1214     PyObject *mainmod = PyImport_AddModule ("__main__");
1215     PyObject *globals = PyModule_GetDict (mainmod);
1216     PyObject *locals = NULL;
1217     PyObject *py_error = NULL;
1218     bool should_decrement_locals = false;
1219
1220     locals = FindSessionDictionary(m_dictionary_name.c_str());
1221     
1222     if (locals == NULL)
1223     {
1224         locals = PyObject_GetAttrString (globals, m_dictionary_name.c_str());
1225         should_decrement_locals = true;
1226     }
1227
1228     if (locals == NULL)
1229     {
1230         locals = globals;
1231         should_decrement_locals = false;
1232     }
1233
1234     py_error = PyErr_Occurred();
1235     if (py_error != NULL)
1236         PyErr_Clear();
1237     
1238     if (in_string != NULL)
1239     {
1240         struct _node *compiled_node = PyParser_SimpleParseString (in_string, Py_file_input);
1241         if (compiled_node)
1242         {
1243             PyCodeObject *compiled_code = PyNode_Compile (compiled_node, "temp.py");
1244             if (compiled_code)
1245             {
1246                 { // scope for PythonInputReaderManager
1247                     PythonInputReaderManager py_input(options.GetEnableIO() ? this : NULL);
1248                     py_return = PyEval_EvalCode (compiled_code, globals, locals);
1249                 }
1250                 if (py_return != NULL)
1251                 {
1252                     success = true;
1253                     Py_XDECREF (py_return);
1254                 }
1255                 if (locals && should_decrement_locals)
1256                     Py_XDECREF (locals);
1257             }
1258         }
1259     }
1260
1261     py_error = PyErr_Occurred ();
1262     if (py_error != NULL)
1263     {
1264         success = false;
1265         if (options.GetMaskoutErrors())
1266         {
1267             if (PyErr_GivenExceptionMatches (py_error, PyExc_SyntaxError))
1268                 PyErr_Print ();
1269             PyErr_Clear();
1270         }
1271     }
1272
1273     return success;
1274 }
1275
1276 static const char *g_reader_instructions = "Enter your Python command(s). Type 'DONE' to end.";
1277
1278 static const char *g_bkpt_command_reader_instructions = "Enter your Python command(s). Type 'DONE' to end.\n"
1279                                                         "def function(frame,bp_loc,internal_dict):\n"
1280                                                         "    \"\"\"frame: the SBFrame for the location at which you stopped\n"
1281                                                         "       bp_loc: an SBBreakpointLocation for the breakpoint location information\n"
1282                                                         "       internal_dict: an LLDB support object not to be used\"\"\"";
1283
1284 size_t
1285 ScriptInterpreterPython::GenerateBreakpointOptionsCommandCallback
1286 (
1287     void *baton, 
1288     InputReader &reader, 
1289     InputReaderAction notification,
1290     const char *bytes, 
1291     size_t bytes_len
1292 )
1293 {
1294     static StringList commands_in_progress;
1295     
1296     switch (notification)
1297     {
1298     case eInputReaderActivate:
1299         {
1300             
1301             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1302             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1303             commands_in_progress.Clear();
1304             if (!batch_mode)
1305             {
1306                 out_stream->Printf ("%s\n", g_bkpt_command_reader_instructions);
1307                 if (reader.GetPrompt())
1308                     out_stream->Printf ("%s", reader.GetPrompt());
1309                 out_stream->Flush ();
1310             }
1311         }
1312         break;
1313
1314     case eInputReaderDeactivate:
1315         break;
1316
1317     case eInputReaderReactivate:
1318         {
1319             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1320             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1321             if (reader.GetPrompt() && !batch_mode)
1322             {
1323                 out_stream->Printf ("%s", reader.GetPrompt());
1324                 out_stream->Flush ();
1325             }
1326         }
1327         break;
1328
1329     case eInputReaderAsynchronousOutputWritten:
1330         break;
1331         
1332     case eInputReaderGotToken:
1333         {
1334             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1335             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1336             std::string temp_string (bytes, bytes_len);
1337             commands_in_progress.AppendString (temp_string.c_str());
1338             if (!reader.IsDone() && reader.GetPrompt() && !batch_mode)
1339             {
1340                 out_stream->Printf ("%s", reader.GetPrompt());
1341                 out_stream->Flush ();
1342             }
1343         }
1344         break;
1345
1346     case eInputReaderEndOfFile:
1347     case eInputReaderInterrupt:
1348         // Control-c (SIGINT) & control-d both mean finish & exit.
1349         reader.SetIsDone(true);
1350         
1351         // Control-c (SIGINT) ALSO means cancel; do NOT create a breakpoint command.
1352         if (notification == eInputReaderInterrupt)
1353             commands_in_progress.Clear();  
1354         
1355         // Fall through here...
1356
1357     case eInputReaderDone:
1358         {
1359             bool batch_mode = notification == eInputReaderDone ? 
1360                 reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode() :
1361                 true;
1362             BreakpointOptions *bp_options = (BreakpointOptions *)baton;
1363             std::unique_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
1364             data_ap->user_source.AppendList (commands_in_progress);
1365             if (data_ap.get())
1366             {
1367                 ScriptInterpreter *interpreter = reader.GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
1368                 if (interpreter)
1369                 {
1370                     if (interpreter->GenerateBreakpointCommandCallbackData (data_ap->user_source, 
1371                                                                             data_ap->script_source))
1372                     {
1373                         BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
1374                         bp_options->SetCallback (ScriptInterpreterPython::BreakpointCallbackFunction, baton_sp);
1375                     }
1376                     else if (!batch_mode)
1377                     {
1378                         StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1379                         out_stream->Printf ("Warning: No command attached to breakpoint.\n");
1380                         out_stream->Flush();
1381                     }
1382                 }
1383                 else
1384                 {
1385                             if (!batch_mode)
1386                     {
1387                         StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1388                         out_stream->Printf ("Warning:  Unable to find script intepreter; no command attached to breakpoint.\n");
1389                         out_stream->Flush();
1390                     }
1391                 }
1392             }
1393         }
1394         break;
1395         
1396     }
1397
1398     return bytes_len;
1399 }
1400
1401 size_t
1402 ScriptInterpreterPython::GenerateWatchpointOptionsCommandCallback
1403 (
1404     void *baton, 
1405     InputReader &reader, 
1406     InputReaderAction notification,
1407     const char *bytes, 
1408     size_t bytes_len
1409 )
1410 {
1411     static StringList commands_in_progress;
1412     
1413     switch (notification)
1414     {
1415     case eInputReaderActivate:
1416         {
1417             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1418             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1419             
1420             commands_in_progress.Clear();
1421             if (!batch_mode)
1422             {
1423                 out_stream->Printf ("%s\n", g_reader_instructions);
1424                 if (reader.GetPrompt())
1425                     out_stream->Printf ("%s", reader.GetPrompt());
1426                 out_stream->Flush ();
1427             }
1428         }
1429         break;
1430
1431     case eInputReaderDeactivate:
1432         break;
1433
1434     case eInputReaderReactivate:
1435         {
1436             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1437             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1438             if (reader.GetPrompt() && !batch_mode)
1439             {
1440                 out_stream->Printf ("%s", reader.GetPrompt());
1441                 out_stream->Flush ();
1442             }
1443         }
1444         break;
1445
1446     case eInputReaderAsynchronousOutputWritten:
1447         break;
1448         
1449     case eInputReaderGotToken:
1450         {
1451             StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1452             bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1453             std::string temp_string (bytes, bytes_len);
1454             commands_in_progress.AppendString (temp_string.c_str());
1455             if (!reader.IsDone() && reader.GetPrompt() && !batch_mode)
1456             {
1457                 out_stream->Printf ("%s", reader.GetPrompt());
1458                 out_stream->Flush ();
1459             }
1460         }
1461         break;
1462
1463     case eInputReaderEndOfFile:
1464     case eInputReaderInterrupt:
1465         // Control-c (SIGINT) & control-d both mean finish & exit.
1466         reader.SetIsDone(true);
1467         
1468         // Control-c (SIGINT) ALSO means cancel; do NOT create a breakpoint command.
1469         if (notification == eInputReaderInterrupt)
1470             commands_in_progress.Clear();  
1471         
1472         // Fall through here...
1473
1474     case eInputReaderDone:
1475         {
1476             bool batch_mode = notification == eInputReaderDone ?
1477                 reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode() :
1478                 true;
1479             WatchpointOptions *wp_options = (WatchpointOptions *)baton;
1480             std::unique_ptr<WatchpointOptions::CommandData> data_ap(new WatchpointOptions::CommandData());
1481             data_ap->user_source.AppendList (commands_in_progress);
1482             if (data_ap.get())
1483             {
1484                 ScriptInterpreter *interpreter = reader.GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
1485                 if (interpreter)
1486                 {
1487                     if (interpreter->GenerateWatchpointCommandCallbackData (data_ap->user_source, 
1488                                                                             data_ap->script_source))
1489                     {
1490                         BatonSP baton_sp (new WatchpointOptions::CommandBaton (data_ap.release()));
1491                         wp_options->SetCallback (ScriptInterpreterPython::WatchpointCallbackFunction, baton_sp);
1492                     }
1493                     else if (!batch_mode)
1494                     {
1495                         StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1496                         out_stream->Printf ("Warning: No command attached to breakpoint.\n");
1497                         out_stream->Flush();
1498                     }
1499                 }
1500                 else
1501                 {
1502                             if (!batch_mode)
1503                     {
1504                         StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
1505                         out_stream->Printf ("Warning:  Unable to find script intepreter; no command attached to breakpoint.\n");
1506                         out_stream->Flush();
1507                     }
1508                 }
1509             }
1510         }
1511         break;
1512         
1513     }
1514
1515     return bytes_len;
1516 }
1517
1518 void
1519 ScriptInterpreterPython::CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options,
1520                                                                   CommandReturnObject &result)
1521 {
1522     Debugger &debugger = GetCommandInterpreter().GetDebugger();
1523     
1524     InputReaderSP reader_sp (new InputReader (debugger));
1525
1526     if (reader_sp)
1527     {
1528         Error err = reader_sp->Initialize (
1529                 ScriptInterpreterPython::GenerateBreakpointOptionsCommandCallback,
1530                 bp_options,                 // baton
1531                 eInputReaderGranularityLine, // token size, for feeding data to callback function
1532                 "DONE",                     // end token
1533                 "    ",                     // prompt
1534                 true);                      // echo input
1535     
1536         if (err.Success())
1537             debugger.PushInputReader (reader_sp);
1538         else
1539         {
1540             result.AppendError (err.AsCString());
1541             result.SetStatus (eReturnStatusFailed);
1542         }
1543     }
1544     else
1545     {
1546         result.AppendError("out of memory");
1547         result.SetStatus (eReturnStatusFailed);
1548     }
1549 }
1550
1551 void
1552 ScriptInterpreterPython::CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options,
1553                                                                   CommandReturnObject &result)
1554 {
1555     Debugger &debugger = GetCommandInterpreter().GetDebugger();
1556     
1557     InputReaderSP reader_sp (new InputReader (debugger));
1558
1559     if (reader_sp)
1560     {
1561         Error err = reader_sp->Initialize (
1562                 ScriptInterpreterPython::GenerateWatchpointOptionsCommandCallback,
1563                 wp_options,                 // baton
1564                 eInputReaderGranularityLine, // token size, for feeding data to callback function
1565                 "DONE",                     // end token
1566                 "> ",                       // prompt
1567                 true);                      // echo input
1568     
1569         if (err.Success())
1570             debugger.PushInputReader (reader_sp);
1571         else
1572         {
1573             result.AppendError (err.AsCString());
1574             result.SetStatus (eReturnStatusFailed);
1575         }
1576     }
1577     else
1578     {
1579         result.AppendError("out of memory");
1580         result.SetStatus (eReturnStatusFailed);
1581     }
1582 }
1583
1584 // Set a Python one-liner as the callback for the breakpoint.
1585 void
1586 ScriptInterpreterPython::SetBreakpointCommandCallback (BreakpointOptions *bp_options,
1587                                                        const char *oneliner)
1588 {
1589     std::unique_ptr<BreakpointOptions::CommandData> data_ap(new BreakpointOptions::CommandData());
1590
1591     // It's necessary to set both user_source and script_source to the oneliner.
1592     // The former is used to generate callback description (as in breakpoint command list)
1593     // while the latter is used for Python to interpret during the actual callback.
1594
1595     data_ap->user_source.AppendString (oneliner);
1596     data_ap->script_source.assign (oneliner);
1597
1598     if (GenerateBreakpointCommandCallbackData (data_ap->user_source, data_ap->script_source))
1599     {
1600         BatonSP baton_sp (new BreakpointOptions::CommandBaton (data_ap.release()));
1601         bp_options->SetCallback (ScriptInterpreterPython::BreakpointCallbackFunction, baton_sp);
1602     }
1603     
1604     return;
1605 }
1606
1607 // Set a Python one-liner as the callback for the watchpoint.
1608 void
1609 ScriptInterpreterPython::SetWatchpointCommandCallback (WatchpointOptions *wp_options,
1610                                                        const char *oneliner)
1611 {
1612     std::unique_ptr<WatchpointOptions::CommandData> data_ap(new WatchpointOptions::CommandData());
1613
1614     // It's necessary to set both user_source and script_source to the oneliner.
1615     // The former is used to generate callback description (as in watchpoint command list)
1616     // while the latter is used for Python to interpret during the actual callback.
1617
1618     data_ap->user_source.AppendString (oneliner);
1619     data_ap->script_source.assign (oneliner);
1620
1621     if (GenerateWatchpointCommandCallbackData (data_ap->user_source, data_ap->script_source))
1622     {
1623         BatonSP baton_sp (new WatchpointOptions::CommandBaton (data_ap.release()));
1624         wp_options->SetCallback (ScriptInterpreterPython::WatchpointCallbackFunction, baton_sp);
1625     }
1626     
1627     return;
1628 }
1629
1630 bool
1631 ScriptInterpreterPython::ExportFunctionDefinitionToInterpreter (StringList &function_def)
1632 {
1633     // Convert StringList to one long, newline delimited, const char *.
1634     std::string function_def_string(function_def.CopyList());
1635
1636     return ExecuteMultipleLines (function_def_string.c_str(), ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false));
1637 }
1638
1639 bool
1640 ScriptInterpreterPython::GenerateFunction(const char *signature, const StringList &input)
1641 {
1642     int num_lines = input.GetSize ();
1643     if (num_lines == 0)
1644         return false;
1645     
1646     if (!signature || *signature == 0)
1647         return false;
1648
1649     StreamString sstr;
1650     StringList auto_generated_function;
1651     auto_generated_function.AppendString (signature);
1652     auto_generated_function.AppendString ("     global_dict = globals()");   // Grab the global dictionary
1653     auto_generated_function.AppendString ("     new_keys = internal_dict.keys()");    // Make a list of keys in the session dict
1654     auto_generated_function.AppendString ("     old_keys = global_dict.keys()"); // Save list of keys in global dict
1655     auto_generated_function.AppendString ("     global_dict.update (internal_dict)"); // Add the session dictionary to the 
1656     // global dictionary.
1657     
1658     // Wrap everything up inside the function, increasing the indentation.
1659     
1660     auto_generated_function.AppendString("     if True:");
1661     for (int i = 0; i < num_lines; ++i)
1662     {
1663         sstr.Clear ();
1664         sstr.Printf ("       %s", input.GetStringAtIndex (i));
1665         auto_generated_function.AppendString (sstr.GetData());
1666     }
1667     auto_generated_function.AppendString ("     for key in new_keys:");  // Iterate over all the keys from session dict
1668     auto_generated_function.AppendString ("         internal_dict[key] = global_dict[key]");  // Update session dict values
1669     auto_generated_function.AppendString ("         if key not in old_keys:");       // If key was not originally in global dict
1670     auto_generated_function.AppendString ("             del global_dict[key]");      //  ...then remove key/value from global dict
1671     
1672     // Verify that the results are valid Python.
1673     
1674     if (!ExportFunctionDefinitionToInterpreter (auto_generated_function))
1675         return false;
1676     
1677     return true;
1678
1679 }
1680
1681 bool
1682 ScriptInterpreterPython::GenerateTypeScriptFunction (StringList &user_input, std::string& output, void* name_token)
1683 {
1684     static uint32_t num_created_functions = 0;
1685     user_input.RemoveBlankLines ();
1686     StreamString sstr;
1687     
1688     // Check to see if we have any data; if not, just return.
1689     if (user_input.GetSize() == 0)
1690         return false;
1691     
1692     // Take what the user wrote, wrap it all up inside one big auto-generated Python function, passing in the
1693     // ValueObject as parameter to the function.
1694     
1695     std::string auto_generated_function_name(GenerateUniqueName("lldb_autogen_python_type_print_func", num_created_functions, name_token));
1696     sstr.Printf ("def %s (valobj, internal_dict):", auto_generated_function_name.c_str());
1697     
1698     if (!GenerateFunction(sstr.GetData(), user_input))
1699         return false;
1700
1701     // Store the name of the auto-generated function to be called.
1702     output.assign(auto_generated_function_name);
1703     return true;
1704 }
1705
1706 bool
1707 ScriptInterpreterPython::GenerateScriptAliasFunction (StringList &user_input, std::string &output)
1708 {
1709     static uint32_t num_created_functions = 0;
1710     user_input.RemoveBlankLines ();
1711     StreamString sstr;
1712     
1713     // Check to see if we have any data; if not, just return.
1714     if (user_input.GetSize() == 0)
1715         return false;
1716     
1717     std::string auto_generated_function_name(GenerateUniqueName("lldb_autogen_python_cmd_alias_func", num_created_functions));
1718
1719     sstr.Printf ("def %s (debugger, args, result, internal_dict):", auto_generated_function_name.c_str());
1720     
1721     if (!GenerateFunction(sstr.GetData(),user_input))
1722         return false;
1723     
1724     // Store the name of the auto-generated function to be called.
1725     output.assign(auto_generated_function_name);
1726     return true;
1727 }
1728
1729
1730 bool
1731 ScriptInterpreterPython::GenerateTypeSynthClass (StringList &user_input, std::string &output, void* name_token)
1732 {
1733     static uint32_t num_created_classes = 0;
1734     user_input.RemoveBlankLines ();
1735     int num_lines = user_input.GetSize ();
1736     StreamString sstr;
1737     
1738     // Check to see if we have any data; if not, just return.
1739     if (user_input.GetSize() == 0)
1740         return false;
1741     
1742     // Wrap all user input into a Python class
1743     
1744     std::string auto_generated_class_name(GenerateUniqueName("lldb_autogen_python_type_synth_class",num_created_classes,name_token));
1745     
1746     StringList auto_generated_class;
1747     
1748     // Create the function name & definition string.
1749     
1750     sstr.Printf ("class %s:", auto_generated_class_name.c_str());
1751     auto_generated_class.AppendString (sstr.GetData());
1752         
1753     // Wrap everything up inside the class, increasing the indentation.
1754     // we don't need to play any fancy indentation tricks here because there is no
1755     // surrounding code whose indentation we need to honor
1756     for (int i = 0; i < num_lines; ++i)
1757     {
1758         sstr.Clear ();
1759         sstr.Printf ("     %s", user_input.GetStringAtIndex (i));
1760         auto_generated_class.AppendString (sstr.GetData());
1761     }
1762     
1763     
1764     // Verify that the results are valid Python.
1765     // (even though the method is ExportFunctionDefinitionToInterpreter, a class will actually be exported)
1766     // (TODO: rename that method to ExportDefinitionToInterpreter)
1767     if (!ExportFunctionDefinitionToInterpreter (auto_generated_class))
1768         return false;
1769     
1770     // Store the name of the auto-generated class
1771     
1772     output.assign(auto_generated_class_name);
1773     return true;
1774 }
1775
1776 lldb::ScriptInterpreterObjectSP
1777 ScriptInterpreterPython::OSPlugin_CreatePluginObject (const char *class_name, lldb::ProcessSP process_sp)
1778 {
1779     if (class_name == NULL || class_name[0] == '\0')
1780         return lldb::ScriptInterpreterObjectSP();
1781     
1782     if (!process_sp)
1783         return lldb::ScriptInterpreterObjectSP();
1784         
1785     void* ret_val;
1786     
1787     {
1788         Locker py_lock(this,Locker::AcquireLock,Locker::FreeLock);
1789         ret_val = g_swig_create_os_plugin    (class_name,
1790                                               m_dictionary_name.c_str(),
1791                                               process_sp);
1792     }
1793     
1794     return MakeScriptObject(ret_val);
1795 }
1796
1797 lldb::ScriptInterpreterObjectSP
1798 ScriptInterpreterPython::OSPlugin_RegisterInfo (lldb::ScriptInterpreterObjectSP os_plugin_object_sp)
1799 {
1800     Locker py_lock(this,Locker::AcquireLock,Locker::FreeLock);
1801     
1802     static char callee_name[] = "get_register_info";
1803     
1804     if (!os_plugin_object_sp)
1805         return lldb::ScriptInterpreterObjectSP();
1806     
1807     PyObject* implementor = (PyObject*)os_plugin_object_sp->GetObject();
1808     
1809     if (implementor == NULL || implementor == Py_None)
1810         return lldb::ScriptInterpreterObjectSP();
1811     
1812     PyObject* pmeth  = PyObject_GetAttrString(implementor, callee_name);
1813     
1814     if (PyErr_Occurred())
1815     {
1816         PyErr_Clear();
1817     }
1818     
1819     if (pmeth == NULL || pmeth == Py_None)
1820     {
1821         Py_XDECREF(pmeth);
1822         return lldb::ScriptInterpreterObjectSP();
1823     }
1824     
1825     if (PyCallable_Check(pmeth) == 0)
1826     {
1827         if (PyErr_Occurred())
1828         {
1829             PyErr_Clear();
1830         }
1831         
1832         Py_XDECREF(pmeth);
1833         return lldb::ScriptInterpreterObjectSP();
1834     }
1835     
1836     if (PyErr_Occurred())
1837     {
1838         PyErr_Clear();
1839     }
1840     
1841     Py_XDECREF(pmeth);
1842     
1843     // right now we know this function exists and is callable..
1844     PyObject* py_return = PyObject_CallMethod(implementor, callee_name, NULL);
1845     
1846     // if it fails, print the error but otherwise go on
1847     if (PyErr_Occurred())
1848     {
1849         PyErr_Print();
1850         PyErr_Clear();
1851     }
1852     
1853     return MakeScriptObject(py_return);
1854 }
1855
1856 lldb::ScriptInterpreterObjectSP
1857 ScriptInterpreterPython::OSPlugin_ThreadsInfo (lldb::ScriptInterpreterObjectSP os_plugin_object_sp)
1858 {
1859     Locker py_lock(this,Locker::AcquireLock,Locker::FreeLock);
1860
1861     static char callee_name[] = "get_thread_info";
1862     
1863     if (!os_plugin_object_sp)
1864         return lldb::ScriptInterpreterObjectSP();
1865     
1866     PyObject* implementor = (PyObject*)os_plugin_object_sp->GetObject();
1867     
1868     if (implementor == NULL || implementor == Py_None)
1869         return lldb::ScriptInterpreterObjectSP();
1870     
1871     PyObject* pmeth  = PyObject_GetAttrString(implementor, callee_name);
1872     
1873     if (PyErr_Occurred())
1874     {
1875         PyErr_Clear();
1876     }
1877     
1878     if (pmeth == NULL || pmeth == Py_None)
1879     {
1880         Py_XDECREF(pmeth);
1881         return lldb::ScriptInterpreterObjectSP();
1882     }
1883     
1884     if (PyCallable_Check(pmeth) == 0)
1885     {
1886         if (PyErr_Occurred())
1887         {
1888             PyErr_Clear();
1889         }
1890         
1891         Py_XDECREF(pmeth);
1892         return lldb::ScriptInterpreterObjectSP();
1893     }
1894     
1895     if (PyErr_Occurred())
1896     {
1897         PyErr_Clear();
1898     }
1899     
1900     Py_XDECREF(pmeth);
1901     
1902     // right now we know this function exists and is callable..
1903     PyObject* py_return = PyObject_CallMethod(implementor, callee_name, NULL);
1904     
1905     // if it fails, print the error but otherwise go on
1906     if (PyErr_Occurred())
1907     {
1908         PyErr_Print();
1909         PyErr_Clear();
1910     }
1911     
1912     return MakeScriptObject(py_return);
1913 }
1914
1915 // GetPythonValueFormatString provides a system independent type safe way to
1916 // convert a variable's type into a python value format. Python value formats
1917 // are defined in terms of builtin C types and could change from system to
1918 // as the underlying typedef for uint* types, size_t, off_t and other values
1919 // change.
1920
1921 template <typename T>
1922 const char *GetPythonValueFormatString(T t)
1923 {
1924     assert(!"Unhandled type passed to GetPythonValueFormatString(T), make a specialization of GetPythonValueFormatString() to support this type.");
1925     return NULL;
1926 }
1927 template <> const char *GetPythonValueFormatString (char *)             { return "s"; }
1928 template <> const char *GetPythonValueFormatString (char)               { return "b"; }
1929 template <> const char *GetPythonValueFormatString (unsigned char)      { return "B"; }
1930 template <> const char *GetPythonValueFormatString (short)              { return "h"; }
1931 template <> const char *GetPythonValueFormatString (unsigned short)     { return "H"; }
1932 template <> const char *GetPythonValueFormatString (int)                { return "i"; }
1933 template <> const char *GetPythonValueFormatString (unsigned int)       { return "I"; }
1934 template <> const char *GetPythonValueFormatString (long)               { return "l"; }
1935 template <> const char *GetPythonValueFormatString (unsigned long)      { return "k"; }
1936 template <> const char *GetPythonValueFormatString (long long)          { return "L"; }
1937 template <> const char *GetPythonValueFormatString (unsigned long long) { return "K"; }
1938 template <> const char *GetPythonValueFormatString (float t)            { return "f"; }
1939 template <> const char *GetPythonValueFormatString (double t)           { return "d"; }
1940
1941 lldb::ScriptInterpreterObjectSP
1942 ScriptInterpreterPython::OSPlugin_RegisterContextData (lldb::ScriptInterpreterObjectSP os_plugin_object_sp,
1943                                                        lldb::tid_t tid)
1944 {
1945     Locker py_lock(this,Locker::AcquireLock,Locker::FreeLock);
1946
1947     static char callee_name[] = "get_register_data";
1948     static char *param_format = const_cast<char *>(GetPythonValueFormatString(tid));
1949     
1950     if (!os_plugin_object_sp)
1951         return lldb::ScriptInterpreterObjectSP();
1952     
1953     PyObject* implementor = (PyObject*)os_plugin_object_sp->GetObject();
1954     
1955     if (implementor == NULL || implementor == Py_None)
1956         return lldb::ScriptInterpreterObjectSP();
1957
1958     PyObject* pmeth  = PyObject_GetAttrString(implementor, callee_name);
1959     
1960     if (PyErr_Occurred())
1961     {
1962         PyErr_Clear();
1963     }
1964     
1965     if (pmeth == NULL || pmeth == Py_None)
1966     {
1967         Py_XDECREF(pmeth);
1968         return lldb::ScriptInterpreterObjectSP();
1969     }
1970     
1971     if (PyCallable_Check(pmeth) == 0)
1972     {
1973         if (PyErr_Occurred())
1974         {
1975             PyErr_Clear();
1976         }
1977         
1978         Py_XDECREF(pmeth);
1979         return lldb::ScriptInterpreterObjectSP();
1980     }
1981     
1982     if (PyErr_Occurred())
1983     {
1984         PyErr_Clear();
1985     }
1986     
1987     Py_XDECREF(pmeth);
1988     
1989     // right now we know this function exists and is callable..
1990     PyObject* py_return = PyObject_CallMethod(implementor, callee_name, param_format, tid);
1991
1992     // if it fails, print the error but otherwise go on
1993     if (PyErr_Occurred())
1994     {
1995         PyErr_Print();
1996         PyErr_Clear();
1997     }
1998     
1999     return MakeScriptObject(py_return);
2000 }
2001
2002 lldb::ScriptInterpreterObjectSP
2003 ScriptInterpreterPython::OSPlugin_CreateThread (lldb::ScriptInterpreterObjectSP os_plugin_object_sp,
2004                                                 lldb::tid_t tid,
2005                                                 lldb::addr_t context)
2006 {
2007     Locker py_lock(this,Locker::AcquireLock,Locker::FreeLock);
2008     
2009     static char callee_name[] = "create_thread";
2010     std::string param_format;
2011     param_format += GetPythonValueFormatString(tid);
2012     param_format += GetPythonValueFormatString(context);
2013     
2014     if (!os_plugin_object_sp)
2015         return lldb::ScriptInterpreterObjectSP();
2016     
2017     PyObject* implementor = (PyObject*)os_plugin_object_sp->GetObject();
2018     
2019     if (implementor == NULL || implementor == Py_None)
2020         return lldb::ScriptInterpreterObjectSP();
2021     
2022     PyObject* pmeth  = PyObject_GetAttrString(implementor, callee_name);
2023     
2024     if (PyErr_Occurred())
2025     {
2026         PyErr_Clear();
2027     }
2028     
2029     if (pmeth == NULL || pmeth == Py_None)
2030     {
2031         Py_XDECREF(pmeth);
2032         return lldb::ScriptInterpreterObjectSP();
2033     }
2034     
2035     if (PyCallable_Check(pmeth) == 0)
2036     {
2037         if (PyErr_Occurred())
2038         {
2039             PyErr_Clear();
2040         }
2041         
2042         Py_XDECREF(pmeth);
2043         return lldb::ScriptInterpreterObjectSP();
2044     }
2045     
2046     if (PyErr_Occurred())
2047     {
2048         PyErr_Clear();
2049     }
2050     
2051     Py_XDECREF(pmeth);
2052     
2053     // right now we know this function exists and is callable..
2054     PyObject* py_return = PyObject_CallMethod(implementor, callee_name, &param_format[0], tid, context);
2055     
2056     // if it fails, print the error but otherwise go on
2057     if (PyErr_Occurred())
2058     {
2059         PyErr_Print();
2060         PyErr_Clear();
2061     }
2062     
2063     return MakeScriptObject(py_return);
2064 }
2065
2066 lldb::ScriptInterpreterObjectSP
2067 ScriptInterpreterPython::CreateSyntheticScriptedProvider (const char *class_name,
2068                                                           lldb::ValueObjectSP valobj)
2069 {
2070     if (class_name == NULL || class_name[0] == '\0')
2071         return lldb::ScriptInterpreterObjectSP();
2072     
2073     if (!valobj.get())
2074         return lldb::ScriptInterpreterObjectSP();
2075     
2076     ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
2077     Target *target = exe_ctx.GetTargetPtr();
2078     
2079     if (!target)
2080         return lldb::ScriptInterpreterObjectSP();
2081     
2082     Debugger &debugger = target->GetDebugger();
2083     ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter();
2084     ScriptInterpreterPython *python_interpreter = (ScriptInterpreterPython *) script_interpreter;
2085     
2086     if (!script_interpreter)
2087         return lldb::ScriptInterpreterObjectSP();
2088     
2089     void* ret_val;
2090
2091     {
2092         Locker py_lock(this);
2093         ret_val = g_swig_synthetic_script (class_name,
2094                                            python_interpreter->m_dictionary_name.c_str(),
2095                                            valobj);
2096     }
2097     
2098     return MakeScriptObject(ret_val);
2099 }
2100
2101 bool
2102 ScriptInterpreterPython::GenerateTypeScriptFunction (const char* oneliner, std::string& output, void* name_token)
2103 {
2104     StringList input;
2105     input.SplitIntoLines(oneliner, strlen(oneliner));
2106     return GenerateTypeScriptFunction(input, output, name_token);
2107 }
2108
2109 bool
2110 ScriptInterpreterPython::GenerateTypeSynthClass (const char* oneliner, std::string& output, void* name_token)
2111 {
2112     StringList input;
2113     input.SplitIntoLines(oneliner, strlen(oneliner));
2114     return GenerateTypeSynthClass(input, output, name_token);
2115 }
2116
2117
2118 bool
2119 ScriptInterpreterPython::GenerateBreakpointCommandCallbackData (StringList &user_input, std::string& output)
2120 {
2121     static uint32_t num_created_functions = 0;
2122     user_input.RemoveBlankLines ();
2123     StreamString sstr;
2124
2125     if (user_input.GetSize() == 0)
2126         return false;
2127
2128     std::string auto_generated_function_name(GenerateUniqueName("lldb_autogen_python_bp_callback_func_",num_created_functions));
2129     sstr.Printf ("def %s (frame, bp_loc, internal_dict):", auto_generated_function_name.c_str());
2130     
2131     if (!GenerateFunction(sstr.GetData(), user_input))
2132         return false;
2133     
2134     // Store the name of the auto-generated function to be called.
2135     output.assign(auto_generated_function_name);
2136     return true;
2137 }
2138
2139 bool
2140 ScriptInterpreterPython::GenerateWatchpointCommandCallbackData (StringList &user_input, std::string& output)
2141 {
2142     static uint32_t num_created_functions = 0;
2143     user_input.RemoveBlankLines ();
2144     StreamString sstr;
2145
2146     if (user_input.GetSize() == 0)
2147         return false;
2148
2149     std::string auto_generated_function_name(GenerateUniqueName("lldb_autogen_python_wp_callback_func_",num_created_functions));
2150     sstr.Printf ("def %s (frame, wp, internal_dict):", auto_generated_function_name.c_str());
2151     
2152     if (!GenerateFunction(sstr.GetData(), user_input))
2153         return false;
2154     
2155     // Store the name of the auto-generated function to be called.
2156     output.assign(auto_generated_function_name);
2157     return true;
2158 }
2159
2160 bool
2161 ScriptInterpreterPython::GetScriptedSummary (const char *python_function_name,
2162                                              lldb::ValueObjectSP valobj,
2163                                              lldb::ScriptInterpreterObjectSP& callee_wrapper_sp,
2164                                              std::string& retval)
2165 {
2166     
2167     Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
2168     
2169     if (!valobj.get())
2170     {
2171         retval.assign("<no object>");
2172         return false;
2173     }
2174         
2175     void* old_callee = (callee_wrapper_sp ? callee_wrapper_sp->GetObject() : NULL);
2176     void* new_callee = old_callee;
2177     
2178     bool ret_val;
2179     if (python_function_name 
2180         && *python_function_name)
2181     {
2182         {
2183             Locker py_lock(this);
2184             {
2185             Timer scoped_timer ("g_swig_typescript_callback","g_swig_typescript_callback");
2186             ret_val = g_swig_typescript_callback (python_function_name,
2187                                                   FindSessionDictionary(m_dictionary_name.c_str()),
2188                                                   valobj,
2189                                                   &new_callee,
2190                                                   retval);
2191             }
2192         }
2193     }
2194     else
2195     {
2196         retval.assign("<no function name>");
2197         return false;
2198     }
2199     
2200     if (new_callee && old_callee != new_callee)
2201         callee_wrapper_sp = MakeScriptObject(new_callee);
2202     
2203     return ret_val;
2204     
2205 }
2206
2207 bool
2208 ScriptInterpreterPython::BreakpointCallbackFunction 
2209 (
2210     void *baton,
2211     StoppointCallbackContext *context,
2212     user_id_t break_id,
2213     user_id_t break_loc_id
2214 )
2215 {
2216     BreakpointOptions::CommandData *bp_option_data = (BreakpointOptions::CommandData *) baton;
2217     const char *python_function_name = bp_option_data->script_source.c_str();
2218
2219     if (!context)
2220         return true;
2221         
2222     ExecutionContext exe_ctx (context->exe_ctx_ref);
2223     Target *target = exe_ctx.GetTargetPtr();
2224     
2225     if (!target)
2226         return true;
2227         
2228     Debugger &debugger = target->GetDebugger();
2229     ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter();
2230     ScriptInterpreterPython *python_interpreter = (ScriptInterpreterPython *) script_interpreter;
2231     
2232     if (!script_interpreter)
2233         return true;
2234     
2235     if (python_function_name != NULL 
2236         && python_function_name[0] != '\0')
2237     {
2238         const StackFrameSP stop_frame_sp (exe_ctx.GetFrameSP());
2239         BreakpointSP breakpoint_sp = target->GetBreakpointByID (break_id);
2240         if (breakpoint_sp)
2241         {
2242             const BreakpointLocationSP bp_loc_sp (breakpoint_sp->FindLocationByID (break_loc_id));
2243
2244             if (stop_frame_sp && bp_loc_sp)
2245             {
2246                 bool ret_val = true;
2247                 {
2248                     Locker py_lock(python_interpreter);
2249                     ret_val = g_swig_breakpoint_callback (python_function_name, 
2250                                                           python_interpreter->m_dictionary_name.c_str(),
2251                                                           stop_frame_sp, 
2252                                                           bp_loc_sp);
2253                 }
2254                 return ret_val;
2255             }
2256         }
2257     }
2258     // We currently always true so we stop in case anything goes wrong when
2259     // trying to call the script function
2260     return true;
2261 }
2262
2263 bool
2264 ScriptInterpreterPython::WatchpointCallbackFunction 
2265 (
2266     void *baton,
2267     StoppointCallbackContext *context,
2268     user_id_t watch_id
2269 )
2270 {
2271     WatchpointOptions::CommandData *wp_option_data = (WatchpointOptions::CommandData *) baton;
2272     const char *python_function_name = wp_option_data->script_source.c_str();
2273
2274     if (!context)
2275         return true;
2276         
2277     ExecutionContext exe_ctx (context->exe_ctx_ref);
2278     Target *target = exe_ctx.GetTargetPtr();
2279     
2280     if (!target)
2281         return true;
2282         
2283     Debugger &debugger = target->GetDebugger();
2284     ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter();
2285     ScriptInterpreterPython *python_interpreter = (ScriptInterpreterPython *) script_interpreter;
2286     
2287     if (!script_interpreter)
2288         return true;
2289     
2290     if (python_function_name != NULL 
2291         && python_function_name[0] != '\0')
2292     {
2293         const StackFrameSP stop_frame_sp (exe_ctx.GetFrameSP());
2294         WatchpointSP wp_sp = target->GetWatchpointList().FindByID (watch_id);
2295         if (wp_sp)
2296         {
2297             if (stop_frame_sp && wp_sp)
2298             {
2299                 bool ret_val = true;
2300                 {
2301                     Locker py_lock(python_interpreter);
2302                     ret_val = g_swig_watchpoint_callback (python_function_name, 
2303                                                           python_interpreter->m_dictionary_name.c_str(),
2304                                                           stop_frame_sp, 
2305                                                           wp_sp);
2306                 }
2307                 return ret_val;
2308             }
2309         }
2310     }
2311     // We currently always true so we stop in case anything goes wrong when
2312     // trying to call the script function
2313     return true;
2314 }
2315
2316 lldb::thread_result_t
2317 ScriptInterpreterPython::RunEmbeddedPythonInterpreter (lldb::thread_arg_t baton)
2318 {
2319     ScriptInterpreterPython *script_interpreter = (ScriptInterpreterPython *) baton;
2320     
2321     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
2322     
2323     if (log)
2324         log->Printf ("%p ScriptInterpreterPython::RunEmbeddedPythonInterpreter () thread starting...", baton);
2325     
2326     char error_str[1024];
2327     const char *pty_slave_name = script_interpreter->m_embedded_python_pty.GetSlaveName (error_str, sizeof (error_str));
2328
2329     if (pty_slave_name != NULL)
2330     {
2331         StreamString run_string;
2332
2333         // Ensure we have the GIL before running any Python code.
2334         // Since we're only running a few one-liners and then dropping to the interpreter (which will release the GIL when needed),
2335         // we can just release the GIL after finishing our work.
2336         // If finer-grained locking is desirable, we can lock and unlock the GIL only when calling a python function.
2337         Locker locker(script_interpreter,
2338                       ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | ScriptInterpreterPython::Locker::InitGlobals,
2339                       ScriptInterpreterPython::Locker::FreeAcquiredLock | ScriptInterpreterPython::Locker::TearDownSession);
2340
2341         run_string.Printf ("run_one_line (%s, 'save_stderr = sys.stderr')", script_interpreter->m_dictionary_name.c_str());
2342         PyRun_SimpleString (run_string.GetData());
2343         run_string.Clear ();
2344         
2345         run_string.Printf ("run_one_line (%s, 'sys.stderr = sys.stdout')", script_interpreter->m_dictionary_name.c_str());
2346         PyRun_SimpleString (run_string.GetData());
2347         run_string.Clear ();
2348         
2349         run_string.Printf ("run_one_line (%s, 'save_stdin = sys.stdin')", script_interpreter->m_dictionary_name.c_str());
2350         PyRun_SimpleString (run_string.GetData());
2351         run_string.Clear ();
2352         
2353         run_string.Printf ("run_one_line (%s, \"sys.stdin = open ('%s', 'r')\")", script_interpreter->m_dictionary_name.c_str(),
2354                            pty_slave_name);
2355         PyRun_SimpleString (run_string.GetData());
2356         run_string.Clear ();
2357
2358         // The following call drops into the embedded interpreter loop and stays there until the
2359         // user chooses to exit from the Python interpreter.
2360         // This embedded interpreter will, as any Python code that performs I/O, unlock the GIL before
2361         // a system call that can hang, and lock it when the syscall has returned.
2362
2363         // We need to surround the call to the embedded interpreter with calls to PyGILState_Ensure and 
2364         // PyGILState_Release (using the Locker above). This is because Python has a global lock which must be held whenever we want
2365         // to touch any Python objects. Otherwise, if the user calls Python code, the interpreter state will be off,
2366         // and things could hang (it's happened before).
2367
2368         run_string.Printf ("run_python_interpreter (%s)", script_interpreter->m_dictionary_name.c_str());
2369         PyRun_SimpleString (run_string.GetData());
2370         run_string.Clear ();
2371
2372         run_string.Printf ("run_one_line (%s, 'sys.stdin = save_stdin')", script_interpreter->m_dictionary_name.c_str());
2373         PyRun_SimpleString (run_string.GetData());
2374         run_string.Clear();
2375
2376         run_string.Printf ("run_one_line (%s, 'sys.stderr = save_stderr')", script_interpreter->m_dictionary_name.c_str());
2377         PyRun_SimpleString (run_string.GetData());
2378         run_string.Clear();
2379     }
2380     
2381     if (script_interpreter->m_embedded_python_input_reader_sp)
2382         script_interpreter->m_embedded_python_input_reader_sp->SetIsDone (true);
2383     
2384     script_interpreter->m_embedded_python_pty.CloseSlaveFileDescriptor();
2385
2386     log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT);
2387     if (log)
2388         log->Printf ("%p ScriptInterpreterPython::RunEmbeddedPythonInterpreter () thread exiting...", baton);
2389     
2390
2391     // Clean up the input reader and make the debugger pop it off the stack.
2392     Debugger &debugger = script_interpreter->GetCommandInterpreter().GetDebugger();
2393     const InputReaderSP reader_sp = script_interpreter->m_embedded_python_input_reader_sp;
2394     if (reader_sp)
2395     {
2396         debugger.PopInputReader (reader_sp);
2397         script_interpreter->m_embedded_python_input_reader_sp.reset();
2398     }
2399     
2400     return NULL;
2401 }
2402
2403 lldb::thread_result_t
2404 ScriptInterpreterPython::PythonInputReaderManager::RunPythonInputReader (lldb::thread_arg_t baton)
2405 {
2406     ScriptInterpreterPython *script_interpreter = (ScriptInterpreterPython *) baton;
2407
2408     const InputReaderSP reader_sp = script_interpreter->m_embedded_thread_input_reader_sp;
2409     
2410     if (reader_sp)
2411         reader_sp->WaitOnReaderIsDone();
2412     
2413     return NULL;
2414 }
2415
2416 size_t
2417 ScriptInterpreterPython::CalculateNumChildren (const lldb::ScriptInterpreterObjectSP& implementor_sp)
2418 {
2419     if (!implementor_sp)
2420         return 0;
2421     
2422     void* implementor = implementor_sp->GetObject();
2423     
2424     if (!implementor)
2425         return 0;
2426     
2427     if (!g_swig_calc_children)
2428         return 0;
2429
2430     uint32_t ret_val = 0;
2431     
2432     {
2433         Locker py_lock(this);
2434         ret_val = g_swig_calc_children (implementor);
2435     }
2436     
2437     return ret_val;
2438 }
2439
2440 lldb::ValueObjectSP
2441 ScriptInterpreterPython::GetChildAtIndex (const lldb::ScriptInterpreterObjectSP& implementor_sp, uint32_t idx)
2442 {
2443     if (!implementor_sp)
2444         return lldb::ValueObjectSP();
2445     
2446     void* implementor = implementor_sp->GetObject();
2447     
2448     if (!implementor)
2449         return lldb::ValueObjectSP();
2450     
2451     if (!g_swig_get_child_index || !g_swig_cast_to_sbvalue)
2452         return lldb::ValueObjectSP();
2453     
2454     void* child_ptr = NULL;
2455     lldb::SBValue* value_sb = NULL;
2456     lldb::ValueObjectSP ret_val;
2457     
2458     {
2459         Locker py_lock(this);
2460         child_ptr = g_swig_get_child_index (implementor,idx);
2461         if (child_ptr != NULL && child_ptr != Py_None)
2462         {
2463             value_sb = (lldb::SBValue*)g_swig_cast_to_sbvalue(child_ptr);
2464             if (value_sb == NULL)
2465                 Py_XDECREF(child_ptr);
2466             else
2467                 ret_val = value_sb->GetSP();
2468         }
2469         else
2470         {
2471             Py_XDECREF(child_ptr);
2472         }
2473     }
2474     
2475     return ret_val;
2476 }
2477
2478 int
2479 ScriptInterpreterPython::GetIndexOfChildWithName (const lldb::ScriptInterpreterObjectSP& implementor_sp, const char* child_name)
2480 {
2481     if (!implementor_sp)
2482         return UINT32_MAX;
2483     
2484     void* implementor = implementor_sp->GetObject();
2485     
2486     if (!implementor)
2487         return UINT32_MAX;
2488     
2489     if (!g_swig_get_index_child)
2490         return UINT32_MAX;
2491     
2492     int ret_val = UINT32_MAX;
2493     
2494     {
2495         Locker py_lock(this);
2496         ret_val = g_swig_get_index_child (implementor, child_name);
2497     }
2498     
2499     return ret_val;
2500 }
2501
2502 bool
2503 ScriptInterpreterPython::UpdateSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor_sp)
2504 {
2505     bool ret_val = false;
2506     
2507     if (!implementor_sp)
2508         return ret_val;
2509     
2510     void* implementor = implementor_sp->GetObject();
2511     
2512     if (!implementor)
2513         return ret_val;
2514     
2515     if (!g_swig_update_provider)
2516         return ret_val;
2517     
2518     {
2519         Locker py_lock(this);
2520         ret_val = g_swig_update_provider (implementor);
2521     }
2522     
2523     return ret_val;
2524 }
2525
2526 bool
2527 ScriptInterpreterPython::MightHaveChildrenSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor_sp)
2528 {
2529     bool ret_val = false;
2530     
2531     if (!implementor_sp)
2532         return ret_val;
2533     
2534     void* implementor = implementor_sp->GetObject();
2535     
2536     if (!implementor)
2537         return ret_val;
2538     
2539     if (!g_swig_mighthavechildren_provider)
2540         return ret_val;
2541     
2542     {
2543         Locker py_lock(this);
2544         ret_val = g_swig_mighthavechildren_provider (implementor);
2545     }
2546     
2547     return ret_val;
2548 }
2549
2550 static std::string
2551 ReadPythonBacktrace (PyObject* py_backtrace)
2552 {
2553     PyObject* traceback_module = NULL,
2554     *stringIO_module = NULL,
2555     *stringIO_builder = NULL,
2556     *stringIO_buffer = NULL,
2557     *printTB = NULL,
2558     *printTB_args = NULL,
2559     *printTB_result = NULL,
2560     *stringIO_getvalue = NULL,
2561     *printTB_string = NULL;
2562
2563     std::string retval("backtrace unavailable");
2564     
2565     if (py_backtrace && py_backtrace != Py_None)
2566     {
2567         traceback_module = PyImport_ImportModule("traceback");
2568         stringIO_module = PyImport_ImportModule("StringIO");
2569         
2570         if (traceback_module && traceback_module != Py_None && stringIO_module && stringIO_module != Py_None)
2571         {
2572             stringIO_builder = PyObject_GetAttrString(stringIO_module, "StringIO");
2573             if (stringIO_builder && stringIO_builder != Py_None)
2574             {
2575                 stringIO_buffer = PyObject_CallObject(stringIO_builder, NULL);
2576                 if (stringIO_buffer && stringIO_buffer != Py_None)
2577                 {
2578                     printTB = PyObject_GetAttrString(traceback_module, "print_tb");
2579                     if (printTB && printTB != Py_None)
2580                     {
2581                         printTB_args = Py_BuildValue("OOO",py_backtrace,Py_None,stringIO_buffer);
2582                         printTB_result = PyObject_CallObject(printTB, printTB_args);
2583                         stringIO_getvalue = PyObject_GetAttrString(stringIO_buffer, "getvalue");
2584                         if (stringIO_getvalue && stringIO_getvalue != Py_None)
2585                         {
2586                             printTB_string = PyObject_CallObject (stringIO_getvalue,NULL);
2587                             if (printTB_string && printTB_string != Py_None && PyString_Check(printTB_string))
2588                                 retval.assign(PyString_AsString(printTB_string));
2589                         }
2590                     }
2591                 }
2592             }
2593         }
2594     }
2595     Py_XDECREF(traceback_module);
2596     Py_XDECREF(stringIO_module);
2597     Py_XDECREF(stringIO_builder);
2598     Py_XDECREF(stringIO_buffer);
2599     Py_XDECREF(printTB);
2600     Py_XDECREF(printTB_args);
2601     Py_XDECREF(printTB_result);
2602     Py_XDECREF(stringIO_getvalue);
2603     Py_XDECREF(printTB_string);
2604     return retval;
2605 }
2606
2607 bool
2608 ScriptInterpreterPython::RunScriptFormatKeyword (const char* impl_function,
2609                                                  Process* process,
2610                                                  std::string& output,
2611                                                  Error& error)
2612 {
2613     bool ret_val;
2614     if (!process)
2615     {
2616         error.SetErrorString("no process");
2617         return false;
2618     }
2619     if (!impl_function || !impl_function[0])
2620     {
2621         error.SetErrorString("no function to execute");
2622         return false;
2623     }
2624     if (!g_swig_run_script_keyword_process)
2625     {
2626         error.SetErrorString("internal helper function missing");
2627         return false;
2628     }
2629     {
2630         ProcessSP process_sp(process->shared_from_this());
2631         Locker py_lock(this);
2632         ret_val = g_swig_run_script_keyword_process (impl_function, m_dictionary_name.c_str(), process_sp, output);
2633         if (!ret_val)
2634             error.SetErrorString("python script evaluation failed");
2635     }
2636     return ret_val;
2637 }
2638
2639 bool
2640 ScriptInterpreterPython::RunScriptFormatKeyword (const char* impl_function,
2641                                                  Thread* thread,
2642                                                  std::string& output,
2643                                                  Error& error)
2644 {
2645     bool ret_val;
2646     if (!thread)
2647     {
2648         error.SetErrorString("no thread");
2649         return false;
2650     }
2651     if (!impl_function || !impl_function[0])
2652     {
2653         error.SetErrorString("no function to execute");
2654         return false;
2655     }
2656     if (!g_swig_run_script_keyword_thread)
2657     {
2658         error.SetErrorString("internal helper function missing");
2659         return false;
2660     }
2661     {
2662         ThreadSP thread_sp(thread->shared_from_this());
2663         Locker py_lock(this);
2664         ret_val = g_swig_run_script_keyword_thread (impl_function, m_dictionary_name.c_str(), thread_sp, output);
2665         if (!ret_val)
2666             error.SetErrorString("python script evaluation failed");
2667     }
2668     return ret_val;
2669 }
2670
2671 bool
2672 ScriptInterpreterPython::RunScriptFormatKeyword (const char* impl_function,
2673                                                  Target* target,
2674                                                  std::string& output,
2675                                                  Error& error)
2676 {
2677     bool ret_val;
2678     if (!target)
2679     {
2680         error.SetErrorString("no thread");
2681         return false;
2682     }
2683     if (!impl_function || !impl_function[0])
2684     {
2685         error.SetErrorString("no function to execute");
2686         return false;
2687     }
2688     if (!g_swig_run_script_keyword_target)
2689     {
2690         error.SetErrorString("internal helper function missing");
2691         return false;
2692     }
2693     {
2694         TargetSP target_sp(target->shared_from_this());
2695         Locker py_lock(this);
2696         ret_val = g_swig_run_script_keyword_target (impl_function, m_dictionary_name.c_str(), target_sp, output);
2697         if (!ret_val)
2698             error.SetErrorString("python script evaluation failed");
2699     }
2700     return ret_val;
2701 }
2702
2703 bool
2704 ScriptInterpreterPython::RunScriptFormatKeyword (const char* impl_function,
2705                                                  StackFrame* frame,
2706                                                  std::string& output,
2707                                                  Error& error)
2708 {
2709     bool ret_val;
2710     if (!frame)
2711     {
2712         error.SetErrorString("no frame");
2713         return false;
2714     }
2715     if (!impl_function || !impl_function[0])
2716     {
2717         error.SetErrorString("no function to execute");
2718         return false;
2719     }
2720     if (!g_swig_run_script_keyword_frame)
2721     {
2722         error.SetErrorString("internal helper function missing");
2723         return false;
2724     }
2725     {
2726         StackFrameSP frame_sp(frame->shared_from_this());
2727         Locker py_lock(this);
2728         ret_val = g_swig_run_script_keyword_frame (impl_function, m_dictionary_name.c_str(), frame_sp, output);
2729         if (!ret_val)
2730             error.SetErrorString("python script evaluation failed");
2731     }
2732     return ret_val;
2733 }
2734
2735 uint64_t replace_all(std::string& str, const std::string& oldStr, const std::string& newStr)
2736 {
2737     size_t pos = 0;
2738     uint64_t matches = 0;
2739     while((pos = str.find(oldStr, pos)) != std::string::npos)
2740     {
2741         matches++;
2742         str.replace(pos, oldStr.length(), newStr);
2743         pos += newStr.length();
2744     }
2745     return matches;
2746 }
2747
2748 bool
2749 ScriptInterpreterPython::LoadScriptingModule (const char* pathname,
2750                                               bool can_reload,
2751                                               bool init_session,
2752                                               lldb_private::Error& error)
2753 {
2754     if (!pathname || !pathname[0])
2755     {
2756         error.SetErrorString("invalid pathname");
2757         return false;
2758     }
2759     
2760     if (!g_swig_call_module_init)
2761     {
2762         error.SetErrorString("internal helper function missing");
2763         return false;
2764     }
2765     
2766     lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
2767
2768     {
2769         FileSpec target_file(pathname, true);
2770         std::string basename(target_file.GetFilename().GetCString());
2771         
2772         StreamString command_stream;
2773
2774         // Before executing Pyton code, lock the GIL.
2775         Locker py_lock (this,
2776                         Locker::AcquireLock      | (init_session ? Locker::InitSession     : 0),
2777                         Locker::FreeAcquiredLock | (init_session ? Locker::TearDownSession : 0));
2778         
2779         if (target_file.GetFileType() == FileSpec::eFileTypeInvalid ||
2780             target_file.GetFileType() == FileSpec::eFileTypeUnknown)
2781         {
2782             // if not a valid file of any sort, check if it might be a filename still
2783             // dot can't be used but / and \ can, and if either is found, reject
2784             if (strchr(pathname,'\\') || strchr(pathname,'/'))
2785             {
2786                 error.SetErrorString("invalid pathname");
2787                 return false;
2788             }
2789             basename = pathname; // not a filename, probably a package of some sort, let it go through
2790         }
2791         else if (target_file.GetFileType() == FileSpec::eFileTypeDirectory ||
2792                  target_file.GetFileType() == FileSpec::eFileTypeRegular ||
2793                  target_file.GetFileType() == FileSpec::eFileTypeSymbolicLink)
2794         {
2795             std::string directory(target_file.GetDirectory().GetCString());
2796             replace_all(directory,"'","\\'");
2797             
2798             // now make sure that Python has "directory" in the search path
2799             StreamString command_stream;
2800             command_stream.Printf("if not (sys.path.__contains__('%s')):\n    sys.path.insert(1,'%s');\n\n",
2801                                   directory.c_str(),
2802                                   directory.c_str());
2803             bool syspath_retval = ExecuteMultipleLines(command_stream.GetData(), ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false).SetSetLLDBGlobals(false));
2804             if (!syspath_retval)
2805             {
2806                 error.SetErrorString("Python sys.path handling failed");
2807                 return false;
2808             }
2809             
2810             // strip .py or .pyc extension
2811             ConstString extension = target_file.GetFileNameExtension();
2812             if (extension)
2813             {
2814                 if (::strcmp(extension.GetCString(), "py") == 0)
2815                     basename.resize(basename.length()-3);
2816                 else if(::strcmp(extension.GetCString(), "pyc") == 0)
2817                     basename.resize(basename.length()-4);
2818             }
2819         }
2820         else
2821         {
2822             error.SetErrorString("no known way to import this module specification");
2823             return false;
2824         }
2825         
2826         // check if the module is already import-ed
2827         command_stream.Clear();
2828         command_stream.Printf("sys.modules.__contains__('%s')",basename.c_str());
2829         bool does_contain = false;
2830         int refcount = 0;
2831         // this call will succeed if the module was ever imported in any Debugger in the lifetime of the process
2832         // in which this LLDB framework is living
2833         bool was_imported_globally = (ExecuteOneLineWithReturn(command_stream.GetData(),
2834                                                                ScriptInterpreterPython::eScriptReturnTypeBool,
2835                                                                &does_contain,
2836                                                                ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false).SetSetLLDBGlobals(false)) && does_contain);
2837         // this call will fail if the module was not imported in this Debugger before
2838         command_stream.Clear();
2839         command_stream.Printf("sys.getrefcount(%s)",basename.c_str());
2840         bool was_imported_locally = (ExecuteOneLineWithReturn(command_stream.GetData(),
2841                                                               ScriptInterpreterPython::eScriptReturnTypeInt,
2842                                                               &refcount,
2843                                                               ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false).SetSetLLDBGlobals(false)) && refcount > 0);
2844         
2845         bool was_imported = (was_imported_globally || was_imported_locally);
2846         
2847         if (was_imported == true && can_reload == false)
2848         {
2849             error.SetErrorString("module already imported");
2850             return false;
2851         }
2852
2853         // now actually do the import
2854         command_stream.Clear();
2855         
2856         if (was_imported)
2857         {
2858             if (!was_imported_locally)
2859                 command_stream.Printf("import %s ; reload(%s)",basename.c_str(),basename.c_str());
2860             else
2861                 command_stream.Printf("reload(%s)",basename.c_str());
2862         }
2863         else
2864             command_stream.Printf("import %s",basename.c_str());
2865         
2866         bool import_retval = ExecuteMultipleLines(command_stream.GetData(), ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false).SetSetLLDBGlobals(false).SetMaskoutErrors(false));
2867         PyObject* py_error = PyErr_Occurred(); // per Python docs: "you do not need to Py_DECREF()" the return of this function
2868         
2869         if (py_error || !import_retval) // check for failure of the import
2870         {
2871             if (py_error) // if we have a Python error..
2872             {
2873                 PyObject *type = NULL,*value = NULL,*traceback = NULL;
2874                 PyErr_Fetch (&type,&value,&traceback);
2875
2876                 if (PyErr_GivenExceptionMatches (py_error, PyExc_ImportError)) // and it is an ImportError
2877                 {
2878                     if (value && value != Py_None)
2879                         error.SetErrorString(PyString_AsString(PyObject_Str(value)));
2880                     else
2881                         error.SetErrorString("ImportError raised by imported module");
2882                 }
2883                 else // any other error
2884                 {
2885                     // get the backtrace
2886                     std::string bt = ReadPythonBacktrace(traceback);
2887                     
2888                     if (value && value != Py_None)
2889                         error.SetErrorStringWithFormat("Python error raised while importing module: %s - traceback: %s", PyString_AsString(PyObject_Str(value)),bt.c_str());
2890                     else
2891                         error.SetErrorStringWithFormat("Python raised an error while importing module - traceback: %s",bt.c_str());
2892                 }
2893                 
2894                 Py_XDECREF(type);
2895                 Py_XDECREF(value);
2896                 Py_XDECREF(traceback);
2897             }
2898             else // we failed but have no error to explain why
2899             {
2900                 error.SetErrorString("unknown error while importing module");
2901             }
2902             
2903             // anyway, clear the error indicator and return false
2904             PyErr_Clear();
2905             return false;
2906         }
2907         
2908         // if we are here, everything worked
2909         // call __lldb_init_module(debugger,dict)
2910         if (!g_swig_call_module_init (basename.c_str(),
2911                                       m_dictionary_name.c_str(),
2912                                       debugger_sp))
2913         {
2914             error.SetErrorString("calling __lldb_init_module failed");
2915             return false;
2916         }
2917         return true;
2918     }
2919 }
2920
2921 lldb::ScriptInterpreterObjectSP
2922 ScriptInterpreterPython::MakeScriptObject (void* object)
2923 {
2924     return lldb::ScriptInterpreterObjectSP(new ScriptInterpreterPythonObject(object));
2925 }
2926
2927 ScriptInterpreterPython::SynchronicityHandler::SynchronicityHandler (lldb::DebuggerSP debugger_sp,
2928                                                                      ScriptedCommandSynchronicity synchro) :
2929     m_debugger_sp(debugger_sp),
2930     m_synch_wanted(synchro),
2931     m_old_asynch(debugger_sp->GetAsyncExecution())
2932 {
2933     if (m_synch_wanted == eScriptedCommandSynchronicitySynchronous)
2934         m_debugger_sp->SetAsyncExecution(false);
2935     else if (m_synch_wanted == eScriptedCommandSynchronicityAsynchronous)
2936         m_debugger_sp->SetAsyncExecution(true);
2937 }
2938
2939 ScriptInterpreterPython::SynchronicityHandler::~SynchronicityHandler()
2940 {
2941     if (m_synch_wanted != eScriptedCommandSynchronicityCurrentValue)
2942         m_debugger_sp->SetAsyncExecution(m_old_asynch);
2943 }
2944
2945 bool
2946 ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function,
2947                                                const char* args,
2948                                                ScriptedCommandSynchronicity synchronicity,
2949                                                lldb_private::CommandReturnObject& cmd_retobj,
2950                                                Error& error)
2951 {
2952     if (!impl_function)
2953     {
2954         error.SetErrorString("no function to execute");
2955         return false;
2956     }
2957     
2958     if (!g_swig_call_command)
2959     {
2960         error.SetErrorString("no helper function to run scripted commands");
2961         return false;
2962     }
2963     
2964     lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
2965     
2966     if (!debugger_sp.get())
2967     {
2968         error.SetErrorString("invalid Debugger pointer");
2969         return false;
2970     }
2971     
2972     bool ret_val = false;
2973     
2974     std::string err_msg;
2975     
2976     {
2977         Locker py_lock(this,
2978                        Locker::AcquireLock | Locker::InitSession,
2979                        Locker::FreeLock    | Locker::TearDownSession);
2980         
2981         SynchronicityHandler synch_handler(debugger_sp,
2982                                            synchronicity);
2983         
2984         // we need to save the thread state when we first start the command
2985         // because we might decide to interrupt it while some action is taking
2986         // place outside of Python (e.g. printing to screen, waiting for the network, ...)
2987         // in that case, _PyThreadState_Current will be NULL - and we would be unable
2988         // to set the asynchronous exception - not a desirable situation
2989         m_command_thread_state = _PyThreadState_Current;
2990         
2991         PythonInputReaderManager py_input(this);
2992         
2993         ret_val = g_swig_call_command       (impl_function,
2994                                              m_dictionary_name.c_str(),
2995                                              debugger_sp,
2996                                              args,
2997                                              cmd_retobj);
2998     }
2999     
3000     if (!ret_val)
3001         error.SetErrorString("unable to execute script function");
3002     else
3003         error.Clear();
3004     
3005     return ret_val;
3006 }
3007
3008 // in Python, a special attribute __doc__ contains the docstring
3009 // for an object (function, method, class, ...) if any is defined
3010 // Otherwise, the attribute's value is None
3011 bool
3012 ScriptInterpreterPython::GetDocumentationForItem(const char* item, std::string& dest)
3013 {
3014         dest.clear();
3015         if (!item || !*item)
3016                 return false;
3017     std::string command(item);
3018     command += ".__doc__";
3019     
3020     char* result_ptr = NULL; // Python is going to point this to valid data if ExecuteOneLineWithReturn returns successfully
3021     
3022     if (ExecuteOneLineWithReturn (command.c_str(),
3023                                   ScriptInterpreter::eScriptReturnTypeCharStrOrNone,
3024                                   &result_ptr,
3025                                   ScriptInterpreter::ExecuteScriptOptions().SetEnableIO(false)))
3026     {
3027         if (result_ptr)
3028             dest.assign(result_ptr);
3029         return true;
3030     }
3031     else
3032     {
3033         StreamString str_stream;
3034         str_stream.Printf("Function %s was not found. Containing module might be missing.",item);
3035         dest.assign(str_stream.GetData());
3036         return false;
3037     }
3038 }
3039
3040 std::unique_ptr<ScriptInterpreterLocker>
3041 ScriptInterpreterPython::AcquireInterpreterLock ()
3042 {
3043     std::unique_ptr<ScriptInterpreterLocker> py_lock(new Locker(this,
3044                                                               Locker::AcquireLock | Locker::InitSession,
3045                                                               Locker::FreeLock | Locker::TearDownSession));
3046     return py_lock;
3047 }
3048
3049 void
3050 ScriptInterpreterPython::InitializeInterpreter (SWIGInitCallback python_swig_init_callback)
3051 {
3052     g_swig_init_callback = python_swig_init_callback;
3053     g_swig_breakpoint_callback = LLDBSwigPythonBreakpointCallbackFunction;
3054     g_swig_watchpoint_callback = LLDBSwigPythonWatchpointCallbackFunction;
3055     g_swig_typescript_callback = LLDBSwigPythonCallTypeScript;
3056     g_swig_synthetic_script = LLDBSwigPythonCreateSyntheticProvider;
3057     g_swig_calc_children = LLDBSwigPython_CalculateNumChildren;
3058     g_swig_get_child_index = LLDBSwigPython_GetChildAtIndex;
3059     g_swig_get_index_child = LLDBSwigPython_GetIndexOfChildWithName;
3060     g_swig_cast_to_sbvalue = LLDBSWIGPython_CastPyObjectToSBValue;
3061     g_swig_update_provider = LLDBSwigPython_UpdateSynthProviderInstance;
3062     g_swig_mighthavechildren_provider = LLDBSwigPython_MightHaveChildrenSynthProviderInstance;
3063     g_swig_call_command = LLDBSwigPythonCallCommand;
3064     g_swig_call_module_init = LLDBSwigPythonCallModuleInit;
3065     g_swig_create_os_plugin = LLDBSWIGPythonCreateOSPlugin;
3066     g_swig_run_script_keyword_process = LLDBSWIGPythonRunScriptKeywordProcess;
3067     g_swig_run_script_keyword_thread = LLDBSWIGPythonRunScriptKeywordThread;
3068     g_swig_run_script_keyword_target = LLDBSWIGPythonRunScriptKeywordTarget;
3069     g_swig_run_script_keyword_frame = LLDBSWIGPythonRunScriptKeywordFrame;
3070 }
3071
3072 void
3073 ScriptInterpreterPython::InitializePrivate ()
3074 {
3075     Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
3076
3077     // Python will muck with STDIN terminal state, so save off any current TTY
3078     // settings so we can restore them.
3079     TerminalState stdin_tty_state;
3080     stdin_tty_state.Save(STDIN_FILENO, false);
3081
3082     PyGILState_STATE gstate;
3083     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT | LIBLLDB_LOG_VERBOSE));
3084     bool threads_already_initialized = false;
3085     if (PyEval_ThreadsInitialized ()) {
3086         gstate = PyGILState_Ensure ();
3087         if (log)
3088             log->Printf("Ensured PyGILState. Previous state = %slocked\n", gstate == PyGILState_UNLOCKED ? "un" : "");
3089         threads_already_initialized = true;
3090     } else {
3091         // InitThreads acquires the GIL if it hasn't been called before.
3092         PyEval_InitThreads ();
3093     }
3094     Py_InitializeEx (0);
3095
3096     // Initialize SWIG after setting up python
3097     assert (g_swig_init_callback != NULL);
3098     g_swig_init_callback ();
3099
3100     // Update the path python uses to search for modules to include the current directory.
3101
3102     PyRun_SimpleString ("import sys");
3103     PyRun_SimpleString ("sys.path.append ('.')");
3104
3105     // Find the module that owns this code and use that path we get to
3106     // set the sys.path appropriately.
3107
3108     FileSpec file_spec;
3109     char python_dir_path[PATH_MAX];
3110     if (Host::GetLLDBPath (ePathTypePythonDir, file_spec))
3111     {
3112         std::string python_path("sys.path.insert(0,\"");
3113         size_t orig_len = python_path.length();
3114         if (file_spec.GetPath(python_dir_path, sizeof (python_dir_path)))
3115         {
3116             python_path.append (python_dir_path);
3117             python_path.append ("\")");
3118             PyRun_SimpleString (python_path.c_str());
3119             python_path.resize (orig_len);
3120         }
3121         
3122         if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, file_spec))
3123         {
3124             if (file_spec.GetPath(python_dir_path, sizeof (python_dir_path)))
3125             {
3126                 python_path.append (python_dir_path);
3127                 python_path.append ("\")");
3128                 PyRun_SimpleString (python_path.c_str());
3129                 python_path.resize (orig_len);
3130             }
3131         }
3132     }
3133
3134     PyRun_SimpleString ("sys.dont_write_bytecode = 1; import lldb.embedded_interpreter; from lldb.embedded_interpreter import run_python_interpreter; from lldb.embedded_interpreter import run_one_line; from termios import *");
3135
3136     if (threads_already_initialized) {
3137         if (log)
3138             log->Printf("Releasing PyGILState. Returning to state = %slocked\n", gstate == PyGILState_UNLOCKED ? "un" : "");
3139         PyGILState_Release (gstate);
3140     } else {
3141         // We initialized the threads in this function, just unlock the GIL.
3142         PyEval_SaveThread();
3143     }
3144
3145     stdin_tty_state.Restore();
3146 }
3147
3148 //void
3149 //ScriptInterpreterPython::Terminate ()
3150 //{
3151 //    // We are intentionally NOT calling Py_Finalize here (this would be the logical place to call it).  Calling
3152 //    // Py_Finalize here causes test suite runs to seg fault:  The test suite runs in Python.  It registers 
3153 //    // SBDebugger::Terminate to be called 'at_exit'.  When the test suite Python harness finishes up, it calls 
3154 //    // Py_Finalize, which calls all the 'at_exit' registered functions.  SBDebugger::Terminate calls Debugger::Terminate,
3155 //    // which calls lldb::Terminate, which calls ScriptInterpreter::Terminate, which calls 
3156 //    // ScriptInterpreterPython::Terminate.  So if we call Py_Finalize here, we end up with Py_Finalize being called from
3157 //    // within Py_Finalize, which results in a seg fault.
3158 //    //
3159 //    // Since this function only gets called when lldb is shutting down and going away anyway, the fact that we don't
3160 //    // actually call Py_Finalize should not cause any problems (everything should shut down/go away anyway when the
3161 //    // process exits).
3162 //    //
3163 ////    Py_Finalize ();
3164 //}
3165
3166 #endif // #ifdef LLDB_DISABLE_PYTHON