[lldb] Use the IOHandler's stream instead of the debugger's in PrintAsync

PrintAsync is relying on the IOHandler to print to the output/error
stream. In that context it doesn't make much sense that this is using
the debugger's streams rather than the one from the IOHandler.

Differential revision: https://reviews.llvm.org/D121536
This commit is contained in:
Jonas Devlieghere
2022-03-14 09:26:39 -07:00
parent 250620f76e
commit 2436c5703e
3 changed files with 27 additions and 22 deletions

View File

@@ -163,10 +163,7 @@ public:
void WaitForPop();
virtual void PrintAsync(Stream *stream, const char *s, size_t len) {
stream->Write(s, len);
stream->Flush();
}
virtual void PrintAsync(const char *s, size_t len, bool is_stdout);
protected:
Debugger &m_debugger;
@@ -415,7 +412,7 @@ public:
uint32_t GetCurrentLineIndex() const;
void PrintAsync(Stream *stream, const char *s, size_t len) override;
void PrintAsync(const char *s, size_t len, bool is_stdout) override;
private:
#if LLDB_ENABLE_LIBEDIT
@@ -540,7 +537,7 @@ public:
return ((m_top != nullptr) ? m_top->GetHelpPrologue() : nullptr);
}
void PrintAsync(Stream *stream, const char *s, size_t len);
bool PrintAsync(const char *s, size_t len, bool is_stdout);
protected:
typedef std::vector<lldb::IOHandlerSP> collection;

View File

@@ -1069,9 +1069,12 @@ bool Debugger::CheckTopIOHandlerTypes(IOHandler::Type top_type,
}
void Debugger::PrintAsync(const char *s, size_t len, bool is_stdout) {
lldb_private::StreamFile &stream =
is_stdout ? GetOutputStream() : GetErrorStream();
m_io_handler_stack.PrintAsync(&stream, s, len);
bool printed = m_io_handler_stack.PrintAsync(s, len, is_stdout);
if (!printed) {
lldb::StreamFileSP stream =
is_stdout ? m_output_stream_sp : m_error_stream_sp;
stream->Write(s, len);
}
}
ConstString Debugger::GetTopIOHandlerControlSequence(char ch) {

View File

@@ -122,14 +122,18 @@ void IOHandler::SetPopped(bool b) { m_popped.SetValue(b, eBroadcastOnChange); }
void IOHandler::WaitForPop() { m_popped.WaitForValueEqualTo(true); }
void IOHandlerStack::PrintAsync(Stream *stream, const char *s, size_t len) {
if (stream) {
std::lock_guard<std::recursive_mutex> guard(m_mutex);
if (m_top)
m_top->PrintAsync(stream, s, len);
else
stream->Write(s, len);
}
void IOHandler::PrintAsync(const char *s, size_t len, bool is_stdout) {
lldb::StreamFileSP stream = is_stdout ? m_output_sp : m_error_sp;
stream->Write(s, len);
stream->Flush();
}
bool IOHandlerStack::PrintAsync(const char *s, size_t len, bool is_stdout) {
std::lock_guard<std::recursive_mutex> guard(m_mutex);
if (!m_top)
return false;
m_top->PrintAsync(s, len, is_stdout);
return true;
}
IOHandlerConfirm::IOHandlerConfirm(Debugger &debugger, llvm::StringRef prompt,
@@ -612,11 +616,12 @@ void IOHandlerEditline::GotEOF() {
#endif
}
void IOHandlerEditline::PrintAsync(Stream *stream, const char *s, size_t len) {
void IOHandlerEditline::PrintAsync(const char *s, size_t len, bool is_stdout) {
#if LLDB_ENABLE_LIBEDIT
if (m_editline_up)
m_editline_up->PrintAsync(stream, s, len);
else
if (m_editline_up) {
lldb::StreamFileSP stream = is_stdout ? m_output_sp : m_error_sp;
m_editline_up->PrintAsync(stream.get(), s, len);
} else
#endif
{
#ifdef _WIN32
@@ -633,7 +638,7 @@ void IOHandlerEditline::PrintAsync(Stream *stream, const char *s, size_t len) {
SetConsoleCursorPosition(console_handle, coord);
}
#endif
IOHandler::PrintAsync(stream, s, len);
IOHandler::PrintAsync(s, len, is_stdout);
#ifdef _WIN32
if (prompt)
IOHandler::PrintAsync(GetOutputStreamFileSP().get(), prompt,