[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
This commit is contained in:
Jonas Devlieghere 2019-04-26 17:58:19 +00:00
parent 1d30f0c93e
commit 8d1fb84327
11 changed files with 50 additions and 64 deletions

View File

@ -263,7 +263,7 @@ public:
static lldb::ScriptInterpreterSP static lldb::ScriptInterpreterSP
GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
CommandInterpreter &interpreter); Debugger &debugger);
// StructuredDataPlugin // StructuredDataPlugin

View File

@ -52,8 +52,7 @@ public:
eScriptReturnTypeOpaqueObject eScriptReturnTypeOpaqueObject
} ScriptReturnType; } ScriptReturnType;
ScriptInterpreter(CommandInterpreter &interpreter, ScriptInterpreter(Debugger &debugger, lldb::ScriptLanguage script_lang);
lldb::ScriptLanguage script_lang);
~ScriptInterpreter() override; ~ScriptInterpreter() override;
@ -247,7 +246,7 @@ public:
lldb::BreakpointSP &bkpt_sp) { lldb::BreakpointSP &bkpt_sp) {
return StructuredData::GenericSP(); return StructuredData::GenericSP();
} }
virtual bool virtual bool
ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP implementor_sp, ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP implementor_sp,
SymbolContext *sym_ctx) SymbolContext *sym_ctx)
@ -460,8 +459,6 @@ public:
int GetMasterFileDescriptor(); int GetMasterFileDescriptor();
CommandInterpreter &GetCommandInterpreter();
static std::string LanguageToString(lldb::ScriptLanguage language); static std::string LanguageToString(lldb::ScriptLanguage language);
static lldb::ScriptLanguage StringToLanguage(const llvm::StringRef &string); static lldb::ScriptLanguage StringToLanguage(const llvm::StringRef &string);
@ -471,7 +468,7 @@ public:
lldb::ScriptLanguage GetLanguage() { return m_script_lang; } lldb::ScriptLanguage GetLanguage() { return m_script_lang; }
protected: protected:
CommandInterpreter &m_interpreter; Debugger &m_debugger;
lldb::ScriptLanguage m_script_lang; lldb::ScriptLanguage m_script_lang;
}; };

View File

@ -66,7 +66,7 @@ typedef lldb::ProcessSP (*ProcessCreateInstance)(
lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
const FileSpec *crash_file_path); const FileSpec *crash_file_path);
typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)( typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)(
CommandInterpreter &interpreter); Debugger &debugger);
typedef SymbolFile *(*SymbolFileCreateInstance)(ObjectFile *obj_file); typedef SymbolFile *(*SymbolFileCreateInstance)(ObjectFile *obj_file);
typedef SymbolVendor *(*SymbolVendorCreateInstance)( typedef SymbolVendor *(*SymbolVendorCreateInstance)(
const lldb::ModuleSP &module_sp, const lldb::ModuleSP &module_sp,

View File

@ -1516,8 +1516,9 @@ PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
return nullptr; return nullptr;
} }
lldb::ScriptInterpreterSP PluginManager::GetScriptInterpreterForLanguage( lldb::ScriptInterpreterSP
lldb::ScriptLanguage script_lang, CommandInterpreter &interpreter) { PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
Debugger &debugger) {
std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex()); std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex());
ScriptInterpreterInstances &instances = GetScriptInterpreterInstances(); ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
@ -1528,12 +1529,12 @@ lldb::ScriptInterpreterSP PluginManager::GetScriptInterpreterForLanguage(
none_instance = pos->create_callback; none_instance = pos->create_callback;
if (script_lang == pos->language) 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. // If we didn't find one, return the ScriptInterpreter for the null language.
assert(none_instance != nullptr); assert(none_instance != nullptr);
return none_instance(interpreter); return none_instance(debugger);
} }
#pragma mark - #pragma mark -

View File

