From 8d1fb843274175022b21f348d69a91f3573e1514 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Fri, 26 Apr 2019 17:58:19 +0000 Subject: [PATCH] [ScriptInterpreter] Pass the debugger instead of the command interpreter As discussed in D61090, there's no good reason for the script interpreter to depend on the command interpreter. When looking at the code, it becomes clear that we mostly use the command interpreter as a way to access the debugger. Hence, it makes more sense to just pass that to the script interpreter directly. This is part 1 out of 2. I have another patch in the pipeline that changes the ownership of the script interpreter to the debugger as well, but I didn't get around to finish that today. Differential revision: https://reviews.llvm.org/D61172 llvm-svn: 359330 --- lldb/include/lldb/Core/PluginManager.h | 2 +- .../lldb/Interpreter/ScriptInterpreter.h | 9 +-- lldb/include/lldb/lldb-private-interfaces.h | 2 +- lldb/source/Core/PluginManager.cpp | 9 +-- .../source/Interpreter/CommandInterpreter.cpp | 2 +- lldb/source/Interpreter/ScriptInterpreter.cpp | 8 +-- .../None/ScriptInterpreterNone.cpp | 13 ++--- .../None/ScriptInterpreterNone.h | 5 +- .../Python/ScriptInterpreterPython.cpp | 55 +++++++++---------- .../Python/ScriptInterpreterPython.h | 4 +- .../Python/ScriptInterpreterPythonImpl.h | 5 +- 11 files changed, 50 insertions(+), 64 deletions(-) diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 37e287f2fcbd5..10185f3ad1406 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -263,7 +263,7 @@ class PluginManager { static lldb::ScriptInterpreterSP GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, - CommandInterpreter &interpreter); + Debugger &debugger); // StructuredDataPlugin diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 24188a7edf287..aff4da4e77f30 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -52,8 +52,7 @@ class ScriptInterpreter : public PluginInterface { eScriptReturnTypeOpaqueObject } ScriptReturnType; - ScriptInterpreter(CommandInterpreter &interpreter, - lldb::ScriptLanguage script_lang); + ScriptInterpreter(Debugger &debugger, lldb::ScriptLanguage script_lang); ~ScriptInterpreter() override; @@ -247,7 +246,7 @@ class ScriptInterpreter : public PluginInterface { lldb::BreakpointSP &bkpt_sp) { return StructuredData::GenericSP(); } - + virtual bool ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP implementor_sp, SymbolContext *sym_ctx) @@ -460,8 +459,6 @@ class ScriptInterpreter : public PluginInterface { int GetMasterFileDescriptor(); - CommandInterpreter &GetCommandInterpreter(); - static std::string LanguageToString(lldb::ScriptLanguage language); static lldb::ScriptLanguage StringToLanguage(const llvm::StringRef &string); @@ -471,7 +468,7 @@ class ScriptInterpreter : public PluginInterface { lldb::ScriptLanguage GetLanguage() { return m_script_lang; } protected: - CommandInterpreter &m_interpreter; + Debugger &m_debugger; lldb::ScriptLanguage m_script_lang; }; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 2c76889246675..57b25675bb250 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -66,7 +66,7 @@ typedef lldb::ProcessSP (*ProcessCreateInstance)( lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path); typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)( - CommandInterpreter &interpreter); + Debugger &debugger); typedef SymbolFile *(*SymbolFileCreateInstance)(ObjectFile *obj_file); typedef SymbolVendor *(*SymbolVendorCreateInstance)( const lldb::ModuleSP &module_sp, diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index f69610cf24614..cf940dd703494 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -1516,8 +1516,9 @@ PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) { return nullptr; } -lldb::ScriptInterpreterSP PluginManager::GetScriptInterpreterForLanguage( - lldb::ScriptLanguage script_lang, CommandInterpreter &interpreter) { +lldb::ScriptInterpreterSP +PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, + Debugger &debugger) { std::lock_guard guard(GetScriptInterpreterMutex()); ScriptInterpreterInstances &instances = GetScriptInterpreterInstances(); @@ -1528,12 +1529,12 @@ lldb::ScriptInterpreterSP PluginManager::GetScriptInterpreterForLanguage( none_instance = pos->create_callback; if (script_lang == pos->language) - return pos->create_callback(interpreter); + return pos->create_callback(debugger); } // If we didn't find one, return the ScriptInterpreter for the null language. assert(none_instance != nullptr); - return none_instance(interpreter); + return none_instance(debugger); } #pragma mark - diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 782412334321b..84707156871d3 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -2507,7 +2507,7 @@ ScriptInterpreter *CommandInterpreter::GetScriptInterpreter(bool can_create) { return nullptr; lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage(); m_script_interpreter_sp = - PluginManager::GetScriptInterpreterForLanguage(script_lang, *this); + PluginManager::GetScriptInterpreterForLanguage(script_lang, m_debugger); } return m_script_interpreter_sp.get(); } diff --git a/lldb/source/Interpreter/ScriptInterpreter.cpp b/lldb/source/Interpreter/ScriptInterpreter.cpp index 52fd77e37397d..d04baec76e606 100644 --- a/lldb/source/Interpreter/ScriptInterpreter.cpp +++ b/lldb/source/Interpreter/ScriptInterpreter.cpp @@ -21,16 +21,12 @@ using namespace lldb; using namespace lldb_private; -ScriptInterpreter::ScriptInterpreter(CommandInterpreter &interpreter, +ScriptInterpreter::ScriptInterpreter(Debugger &debugger, lldb::ScriptLanguage script_lang) - : m_interpreter(interpreter), m_script_lang(script_lang) {} + : m_debugger(debugger), m_script_lang(script_lang) {} ScriptInterpreter::~ScriptInterpreter() {} -CommandInterpreter &ScriptInterpreter::GetCommandInterpreter() { - return m_interpreter; -} - void ScriptInterpreter::CollectDataForBreakpointCommandCallback( std::vector &bp_options_vec, CommandReturnObject &result) { diff --git a/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.cpp b/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.cpp index 8129af0b8338a..7b95983795530 100644 --- a/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.cpp @@ -10,7 +10,6 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/StreamFile.h" -#include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/StringList.h" @@ -21,21 +20,21 @@ using namespace lldb; using namespace lldb_private; -ScriptInterpreterNone::ScriptInterpreterNone(CommandInterpreter &interpreter) - : ScriptInterpreter(interpreter, eScriptLanguageNone) {} +ScriptInterpreterNone::ScriptInterpreterNone(Debugger &debugger) + : ScriptInterpreter(debugger, eScriptLanguageNone) {} ScriptInterpreterNone::~ScriptInterpreterNone() {} bool ScriptInterpreterNone::ExecuteOneLine(llvm::StringRef command, CommandReturnObject *, const ExecuteScriptOptions &) { - m_interpreter.GetDebugger().GetErrorFile()->PutCString( + m_debugger.GetErrorFile()->PutCString( "error: there is no embedded script interpreter in this mode.\n"); return false; } void ScriptInterpreterNone::ExecuteInterpreterLoop() { - m_interpreter.GetDebugger().GetErrorFile()->PutCString( + m_debugger.GetErrorFile()->PutCString( "error: there is no embedded script interpreter in this mode.\n"); } @@ -52,8 +51,8 @@ void ScriptInterpreterNone::Initialize() { void ScriptInterpreterNone::Terminate() {} lldb::ScriptInterpreterSP -ScriptInterpreterNone::CreateInstance(CommandInterpreter &interpreter) { - return std::make_shared(interpreter); +ScriptInterpreterNone::CreateInstance(Debugger &debugger) { + return std::make_shared(debugger); } lldb_private::ConstString ScriptInterpreterNone::GetPluginNameStatic() { diff --git a/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.h b/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.h index 23a8473daa91b..242065cc23e86 100644 --- a/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.h +++ b/lldb/source/Plugins/ScriptInterpreter/None/ScriptInterpreterNone.h @@ -15,7 +15,7 @@ namespace lldb_private { class ScriptInterpreterNone : public ScriptInterpreter { public: - ScriptInterpreterNone(CommandInterpreter &interpreter); + ScriptInterpreterNone(Debugger &debugger); ~ScriptInterpreterNone() override; @@ -30,8 +30,7 @@ class ScriptInterpreterNone : public ScriptInterpreter { static void Terminate(); - static lldb::ScriptInterpreterSP - CreateInstance(CommandInterpreter &interpreter); + static lldb::ScriptInterpreterSP CreateInstance(Debugger &debugger); static lldb_private::ConstString GetPluginNameStatic(); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index 0482cea955860..eabbdcc373a77 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -441,15 +441,13 @@ ScriptInterpreterPythonImpl::Locker::~Locker() { DoFreeLock(); } -ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl( - CommandInterpreter &interpreter) - : ScriptInterpreterPython(interpreter), m_saved_stdin(), m_saved_stdout(), +ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl(Debugger &debugger) + : ScriptInterpreterPython(debugger), m_saved_stdin(), m_saved_stdout(), m_saved_stderr(), m_main_module(), m_session_dict(PyInitialValue::Invalid), m_sys_module_dict(PyInitialValue::Invalid), m_run_one_line_function(), m_run_one_line_str_global(), - m_dictionary_name( - interpreter.GetDebugger().GetInstanceName().AsCString()), + m_dictionary_name(m_debugger.GetInstanceName().AsCString()), m_terminal_state(), m_active_io_handler(eIOHandlerNone), m_session_is_active(false), m_pty_slave_is_open(false), m_valid_session(true), m_lock_count(0), m_command_thread_state(nullptr) { @@ -495,8 +493,7 @@ ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl( run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64 "; pydoc.pager = pydoc.plainpager')", - m_dictionary_name.c_str(), - interpreter.GetDebugger().GetID()); + m_dictionary_name.c_str(), m_debugger.GetID()); PyRun_SimpleString(run_string.GetData()); } @@ -549,7 +546,7 @@ def function (frame, bp_loc, internal_dict): void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler, std::string &data) { io_handler.SetIsDone(true); - bool batch_mode = m_interpreter.GetBatchCommandMode(); + bool batch_mode = m_debugger.GetCommandInterpreter().GetBatchCommandMode(); switch (m_active_io_handler) { case eIOHandlerNone: @@ -608,8 +605,8 @@ void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler, } lldb::ScriptInterpreterSP -ScriptInterpreterPythonImpl::CreateInstance(CommandInterpreter &interpreter) { - return std::make_shared(interpreter); +ScriptInterpreterPythonImpl::CreateInstance(Debugger &debugger) { + return std::make_shared(debugger); } void ScriptInterpreterPythonImpl::ResetOutputFileHandle(FILE *fh) {} @@ -711,11 +708,10 @@ bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags, if (on_entry_flags & Locker::InitGlobals) { run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64, - m_dictionary_name.c_str(), - GetCommandInterpreter().GetDebugger().GetID()); + m_dictionary_name.c_str(), m_debugger.GetID()); run_string.Printf( "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", - GetCommandInterpreter().GetDebugger().GetID()); + m_debugger.GetID()); run_string.PutCString("; lldb.target = lldb.debugger.GetSelectedTarget()"); run_string.PutCString("; lldb.process = lldb.target.GetProcess()"); run_string.PutCString("; lldb.thread = lldb.process.GetSelectedThread ()"); @@ -725,11 +721,10 @@ bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags, // If we aren't initing the globals, we should still always set the // debugger (since that is always unique.) run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64, - m_dictionary_name.c_str(), - GetCommandInterpreter().GetDebugger().GetID()); + m_dictionary_name.c_str(), m_debugger.GetID()); run_string.Printf( "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", - GetCommandInterpreter().GetDebugger().GetID()); + m_debugger.GetID()); run_string.PutCString("')"); } @@ -746,8 +741,7 @@ bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags, lldb::StreamFileSP out_sp; lldb::StreamFileSP err_sp; if (!in_file.IsValid() || !out_file.IsValid() || !err_file.IsValid()) - m_interpreter.GetDebugger().AdoptTopIOHandlerFilesIfInvalid(in_sp, out_sp, - err_sp); + m_debugger.AdoptTopIOHandlerFilesIfInvalid(in_sp, out_sp, err_sp); if (on_entry_flags & Locker::NoSTDIN) { m_saved_stdin.Reset(); @@ -871,7 +865,7 @@ bool ScriptInterpreterPythonImpl::ExecuteOneLine( // another string to pass to PyRun_SimpleString messes up the escaping. So // we use the following more complicated method to pass the command string // directly down to Python. - Debugger &debugger = m_interpreter.GetDebugger(); + Debugger &debugger = m_debugger; StreamFileSP input_file_sp; StreamFileSP output_file_sp; @@ -1018,7 +1012,7 @@ void ScriptInterpreterPythonImpl::ExecuteInterpreterLoop() { static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); - Debugger &debugger = GetCommandInterpreter().GetDebugger(); + Debugger &debugger = m_debugger; // At the moment, the only time the debugger does not have an input file // handle is when this is called directly from Python, in which case it is @@ -1274,14 +1268,15 @@ void ScriptInterpreterPythonImpl::CollectDataForBreakpointCommandCallback( std::vector &bp_options_vec, CommandReturnObject &result) { m_active_io_handler = eIOHandlerBreakpoint; - m_interpreter.GetPythonCommandsFromIOHandler(" ", *this, true, - &bp_options_vec); + m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler( + " ", *this, true, &bp_options_vec); } void ScriptInterpreterPythonImpl::CollectDataForWatchpointCommandCallback( WatchpointOptions *wp_options, CommandReturnObject &result) { m_active_io_handler = eIOHandlerWatchpoint; - m_interpreter.GetPythonCommandsFromIOHandler(" ", *this, true, wp_options); + m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler( + " ", *this, true, wp_options); } void ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction( @@ -1290,8 +1285,9 @@ void ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction( std::string oneliner("return "); oneliner += function_name; oneliner += "(frame, bp_loc, internal_dict)"; - m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback( - bp_options, oneliner.c_str()); + m_debugger.GetCommandInterpreter() + .GetScriptInterpreter() + ->SetBreakpointCommandCallback(bp_options, oneliner.c_str()); } Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback( @@ -2109,8 +2105,7 @@ ScriptInterpreterPythonImpl::CreateSyntheticScriptedProvider( StructuredData::GenericSP ScriptInterpreterPythonImpl::CreateScriptCommandObject(const char *class_name) { - DebuggerSP debugger_sp( - GetCommandInterpreter().GetDebugger().shared_from_this()); + DebuggerSP debugger_sp(m_debugger.shared_from_this()); if (class_name == nullptr || class_name[0] == '\0') return StructuredData::GenericSP(); @@ -2718,7 +2713,7 @@ bool ScriptInterpreterPythonImpl::LoadScriptingModule( return false; } - lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this(); + lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this(); { FileSpec target_file(pathname); @@ -2912,7 +2907,7 @@ bool ScriptInterpreterPythonImpl::RunScriptBasedCommand( return false; } - lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this(); + lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this(); lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx)); if (!debugger_sp.get()) { @@ -2956,7 +2951,7 @@ bool ScriptInterpreterPythonImpl::RunScriptBasedCommand( return false; } - lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this(); + lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this(); lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx)); if (!debugger_sp.get()) { diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h index 6a07be86071ea..24941ec774521 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h @@ -36,8 +36,8 @@ class ScriptInterpreterPython : public ScriptInterpreter, } }; - ScriptInterpreterPython(CommandInterpreter &interpreter) - : ScriptInterpreter(interpreter, lldb::eScriptLanguagePython), + ScriptInterpreterPython(Debugger &debugger) + : ScriptInterpreter(debugger, lldb::eScriptLanguagePython), IOHandlerDelegateMultiline("DONE") {} static void Initialize(); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h index 7a0cf7403d4e1..a9993c4068a2b 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h @@ -29,7 +29,7 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython { public: friend class IOHandlerPythonInterpreter; - ScriptInterpreterPythonImpl(CommandInterpreter &interpreter); + ScriptInterpreterPythonImpl(Debugger &debugger); ~ScriptInterpreterPythonImpl() override; @@ -273,8 +273,7 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython { void IOHandlerInputComplete(IOHandler &io_handler, std::string &data) override; - static lldb::ScriptInterpreterSP - CreateInstance(CommandInterpreter &interpreter); + static lldb::ScriptInterpreterSP CreateInstance(Debugger &debugger); // PluginInterface protocol lldb_private::ConstString GetPluginName() override;