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