@ -2507,7 +2507,7 @@ ScriptInterpreter *CommandInterpreter::GetScriptInterpreter(bool can_create) {
return nullptr; return nullptr;
lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage(); lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage();
m_script_interpreter_sp = m_script_interpreter_sp =
PluginManager::GetScriptInterpreterForLanguage(script_lang, *this); PluginManager::GetScriptInterpreterForLanguage(script_lang, m_debugger);
} }
return m_script_interpreter_sp.get(); return m_script_interpreter_sp.get();
} }

View File

@ -21,16 +21,12 @@
using namespace lldb; using namespace lldb;
using namespace lldb_private; using namespace lldb_private;
ScriptInterpreter::ScriptInterpreter(CommandInterpreter &interpreter, ScriptInterpreter::ScriptInterpreter(Debugger &debugger,
lldb::ScriptLanguage script_lang) lldb::ScriptLanguage script_lang)
: m_interpreter(interpreter), m_script_lang(script_lang) {} : m_debugger(debugger), m_script_lang(script_lang) {}
ScriptInterpreter::~ScriptInterpreter() {} ScriptInterpreter::~ScriptInterpreter() {}
CommandInterpreter &ScriptInterpreter::GetCommandInterpreter() {
return m_interpreter;
}
void ScriptInterpreter::CollectDataForBreakpointCommandCallback( void ScriptInterpreter::CollectDataForBreakpointCommandCallback(
std::vector<BreakpointOptions *> &bp_options_vec, std::vector<BreakpointOptions *> &bp_options_vec,
CommandReturnObject &result) { CommandReturnObject &result) {

View File

@ -10,7 +10,6 @@
#include "lldb/Core/Debugger.h" #include "lldb/Core/Debugger.h"
#include "lldb/Core/PluginManager.h" #include "lldb/Core/PluginManager.h"
#include "lldb/Core/StreamFile.h" #include "lldb/Core/StreamFile.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Utility/Stream.h" #include "lldb/Utility/Stream.h"
#include "lldb/Utility/StringList.h" #include "lldb/Utility/StringList.h"
@ -21,21 +20,21 @@
using namespace lldb; using namespace lldb;
using namespace lldb_private; using namespace lldb_private;
ScriptInterpreterNone::ScriptInterpreterNone(CommandInterpreter &interpreter) ScriptInterpreterNone::ScriptInterpreterNone(Debugger &debugger)
: ScriptInterpreter(interpreter, eScriptLanguageNone) {} : ScriptInterpreter(debugger, eScriptLanguageNone) {}
ScriptInterpreterNone::~ScriptInterpreterNone() {} ScriptInterpreterNone::~ScriptInterpreterNone() {}
bool ScriptInterpreterNone::ExecuteOneLine(llvm::StringRef command, bool ScriptInterpreterNone::ExecuteOneLine(llvm::StringRef command,
CommandReturnObject *, CommandReturnObject *,
const ExecuteScriptOptions &) { const ExecuteScriptOptions &) {
m_interpreter.GetDebugger().GetErrorFile()->PutCString( m_debugger.GetErrorFile()->PutCString(
"error: there is no embedded script interpreter in this mode.\n"); "error: there is no embedded script interpreter in this mode.\n");
return false; return false;
} }
void ScriptInterpreterNone::ExecuteInterpreterLoop() { void ScriptInterpreterNone::ExecuteInterpreterLoop() {
m_interpreter.GetDebugger().GetErrorFile()->PutCString( m_debugger.GetErrorFile()->PutCString(
"error: there is no embedded script interpreter in this mode.\n"); "error: there is no embedded script interpreter in this mode.\n");
} }
@ -52,8 +51,8 @@ void ScriptInterpreterNone::Initialize() {
void ScriptInterpreterNone::Terminate() {} void ScriptInterpreterNone::Terminate() {}
lldb::ScriptInterpreterSP lldb::ScriptInterpreterSP
ScriptInterpreterNone::CreateInstance(CommandInterpreter &interpreter) { ScriptInterpreterNone::CreateInstance(Debugger &debugger) {
return std::make_shared<ScriptInterpreterNone>(interpreter); return std::make_shared<ScriptInterpreterNone>(debugger);
} }
lldb_private::ConstString ScriptInterpreterNone::GetPluginNameStatic() { lldb_private::ConstString ScriptInterpreterNone::GetPluginNameStatic() {

View File

@ -15,7 +15,7 @@ namespace lldb_private {
class ScriptInterpreterNone : public ScriptInterpreter { class ScriptInterpreterNone : public ScriptInterpreter {
public: public:
ScriptInterpreterNone(CommandInterpreter &interpreter); ScriptInterpreterNone(Debugger &debugger);
~ScriptInterpreterNone() override; ~ScriptInterpreterNone() override;
@ -30,8 +30,7 @@ public:
static void Terminate(); static void Terminate();
static lldb::ScriptInterpreterSP static lldb::ScriptInterpreterSP CreateInstance(Debugger &debugger);
CreateInstance(CommandInterpreter &interpreter);
static lldb_private::ConstString GetPluginNameStatic(); static lldb_private::ConstString GetPluginNameStatic();

View File

@ -441,15 +441,13 @@ ScriptInterpreterPythonImpl::Locker::~Locker() {
DoFreeLock(); DoFreeLock();
} }
ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl( ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl(Debugger &debugger)
CommandInterpreter &interpreter) : ScriptInterpreterPython(debugger), m_saved_stdin(), m_saved_stdout(),
: ScriptInterpreterPython(interpreter), m_saved_stdin(), m_saved_stdout(),
m_saved_stderr(), m_main_module(), m_saved_stderr(), m_main_module(),
m_session_dict(PyInitialValue::Invalid), m_session_dict(PyInitialValue::Invalid),
m_sys_module_dict(PyInitialValue::Invalid), m_run_one_line_function(), m_sys_module_dict(PyInitialValue::Invalid), m_run_one_line_function(),
m_run_one_line_str_global(), m_run_one_line_str_global(),
m_dictionary_name( m_dictionary_name(m_debugger.GetInstanceName().AsCString()),
interpreter.GetDebugger().GetInstanceName().AsCString()),
m_terminal_state(), m_active_io_handler(eIOHandlerNone), m_terminal_state(), m_active_io_handler(eIOHandlerNone),
m_session_is_active(false), m_pty_slave_is_open(false), m_session_is_active(false), m_pty_slave_is_open(false),
m_valid_session(true), m_lock_count(0), m_command_thread_state(nullptr) { 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 run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64
"; pydoc.pager = pydoc.plainpager')", "; pydoc.pager = pydoc.plainpager')",
m_dictionary_name.c_str(), m_dictionary_name.c_str(), m_debugger.GetID());
interpreter.GetDebugger().GetID());
PyRun_SimpleString(run_string.GetData()); PyRun_SimpleString(run_string.GetData());
} }
@ -549,7 +546,7 @@ def function (frame, bp_loc, internal_dict):
void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler, void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler,
std::string &data) { std::string &data) {
io_handler.SetIsDone(true); io_handler.SetIsDone(true);
bool batch_mode = m_interpreter.GetBatchCommandMode(); bool batch_mode = m_debugger.GetCommandInterpreter().GetBatchCommandMode();
switch (m_active_io_handler) { switch (m_active_io_handler) {
case eIOHandlerNone: case eIOHandlerNone:
@ -608,8 +605,8 @@ void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler,
} }
lldb::ScriptInterpreterSP lldb::ScriptInterpreterSP
ScriptInterpreterPythonImpl::CreateInstance(CommandInterpreter &interpreter) { ScriptInterpreterPythonImpl::CreateInstance(Debugger &debugger) {
return std::make_shared<ScriptInterpreterPythonImpl>(interpreter); return std::make_shared<ScriptInterpreterPythonImpl>(debugger);
} }
void ScriptInterpreterPythonImpl::ResetOutputFileHandle(FILE *fh) {} void ScriptInterpreterPythonImpl::ResetOutputFileHandle(FILE *fh) {}
@ -711,11 +708,10 @@ bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags,
if (on_entry_flags & Locker::InitGlobals) { if (on_entry_flags & Locker::InitGlobals) {
run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64, run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64,
m_dictionary_name.c_str(), m_dictionary_name.c_str(), m_debugger.GetID());
GetCommandInterpreter().GetDebugger().GetID());
run_string.Printf( run_string.Printf(
"; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")",
GetCommandInterpreter().GetDebugger().GetID()); m_debugger.GetID());
run_string.PutCString("; lldb.target = lldb.debugger.GetSelectedTarget()"); run_string.PutCString("; lldb.target = lldb.debugger.GetSelectedTarget()");
run_string.PutCString("; lldb.process = lldb.target.GetProcess()"); run_string.PutCString("; lldb.process = lldb.target.GetProcess()");
run_string.PutCString("; lldb.thread = lldb.process.GetSelectedThread ()"); 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 // If we aren't initing the globals, we should still always set the
// debugger (since that is always unique.) // debugger (since that is always unique.)
run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64, run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64,
m_dictionary_name.c_str(), m_dictionary_name.c_str(), m_debugger.GetID());
GetCommandInterpreter().GetDebugger().GetID());
run_string.Printf( run_string.Printf(
"; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")", "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")",
GetCommandInterpreter().GetDebugger().GetID()); m_debugger.GetID());
run_string.PutCString("')"); run_string.PutCString("')");
} }
@ -746,8 +741,7 @@ bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags,
lldb::StreamFileSP out_sp; lldb::StreamFileSP out_sp;
lldb::StreamFileSP err_sp; lldb::StreamFileSP err_sp;
if (!in_file.IsValid() || !out_file.IsValid() || !err_file.IsValid()) if (!in_file.IsValid() || !out_file.IsValid() || !err_file.IsValid())
m_interpreter.GetDebugger().AdoptTopIOHandlerFilesIfInvalid(in_sp, out_sp, m_debugger.AdoptTopIOHandlerFilesIfInvalid(in_sp, out_sp, err_sp);
err_sp);
if (on_entry_flags & Locker::NoSTDIN) { if (on_entry_flags & Locker::NoSTDIN) {
m_saved_stdin.Reset(); m_saved_stdin.Reset();
@ -871,7 +865,7 @@ bool ScriptInterpreterPythonImpl::ExecuteOneLine(
// another string to pass to PyRun_SimpleString messes up the escaping. So // another string to pass to PyRun_SimpleString messes up the escaping. So
// we use the following more complicated method to pass the command string // we use the following more complicated method to pass the command string
// directly down to Python. // directly down to Python.
Debugger &debugger = m_interpreter.GetDebugger(); Debugger &debugger = m_debugger;
StreamFileSP input_file_sp; StreamFileSP input_file_sp;
StreamFileSP output_file_sp; StreamFileSP output_file_sp;
@ -1018,7 +1012,7 @@ void ScriptInterpreterPythonImpl::ExecuteInterpreterLoop() {
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(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 // 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 // handle is when this is called directly from Python, in which case it is
@ -1274,14 +1268,15 @@ void ScriptInterpreterPythonImpl::CollectDataForBreakpointCommandCallback(
std::vector<BreakpointOptions *> &bp_options_vec, std::vector<BreakpointOptions *> &bp_options_vec,
CommandReturnObject &result) { CommandReturnObject &result) {
m_active_io_handler = eIOHandlerBreakpoint; m_active_io_handler = eIOHandlerBreakpoint;
m_interpreter.GetPythonCommandsFromIOHandler(" ", *this, true, m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler(
&bp_options_vec); " ", *this, true, &bp_options_vec);
} }
void ScriptInterpreterPythonImpl::CollectDataForWatchpointCommandCallback( void ScriptInterpreterPythonImpl::CollectDataForWatchpointCommandCallback(
WatchpointOptions *wp_options, CommandReturnObject &result) { WatchpointOptions *wp_options, CommandReturnObject &result) {
m_active_io_handler = eIOHandlerWatchpoint; m_active_io_handler = eIOHandlerWatchpoint;
m_interpreter.GetPythonCommandsFromIOHandler(" ", *this, true, wp_options); m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler(
" ", *this, true, wp_options);
} }
void ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction( void ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction(
@ -1290,8 +1285,9 @@ void ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction(
std::string oneliner("return "); std::string oneliner("return ");
oneliner += function_name; oneliner += function_name;
oneliner += "(frame, bp_loc, internal_dict)"; oneliner += "(frame, bp_loc, internal_dict)";
m_interpreter.GetScriptInterpreter()->SetBreakpointCommandCallback( m_debugger.GetCommandInterpreter()
bp_options, oneliner.c_str()); .GetScriptInterpreter()
->SetBreakpointCommandCallback(bp_options, oneliner.c_str());
} }
Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback( Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback(
@ -2109,8 +2105,7 @@ ScriptInterpreterPythonImpl::CreateSyntheticScriptedProvider(
StructuredData::GenericSP StructuredData::GenericSP
ScriptInterpreterPythonImpl::CreateScriptCommandObject(const char *class_name) { ScriptInterpreterPythonImpl::CreateScriptCommandObject(const char *class_name) {
DebuggerSP debugger_sp( DebuggerSP debugger_sp(m_debugger.shared_from_this());
GetCommandInterpreter().GetDebugger().shared_from_this());
if (class_name == nullptr || class_name[0] == '\0') if (class_name == nullptr || class_name[0] == '\0')
return StructuredData::GenericSP(); return StructuredData::GenericSP();
@ -2718,7 +2713,7 @@ bool ScriptInterpreterPythonImpl::LoadScriptingModule(
return false; 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); FileSpec target_file(pathname);
@ -2912,7 +2907,7 @@ bool ScriptInterpreterPythonImpl::RunScriptBasedCommand(
return false; 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)); lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx));
if (!debugger_sp.get()) { if (!debugger_sp.get()) {
@ -2956,7 +2951,7 @@ bool ScriptInterpreterPythonImpl::RunScriptBasedCommand(
return false; 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)); lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx));
if (!debugger_sp.get()) { if (!debugger_sp.get()) {

View File

@ -36,8 +36,8 @@ public:
} }
}; };
ScriptInterpreterPython(CommandInterpreter &interpreter) ScriptInterpreterPython(Debugger &debugger)
: ScriptInterpreter(interpreter, lldb::eScriptLanguagePython), : ScriptInterpreter(debugger, lldb::eScriptLanguagePython),
IOHandlerDelegateMultiline("DONE") {} IOHandlerDelegateMultiline("DONE") {}
static void Initialize(); static void Initialize();

View File

@ -29,7 +29,7 @@ class ScriptInterpreterPythonImpl : public ScriptInterpreterPython {
public: public:
friend class IOHandlerPythonInterpreter; friend class IOHandlerPythonInterpreter;
ScriptInterpreterPythonImpl(CommandInterpreter &interpreter); ScriptInterpreterPythonImpl(Debugger &debugger);
~ScriptInterpreterPythonImpl() override; ~ScriptInterpreterPythonImpl() override;
@ -273,8 +273,7 @@ public:
void IOHandlerInputComplete(IOHandler &io_handler, void IOHandlerInputComplete(IOHandler &io_handler,
std::string &data) override; std::string &data) override;
static lldb::ScriptInterpreterSP static lldb::ScriptInterpreterSP CreateInstance(Debugger &debugger);
CreateInstance(CommandInterpreter &interpreter);
// PluginInterface protocol // PluginInterface protocol
lldb_private::ConstString GetPluginName() override; lldb_private::ConstString GetPluginName() override;