diff options
Diffstat (limited to 'lldb/tools/lldb-mi')
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdCmdStack.cpp | 30 | ||||
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdCmdStack.h | 2 |
2 files changed, 31 insertions, 1 deletions
diff --git a/lldb/tools/lldb-mi/MICmdCmdStack.cpp b/lldb/tools/lldb-mi/MICmdCmdStack.cpp index 6e1b6078fb4..47b5246bf17 100644 --- a/lldb/tools/lldb-mi/MICmdCmdStack.cpp +++ b/lldb/tools/lldb-mi/MICmdCmdStack.cpp @@ -462,6 +462,8 @@ CMICmdCmdStackListArguments::CMICmdCmdStackListArguments(void) , m_constStrArgNoValues("no-values") , m_constStrArgAllValues("all-values") , m_constStrArgSimpleValues("simple-values") + , m_constStrArgFrameLow("low-frame") + , m_constStrArgFrameHigh("high-frame") { // Command factory matches this name with that received from the stdin stream m_strMiCmd = "stack-list-arguments"; @@ -499,6 +501,8 @@ CMICmdCmdStackListArguments::ParseArgs(void) bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgNoValues, false, true))); bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgAllValues, false, true))); bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSimpleValues, false, true))); + bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgFrameLow, false, true))); + bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgFrameHigh, false, true))); return (bOk && ParseValidateCmdOptions()); } @@ -519,6 +523,8 @@ CMICmdCmdStackListArguments::Execute(void) CMICMDBASE_GETOPTION(pArgNoValues, OptionLong, m_constStrArgNoValues); CMICMDBASE_GETOPTION(pArgAllValues, OptionLong, m_constStrArgAllValues); CMICMDBASE_GETOPTION(pArgSimpleValues, OptionLong, m_constStrArgSimpleValues); + CMICMDBASE_GETOPTION(pArgFrameLow, Number, m_constStrArgFrameLow); + CMICMDBASE_GETOPTION(pArgFrameHigh, Number, m_constStrArgFrameHigh); // Retrieve the --thread option's thread ID (only 1) MIuint64 nThreadId = UINT64_MAX; @@ -554,6 +560,20 @@ CMICmdCmdStackListArguments::Execute(void) return MIstatus::failure; } + MIuint nFrameLow = 0; + MIuint nFrameHigh = UINT32_MAX; + if (pArgFrameLow->GetFound() && pArgFrameHigh->GetFound()) + { + nFrameLow = pArgFrameLow->GetValue(); + nFrameHigh = pArgFrameHigh->GetValue() + 1; + } + else if (pArgFrameLow->GetFound() || pArgFrameHigh->GetFound()) + { + // Only low-frame or high-frame was specified but both are required + SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID), m_cmdData.strMiCmd.c_str())); + return MIstatus::failure; + } + CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); lldb::SBThread thread = (nThreadId != UINT64_MAX) ? sbProcess.GetThreadByIndexID(nThreadId) : sbProcess.GetSelectedThread(); @@ -569,7 +589,15 @@ CMICmdCmdStackListArguments::Execute(void) } const MIuint nFrames = thread.GetNumFrames(); - for (MIuint i = 0; i < nFrames; i++) + if (nFrameLow >= nFrames) + { + // The low-frame is larger than the actual number of frames + SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID), m_cmdData.strMiCmd.c_str())); + return MIstatus::failure; + } + + nFrameHigh = std::min(nFrameHigh, nFrames); + for (MIuint i = nFrameLow; i < nFrameHigh; i++) { lldb::SBFrame frame = thread.GetFrameAtIndex(i); CMICmnMIValueList miValueList(true); diff --git a/lldb/tools/lldb-mi/MICmdCmdStack.h b/lldb/tools/lldb-mi/MICmdCmdStack.h index c325424cc81..eec3d31f362 100644 --- a/lldb/tools/lldb-mi/MICmdCmdStack.h +++ b/lldb/tools/lldb-mi/MICmdCmdStack.h @@ -179,6 +179,8 @@ class CMICmdCmdStackListArguments : public CMICmdBase const CMIUtilString m_constStrArgNoValues; const CMIUtilString m_constStrArgAllValues; const CMIUtilString m_constStrArgSimpleValues; + const CMIUtilString m_constStrArgFrameLow; + const CMIUtilString m_constStrArgFrameHigh; }; //++ ============================================================================ |

