JDevlieghere updated this revision to Diff 273068.
JDevlieghere added a comment.

This now has a small function change w.r.t. the error message.


Repository:
  rLLDB LLDB

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82396/new/

https://reviews.llvm.org/D82396

Files:
  lldb/include/lldb/Interpreter/ScriptInterpreter.h
  lldb/source/Interpreter/ScriptInterpreter.cpp
  lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp

Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
===================================================================
--- lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -911,23 +911,23 @@
     // 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.
-    std::unique_ptr<ScriptInterpreterIORedirect> io_redirect;
-    if (options.GetEnableIO()) {
-      io_redirect =
-          std::make_unique<ScriptInterpreterIORedirect>(m_debugger, result);
-    } else {
-      llvm::Error error = llvm::Error::success();
-      io_redirect = std::make_unique<ScriptInterpreterIORedirect>(error);
-      if (error) {
-        if (result)
-          result->AppendErrorWithFormatv("failed to open /dev/null: {0}\n",
-                                         llvm::fmt_consume(std::move(error)));
-        else
-          llvm::consumeError(std::move(error));
-        return false;
-      }
+    llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
+        io_redirect_or_error =
+            options.GetEnableIO()
+                ? ScriptInterpreterIORedirect::Create(m_debugger, result)
+                : ScriptInterpreterIORedirect::Create();
+    if (!io_redirect_or_error) {
+      if (result)
+        result->AppendErrorWithFormatv(
+            "failed to redirect I/O: {0}\n",
+            llvm::fmt_consume(io_redirect_or_error.takeError()));
+      else
+        llvm::consumeError(io_redirect_or_error.takeError());
+      return false;
     }
 
+    ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error;
+
     bool success = false;
     {
       // WARNING!  It's imperative that this RAII scope be as tight as
@@ -944,8 +944,8 @@
               (options.GetSetLLDBGlobals() ? Locker::InitGlobals : 0) |
               ((result && result->GetInteractive()) ? 0 : Locker::NoSTDIN),
           Locker::FreeAcquiredLock | Locker::TearDownSession,
-          io_redirect->GetInputFile(), io_redirect->GetOutputFile(),
-          io_redirect->GetErrorFile());
+          io_redirect.GetInputFile(), io_redirect.GetOutputFile(),
+          io_redirect.GetErrorFile());
 
       // Find the correct script interpreter dictionary in the main module.
       PythonDictionary &session_dict = GetSessionDictionary();
@@ -971,7 +971,7 @@
         }
       }
 
-      io_redirect->Flush();
+      io_redirect.Flush();
     }
 
     if (success)
Index: lldb/source/Interpreter/ScriptInterpreter.cpp
===================================================================
--- lldb/source/Interpreter/ScriptInterpreter.cpp
+++ lldb/source/Interpreter/ScriptInterpreter.cpp
@@ -119,12 +119,14 @@
   }
 }
 
-ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(
-    Debugger &debugger, CommandReturnObject *result)
-    : m_communication("lldb.ScriptInterpreterIORedirect.comm"),
-      m_disconnect(false) {
+llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
+ScriptInterpreterIORedirect::Create(Debugger &debugger,
+                                    CommandReturnObject *result) {
+  std::unique_ptr<ScriptInterpreterIORedirect> redirect =
+      std::make_unique<ScriptInterpreterIORedirect>();
+
   if (result) {
-    m_input_file_sp = debugger.GetInputFileSP();
+    redirect->m_input_file_sp = debugger.GetInputFileSP();
 
     Pipe pipe;
     Status pipe_result = pipe.CreateNew(false);
@@ -140,15 +142,16 @@
 #endif
 
     if (conn_up->IsConnected()) {
-      m_communication.SetConnection(std::move(conn_up));
-      m_communication.SetReadThreadBytesReceivedCallback(
+      redirect->m_communication.SetConnection(std::move(conn_up));
+      redirect->m_communication.SetReadThreadBytesReceivedCallback(
           ReadThreadBytesReceived, &result->GetOutputStream());
-      m_communication.StartReadThread();
-      m_disconnect = true;
+      redirect->m_communication.StartReadThread();
+      redirect->m_disconnect = true;
 
       FILE *outfile_handle = fdopen(pipe.ReleaseWriteFileDescriptor(), "w");
-      m_output_file_sp = std::make_shared<StreamFile>(outfile_handle, true);
-      m_error_file_sp = m_output_file_sp;
+      redirect->m_output_file_sp =
+          std::make_shared<StreamFile>(outfile_handle, true);
+      redirect->m_error_file_sp = redirect->m_output_file_sp;
       if (outfile_handle)
         ::setbuf(outfile_handle, nullptr);
 
@@ -157,33 +160,40 @@
     }
   }
 
-  if (!m_input_file_sp || !m_output_file_sp || !m_error_file_sp)
-    debugger.AdoptTopIOHandlerFilesIfInvalid(m_input_file_sp, m_output_file_sp,
-                                             m_error_file_sp);
+  if (!redirect->m_input_file_sp || !redirect->m_output_file_sp ||
+      !redirect->m_error_file_sp)
+    debugger.AdoptTopIOHandlerFilesIfInvalid(redirect->m_input_file_sp,
+                                             redirect->m_output_file_sp,
+                                             redirect->m_error_file_sp);
+
+  return redirect;
 }
 
-ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(llvm::Error &error)
-    : m_communication("lldb.ScriptInterpreterIORedirect.comm"),
-      m_disconnect(false) {
+llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
+ScriptInterpreterIORedirect::Create() {
   auto nullin = FileSystem::Instance().Open(FileSpec(FileSystem::DEV_NULL),
                                             File::eOpenOptionRead);
-  if (!nullin) {
-    error = nullin.takeError();
-    return;
-  }
+  if (!nullin)
+    return nullin.takeError();
 
   auto nullout = FileSystem::Instance().Open(FileSpec(FileSystem::DEV_NULL),
                                              File::eOpenOptionWrite);
-  if (!nullout) {
-    error = nullout.takeError();
-    return;
-  }
+  if (!nullout)
+    return nullin.takeError();
 
-  m_input_file_sp = std::move(nullin.get());
-  m_error_file_sp = m_output_file_sp =
+  std::unique_ptr<ScriptInterpreterIORedirect> redirect =
+      std::make_unique<ScriptInterpreterIORedirect>();
+  redirect->m_input_file_sp = std::move(nullin.get());
+  redirect->m_error_file_sp = redirect->m_output_file_sp =
       std::make_shared<StreamFile>(std::move(nullout.get()));
+
+  return redirect;
 }
 
+ScriptInterpreterIORedirect::ScriptInterpreterIORedirect()
+    : m_communication("lldb.ScriptInterpreterIORedirect.comm"),
+      m_disconnect(false) {}
+
 void ScriptInterpreterIORedirect::Flush() {
   if (m_output_file_sp)
     m_output_file_sp->Flush();
Index: lldb/include/lldb/Interpreter/ScriptInterpreter.h
===================================================================
--- lldb/include/lldb/Interpreter/ScriptInterpreter.h
+++ lldb/include/lldb/Interpreter/ScriptInterpreter.h
@@ -37,11 +37,12 @@
 class ScriptInterpreterIORedirect {
 public:
   /// Create an IO redirect with /dev/null as input, output and error file.
-  ScriptInterpreterIORedirect(llvm::Error &error);
+  static llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>> Create();
 
   /// Create an IO redirect that redirects the output to the command return
   /// object if set or to the debugger otherwise.
-  ScriptInterpreterIORedirect(Debugger &debugger, CommandReturnObject *result);
+  static llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
+  Create(Debugger &debugger, CommandReturnObject *result);
 
   ~ScriptInterpreterIORedirect();
 
@@ -53,6 +54,11 @@
   void Flush();
 
 private:
+  friend std::unique_ptr<ScriptInterpreterIORedirect>
+  std::make_unique<ScriptInterpreterIORedirect>();
+
+  ScriptInterpreterIORedirect();
+
   lldb::FileSP m_input_file_sp;
   lldb::StreamFileSP m_output_file_sp;
   lldb::StreamFileSP m_error_file_sp;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to