apolyakov updated this revision to Diff 151906.
apolyakov added a comment.

Attached another realization of `CMICmdBase::ReturnMIStatus`. It uses lambda 
functions to get user defined actions.

It works, but, as you may see, I had to define `auto error_handler = ...` in 
`Execute` function since in C++ we can't do something like `return 
ReturnMIStatus(success_handler,, error)`.

Base on this, I see a few options:

1. keep it in current state;
2. use llvm::Optional instead of default arguments. We still will be needed to 
pass all three parameters, but in this case user could do following: `return 
ReturnMIStatus(success_handler, llvm::Optional::None, error)`.
3. go back to simple implementation of `ReturnMIStatus`:

  bool CMICmdBase::ReturnMIStatus(const SBError &error) {
    if (error.Success())
      return MIstatus::success;
  
    SetError(error.GetCString());
    return MIstatus::failure;
  }

4. discard this idea and keep duplicating code;


https://reviews.llvm.org/D48295

Files:
  tools/lldb-mi/MICmdBase.cpp
  tools/lldb-mi/MICmdBase.h
  tools/lldb-mi/MICmdCmdExec.cpp


Index: tools/lldb-mi/MICmdCmdExec.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdExec.cpp
+++ tools/lldb-mi/MICmdCmdExec.cpp
@@ -235,21 +235,22 @@
 bool CMICmdCmdExecContinue::Execute() {
   lldb::SBError error =
       CMICmnLLDBDebugSessionInfo::Instance().GetProcess().Continue();
- 
-  if (error.Success()) {
-    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM
+
+  auto success_handler = [this] {
     if (!CMIDriver::Instance().SetDriverStateRunningDebugging()) {
       const CMIUtilString 
&rErrMsg(CMIDriver::Instance().GetErrorDescription());
-      SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE),
-                                     m_cmdData.strMiCmd.c_str(),
-                                     rErrMsg.c_str()));
+      this->SetError(CMIUtilString::Format(
+          MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE),
+          this->m_cmdData.strMiCmd.c_str(),
+          rErrMsg.c_str()));
       return MIstatus::failure;
     }
     return MIstatus::success;
-  }
+  };
 
-  SetError(error.GetCString());
-  return MIstatus::failure;
+  auto error_handler = [] { return MIstatus::failure; };
+
+  return ReturnMIStatus(success_handler, error_handler, error); 
 }
 
 //++
Index: tools/lldb-mi/MICmdBase.h
===================================================================
--- tools/lldb-mi/MICmdBase.h
+++ tools/lldb-mi/MICmdBase.h
@@ -12,6 +12,8 @@
 // C Includes
 // C++ Includes
 // Other libraries and framework includes
+#include "lldb/API/SBError.h"
+
 // Project includes
 #include "MICmdArgSet.h"
 #include "MICmdData.h"
@@ -80,6 +82,11 @@
   // Methods:
 protected:
   void SetError(const CMIUtilString &rErrMsg);
+  bool ReturnMIStatus(const std::function<bool()> &success_handler =
+                      [] { return MIstatus::success; },
+                      const std::function<bool()> &error_handler =
+                      [] { return MIstatus::failure; },
+                      const lldb::SBError error = lldb::SBError());
   template <class T> T *GetOption(const CMIUtilString &vStrOptionName);
   bool ParseValidateCmdOptions();
 
Index: tools/lldb-mi/MICmdBase.cpp
===================================================================
--- tools/lldb-mi/MICmdBase.cpp
+++ tools/lldb-mi/MICmdBase.cpp
@@ -214,6 +214,25 @@
 
 //++
 
//------------------------------------------------------------------------------------
+// Details: Short cut function to check MI command's execute status and
+//          set an error in case of failure.
+// Type:    Method.
+// Args:    error - (R) Error description object.
+// Return:  bool.
+// Throws:  None.
+//--
+bool CMICmdBase::ReturnMIStatus(const std::function<bool()> &success_handler,
+                                const std::function<bool()> &error_handler,
+                                const lldb::SBError error) {
+  if (error.Success())
+    return success_handler();
+
+  SetError(error.GetCString());
+  return error_handler();
+}
+
+//++
+//------------------------------------------------------------------------------------
 // Details: Ask a command to provide its unique identifier.
 // Type:    Method.
 // Args:    A unique identifier for this command class.


Index: tools/lldb-mi/MICmdCmdExec.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdExec.cpp
+++ tools/lldb-mi/MICmdCmdExec.cpp
@@ -235,21 +235,22 @@
 bool CMICmdCmdExecContinue::Execute() {
   lldb::SBError error =
       CMICmnLLDBDebugSessionInfo::Instance().GetProcess().Continue();
- 
-  if (error.Success()) {
-    // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM
+
+  auto success_handler = [this] {
     if (!CMIDriver::Instance().SetDriverStateRunningDebugging()) {
       const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription());
-      SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE),
-                                     m_cmdData.strMiCmd.c_str(),
-                                     rErrMsg.c_str()));
+      this->SetError(CMIUtilString::Format(
+          MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE),
+          this->m_cmdData.strMiCmd.c_str(),
+          rErrMsg.c_str()));
       return MIstatus::failure;
     }
     return MIstatus::success;
-  }
+  };
 
-  SetError(error.GetCString());
-  return MIstatus::failure;
+  auto error_handler = [] { return MIstatus::failure; };
+
+  return ReturnMIStatus(success_handler, error_handler, error); 
 }
 
 //++
Index: tools/lldb-mi/MICmdBase.h
===================================================================
--- tools/lldb-mi/MICmdBase.h
+++ tools/lldb-mi/MICmdBase.h
@@ -12,6 +12,8 @@
 // C Includes
 // C++ Includes
 // Other libraries and framework includes
+#include "lldb/API/SBError.h"
+
 // Project includes
 #include "MICmdArgSet.h"
 #include "MICmdData.h"
@@ -80,6 +82,11 @@
   // Methods:
 protected:
   void SetError(const CMIUtilString &rErrMsg);
+  bool ReturnMIStatus(const std::function<bool()> &success_handler =
+                      [] { return MIstatus::success; },
+                      const std::function<bool()> &error_handler =
+                      [] { return MIstatus::failure; },
+                      const lldb::SBError error = lldb::SBError());
   template <class T> T *GetOption(const CMIUtilString &vStrOptionName);
   bool ParseValidateCmdOptions();
 
Index: tools/lldb-mi/MICmdBase.cpp
===================================================================
--- tools/lldb-mi/MICmdBase.cpp
+++ tools/lldb-mi/MICmdBase.cpp
@@ -214,6 +214,25 @@
 
 //++
 //------------------------------------------------------------------------------------
+// Details: Short cut function to check MI command's execute status and
+//          set an error in case of failure.
+// Type:    Method.
+// Args:    error - (R) Error description object.
+// Return:  bool.
+// Throws:  None.
+//--
+bool CMICmdBase::ReturnMIStatus(const std::function<bool()> &success_handler,
+                                const std::function<bool()> &error_handler,
+                                const lldb::SBError error) {
+  if (error.Success())
+    return success_handler();
+
+  SetError(error.GetCString());
+  return error_handler();
+}
+
+//++
+//------------------------------------------------------------------------------------
 // Details: Ask a command to provide its unique identifier.
 // Type:    Method.
 // Args:    A unique identifier for this command class.
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to