Home | History | Annotate | Download | only in Interpreter
      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
   3167