diff options
Diffstat (limited to 'source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp')
| -rw-r--r-- | source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp | 177 | 
1 files changed, 168 insertions, 9 deletions
diff --git a/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index b8eb36a2baf6..41cb443d4f1e 100644 --- a/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -27,6 +27,7 @@  #include <string>  #include "lldb/API/SBValue.h" +#include "lldb/API/SBFrame.h"  #include "lldb/Breakpoint/BreakpointLocation.h"  #include "lldb/Breakpoint/StoppointCallbackContext.h"  #include "lldb/Breakpoint/WatchpointOptions.h" @@ -91,6 +92,10 @@ static ScriptInterpreterPython::SWIGPythonCallModuleInit      g_swig_call_module_init = nullptr;  static ScriptInterpreterPython::SWIGPythonCreateOSPlugin      g_swig_create_os_plugin = nullptr; +static ScriptInterpreterPython::SWIGPythonCreateFrameRecognizer +    g_swig_create_frame_recognizer = nullptr; +static ScriptInterpreterPython::SWIGPythonGetRecognizedArguments +    g_swig_get_recognized_arguments = nullptr;  static ScriptInterpreterPython::SWIGPythonScriptKeyword_Process      g_swig_run_script_keyword_process = nullptr;  static ScriptInterpreterPython::SWIGPythonScriptKeyword_Thread @@ -107,6 +112,10 @@ static ScriptInterpreterPython::SWIGPythonCreateScriptedThreadPlan      g_swig_thread_plan_script = nullptr;  static ScriptInterpreterPython::SWIGPythonCallThreadPlan      g_swig_call_thread_plan = nullptr; +static ScriptInterpreterPython::SWIGPythonCreateScriptedBreakpointResolver +    g_swig_bkpt_resolver_script = nullptr; +static ScriptInterpreterPython::SWIGPythonCallBreakpointResolver +    g_swig_call_bkpt_resolver = nullptr;  static bool g_initialized = false; @@ -128,6 +137,9 @@ public:      InitializePythonHome(); +    // Register _lldb as a built-in module. +    PyImport_AppendInittab("_lldb", g_swig_init_callback); +  // Python < 3.2 and Python >= 3.2 reversed the ordering requirements for  // calling `Py_Initialize` and `PyEval_InitThreads`.  < 3.2 requires that you  // call `PyEval_InitThreads` first, and >= 3.2 requires that you call it last. @@ -196,7 +208,7 @@ ScriptInterpreterPython::Locker::Locker(ScriptInterpreterPython *py_interpreter,        m_python_interpreter(py_interpreter) {    DoAcquireLock();    if ((on_entry & InitSession) == InitSession) { -    if (DoInitSession(on_entry, in, out, err) == false) { +    if (!DoInitSession(on_entry, in, out, err)) {        // Don't teardown the session if we didn't init it.        m_teardown_session = false;      } @@ -817,11 +829,15 @@ bool ScriptInterpreterPython::ExecuteOneLine(                                                   error_file_sp);      } else {        input_file_sp.reset(new StreamFile()); -      input_file_sp->GetFile().Open(FileSystem::DEV_NULL, -                                    File::eOpenOptionRead); +      FileSystem::Instance().Open(input_file_sp->GetFile(), +                                  FileSpec(FileSystem::DEV_NULL), +                                  File::eOpenOptionRead); +        output_file_sp.reset(new StreamFile()); -      output_file_sp->GetFile().Open(FileSystem::DEV_NULL, -                                     File::eOpenOptionWrite); +      FileSystem::Instance().Open(output_file_sp->GetFile(), +                                  FileSpec(FileSystem::DEV_NULL), +                                  File::eOpenOptionWrite); +        error_file_sp = output_file_sp;      } @@ -1491,6 +1507,62 @@ bool ScriptInterpreterPython::GenerateTypeSynthClass(StringList &user_input,    return true;  } +StructuredData::GenericSP ScriptInterpreterPython::CreateFrameRecognizer( +    const char *class_name) { +  if (class_name == nullptr || class_name[0] == '\0') +    return StructuredData::GenericSP(); + +  void *ret_val; + +  { +    Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, +                   Locker::FreeLock); +    ret_val = +        g_swig_create_frame_recognizer(class_name, m_dictionary_name.c_str()); +  } + +  return StructuredData::GenericSP(new StructuredPythonObject(ret_val)); +} + +lldb::ValueObjectListSP ScriptInterpreterPython::GetRecognizedArguments( +    const StructuredData::ObjectSP &os_plugin_object_sp, +    lldb::StackFrameSP frame_sp) { +  Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock); + +  if (!os_plugin_object_sp) return ValueObjectListSP(); + +  StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric(); +  if (!generic) return nullptr; + +  PythonObject implementor(PyRefType::Borrowed, +                           (PyObject *)generic->GetValue()); + +  if (!implementor.IsAllocated()) return ValueObjectListSP(); + +  PythonObject py_return( +      PyRefType::Owned, +      (PyObject *)g_swig_get_recognized_arguments(implementor.get(), frame_sp)); + +  // if it fails, print the error but otherwise go on +  if (PyErr_Occurred()) { +    PyErr_Print(); +    PyErr_Clear(); +  } +  if (py_return.get()) { +    PythonList result_list(PyRefType::Borrowed, py_return.get()); +    ValueObjectListSP result = ValueObjectListSP(new ValueObjectList()); +    for (size_t i = 0; i < result_list.GetSize(); i++) { +      PyObject *item = result_list.GetItemAtIndex(i).get(); +      lldb::SBValue *sb_value_ptr = +          (lldb::SBValue *)g_swig_cast_to_sbvalue(item); +      auto valobj_sp = g_swig_get_valobj_sp_from_sbvalue(sb_value_ptr); +      if (valobj_sp) result->Append(valobj_sp); +    } +    return result; +  } +  return ValueObjectListSP(); +} +  StructuredData::GenericSP ScriptInterpreterPython::OSPlugin_CreatePluginObject(      const char *class_name, lldb::ProcessSP process_sp) {    if (class_name == nullptr || class_name[0] == '\0') @@ -1868,10 +1940,88 @@ lldb::StateType ScriptInterpreterPython::ScriptedThreadPlanGetRunState(      return lldb::eStateRunning;  } +StructuredData::GenericSP +ScriptInterpreterPython::CreateScriptedBreakpointResolver( +    const char *class_name, +    StructuredDataImpl *args_data, +    lldb::BreakpointSP &bkpt_sp) { +     +  if (class_name == nullptr || class_name[0] == '\0') +    return StructuredData::GenericSP(); + +  if (!bkpt_sp.get()) +    return StructuredData::GenericSP(); + +  Debugger &debugger = bkpt_sp->GetTarget().GetDebugger(); +  ScriptInterpreter *script_interpreter = +      debugger.GetCommandInterpreter().GetScriptInterpreter(); +  ScriptInterpreterPython *python_interpreter = +      static_cast<ScriptInterpreterPython *>(script_interpreter); + +  if (!script_interpreter) +    return StructuredData::GenericSP(); + +  void *ret_val; + +  { +    Locker py_lock(this, +                   Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN); + +    ret_val = g_swig_bkpt_resolver_script( +        class_name, python_interpreter->m_dictionary_name.c_str(), +        args_data, bkpt_sp); +  } + +  return StructuredData::GenericSP(new StructuredPythonObject(ret_val)); +} + +bool +ScriptInterpreterPython::ScriptedBreakpointResolverSearchCallback( +    StructuredData::GenericSP implementor_sp, +    SymbolContext *sym_ctx) { +  bool should_continue = false; +   +  if (implementor_sp) { +    Locker py_lock(this, +                   Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN); +    should_continue +        = g_swig_call_bkpt_resolver(implementor_sp->GetValue(), "__callback__", +                                    sym_ctx); +    if (PyErr_Occurred()) { +      PyErr_Print(); +      PyErr_Clear(); +    } +  } +  return should_continue; +} + +lldb::SearchDepth +ScriptInterpreterPython::ScriptedBreakpointResolverSearchDepth( +    StructuredData::GenericSP implementor_sp) { +  int depth_as_int = lldb::eSearchDepthModule; +  if (implementor_sp) { +    Locker py_lock(this, +                   Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN); +    depth_as_int +        = g_swig_call_bkpt_resolver(implementor_sp->GetValue(), "__get_depth__", nullptr); +    if (PyErr_Occurred()) { +      PyErr_Print(); +      PyErr_Clear(); +    } +  } +  if (depth_as_int == lldb::eSearchDepthInvalid) +    return lldb::eSearchDepthModule; + +  if (depth_as_int <= lldb::kLastSearchDepthKind) +    return (lldb::SearchDepth) depth_as_int; +  else +    return lldb::eSearchDepthModule; +} +  StructuredData::ObjectSP  ScriptInterpreterPython::LoadPluginModule(const FileSpec &file_spec,                                            lldb_private::Status &error) { -  if (!file_spec.Exists()) { +  if (!FileSystem::Instance().Exists(file_spec)) {      error.SetErrorString("no such file");      return StructuredData::ObjectSP();    } @@ -2603,7 +2753,8 @@ bool ScriptInterpreterPython::LoadScriptingModule(    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();    { -    FileSpec target_file(pathname, true); +    FileSpec target_file(pathname); +    FileSystem::Instance().Resolve(target_file);      std::string basename(target_file.GetFilename().GetCString());      StreamString command_stream; @@ -2687,7 +2838,7 @@ bool ScriptInterpreterPython::LoadScriptingModule(      bool was_imported = (was_imported_globally || was_imported_locally); -    if (was_imported == true && can_reload == false) { +    if (was_imported && !can_reload) {        error.SetErrorString("module already imported");        return false;      } @@ -3100,6 +3251,8 @@ void ScriptInterpreterPython::InitializeInterpreter(      SWIGPythonCallCommandObject swig_call_command_object,      SWIGPythonCallModuleInit swig_call_module_init,      SWIGPythonCreateOSPlugin swig_create_os_plugin, +    SWIGPythonCreateFrameRecognizer swig_create_frame_recognizer, +    SWIGPythonGetRecognizedArguments swig_get_recognized_arguments,      SWIGPythonScriptKeyword_Process swig_run_script_keyword_process,      SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread,      SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, @@ -3107,7 +3260,9 @@ void ScriptInterpreterPython::InitializeInterpreter(      SWIGPythonScriptKeyword_Value swig_run_script_keyword_value,      SWIGPython_GetDynamicSetting swig_plugin_get,      SWIGPythonCreateScriptedThreadPlan swig_thread_plan_script, -    SWIGPythonCallThreadPlan swig_call_thread_plan) { +    SWIGPythonCallThreadPlan swig_call_thread_plan, +    SWIGPythonCreateScriptedBreakpointResolver swig_bkpt_resolver_script, +    SWIGPythonCallBreakpointResolver swig_call_bkpt_resolver) {    g_swig_init_callback = swig_init_callback;    g_swig_breakpoint_callback = swig_breakpoint_callback;    g_swig_watchpoint_callback = swig_watchpoint_callback; @@ -3126,6 +3281,8 @@ void ScriptInterpreterPython::InitializeInterpreter(    g_swig_call_command_object = swig_call_command_object;    g_swig_call_module_init = swig_call_module_init;    g_swig_create_os_plugin = swig_create_os_plugin; +  g_swig_create_frame_recognizer = swig_create_frame_recognizer; +  g_swig_get_recognized_arguments = swig_get_recognized_arguments;    g_swig_run_script_keyword_process = swig_run_script_keyword_process;    g_swig_run_script_keyword_thread = swig_run_script_keyword_thread;    g_swig_run_script_keyword_target = swig_run_script_keyword_target; @@ -3134,6 +3291,8 @@ void ScriptInterpreterPython::InitializeInterpreter(    g_swig_plugin_get = swig_plugin_get;    g_swig_thread_plan_script = swig_thread_plan_script;    g_swig_call_thread_plan = swig_call_thread_plan; +  g_swig_bkpt_resolver_script = swig_bkpt_resolver_script; +  g_swig_call_bkpt_resolver = swig_call_bkpt_resolver;  }  void ScriptInterpreterPython::InitializePrivate() {  | 
