Author: ki.stfu Date: Thu Mar 12 10:35:58 2015 New Revision: 232048 URL: http://llvm.org/viewvc/llvm-project?rev=232048&view=rev Log: Add low-frame/high-frame options to -stack-list-arguments (MI)
Summary: Add low-frame/high-frame options to -stack-list-arguments All tests pass on OS X. Reviewers: clayborg, abidh Reviewed By: abidh Subscribers: lldb-commits, clayborg, abidh Differential Revision: http://reviews.llvm.org/D8282 Modified: lldb/trunk/test/tools/lldb-mi/stack/TestMiStack.py lldb/trunk/tools/lldb-mi/MICmdCmdStack.cpp lldb/trunk/tools/lldb-mi/MICmdCmdStack.h Modified: lldb/trunk/test/tools/lldb-mi/stack/TestMiStack.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/stack/TestMiStack.py?rev=232048&r1=232047&r2=232048&view=diff ============================================================================== --- lldb/trunk/test/tools/lldb-mi/stack/TestMiStack.py (original) +++ lldb/trunk/test/tools/lldb-mi/stack/TestMiStack.py Thu Mar 12 10:35:58 2015 @@ -30,23 +30,50 @@ class MiStackTestCase(lldbmi_testcase.Mi self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") - # Test -stack-list-arguments: use 0 or --no-values + # Test that -stack-list-arguments lists empty stack arguments if range is empty + self.runCmd("-stack-list-arguments 0 1 0") + self.expect("\^done,stack-args=\[\]") + + # Test that -stack-list-arguments lists stack arguments without values + # (and that low-frame and high-frame are optional) self.runCmd("-stack-list-arguments 0") self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[name=\"argc\",name=\"argv\"\]}") self.runCmd("-stack-list-arguments --no-values") self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[name=\"argc\",name=\"argv\"\]}") - # Test -stack-list-arguments: use 1 or --all-values - self.runCmd("-stack-list-arguments 1") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - self.runCmd("-stack-list-arguments --all-values") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") + # Test that -stack-list-arguments lists stack arguments with all values + self.runCmd("-stack-list-arguments 1 0 0") + self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}\]") + # FIXME: first 0 is treated as --no-values + self.runCmd("-stack-list-arguments --all-values 0 0") + #self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}\]") - # Test -stack-list-arguments: use 2 or --simple-values - self.runCmd("-stack-list-arguments 2") - self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") - self.runCmd("-stack-list-arguments --simple-values") + # Test that -stack-list-arguments lists stack arguments with simple values + self.runCmd("-stack-list-arguments 2 0 1") self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") + # FIXME: first 0 is treated as --no-values + self.runCmd("-stack-list-arguments --simple-values 0 1") + #self.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}") + + # Test that an invalid low-frame is handled + # FIXME: -1 is treated as unsigned int + self.runCmd("-stack-list-arguments 0 -1 0") + #self.expect("\^error") + self.runCmd("-stack-list-arguments 0 0") + self.expect("\^error,msg=\"Command 'stack-list-arguments'. Thread frame range invalid\"") + + # Test that an invalid high-frame is handled + # FIXME: -1 is treated as unsigned int + self.runCmd("-stack-list-arguments 0 0 -1") + #self.expect("\^error") + + # Test that a missing low-frame or high-frame is handled + self.runCmd("-stack-list-arguments 0 0") + self.expect("\^error,msg=\"Command 'stack-list-arguments'. Thread frame range invalid\"") + + # Test that an invalid low-frame is handled + self.runCmd("-stack-list-arguments 0 0") + self.expect("\^error,msg=\"Command 'stack-list-arguments'. Thread frame range invalid\"") @lldbmi_test @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") Modified: lldb/trunk/tools/lldb-mi/MICmdCmdStack.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdStack.cpp?rev=232048&r1=232047&r2=232048&view=diff ============================================================================== --- lldb/trunk/tools/lldb-mi/MICmdCmdStack.cpp (original) +++ lldb/trunk/tools/lldb-mi/MICmdCmdStack.cpp Thu Mar 12 10:35:58 2015 @@ -462,6 +462,8 @@ CMICmdCmdStackListArguments::CMICmdCmdSt , 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(v 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(voi 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(voi 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(voi } 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); Modified: lldb/trunk/tools/lldb-mi/MICmdCmdStack.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdStack.h?rev=232048&r1=232047&r2=232048&view=diff ============================================================================== --- lldb/trunk/tools/lldb-mi/MICmdCmdStack.h (original) +++ lldb/trunk/tools/lldb-mi/MICmdCmdStack.h Thu Mar 12 10:35:58 2015 @@ -179,6 +179,8 @@ class CMICmdCmdStackListArguments : publ const CMIUtilString m_constStrArgNoValues; const CMIUtilString m_constStrArgAllValues; const CMIUtilString m_constStrArgSimpleValues; + const CMIUtilString m_constStrArgFrameLow; + const CMIUtilString m_constStrArgFrameHigh; }; //++ ============================================================================ _______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
