Index: lldb/source/Plugins/ScriptInterpreter/Lua/ScriptInterpreterLua.cpp =================================================================== --- lldb/source/Plugins/ScriptInterpreter/Lua/ScriptInterpreterLua.cpp +++ lldb/source/Plugins/ScriptInterpreter/Lua/ScriptInterpreterLua.cpp @@ -65,12 +65,45 @@ bool ScriptInterpreterLua::ExecuteOneLine(llvm::StringRef command, CommandReturnObject *result, const ExecuteScriptOptions &options) { + if (command.empty()) { + if (result) + result->AppendError("empty command passed to lua\n"); + return false; + } + + std::unique_ptr io_redirect; + if (options.GetEnableIO()) { + io_redirect = + std::make_unique(m_debugger, result); + } else { + llvm::Error error = llvm::Error::success(); + io_redirect = std::make_unique(error); + if (error) { + if (result) + result->AppendErrorWithFormatv("failed to open /dev/null: {0}\n", + llvm::toString(std::move(error))); + else + llvm::consumeError(std::move(error)); + return false; + } + } + + if (llvm::Error e = + m_lua->ChangeIO(io_redirect->GetOutputFile()->GetStream(), + io_redirect->GetErrorFile()->GetStream())) { + result->AppendErrorWithFormatv("lua failed to redirect I/O: {0}\n", + llvm::toString(std::move(e))); + return false; + } + if (llvm::Error e = m_lua->Run(command)) { result->AppendErrorWithFormatv( "lua failed attempting to evaluate '{0}': {1}\n", command, llvm::toString(std::move(e))); return false; } + + io_redirect->Flush(); return true; } Index: lldb/test/Shell/ScriptInterpreter/Lua/io.test =================================================================== --- lldb/test/Shell/ScriptInterpreter/Lua/io.test +++ lldb/test/Shell/ScriptInterpreter/Lua/io.test @@ -1,6 +1,7 @@ # REQUIRES: lua # UNSUPPORTED: lldb-repro # +# RUN: rm -rf %t.stderr %t.stdout # RUN: cat %s | %lldb --script-language lua 2> %t.stderr > %t.stdout # RUN: cat %t.stdout | FileCheck %s --check-prefix STDOUT # RUN: cat %t.stderr | FileCheck %s --check-prefix STDERR @@ -11,6 +12,11 @@ quit script io.write(95000 + 14, "\n") + # STDOUT: 95126 # STDOUT-NOT: 95014 # STDERR: 95014 + +# RUN: rm -rf %t.stderr %t.stdout +# RUN: %lldb --script-language lua -o 'script io.stderr:write(95000 + 126, "\n")' 2> %t.stderr > %t.stdout +# RUN: cat %t.stdout | FileCheck %s --check-prefix STDOUT