aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectFrame.cpp
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-09-30 12:49:32 +0000
committerRaphael Isemann <teemperor@gmail.com>2019-09-30 12:49:32 +0000
commitdab6f0746d17dc087a846c2d42f380c98e5513fe (patch)
tree19312643d4db64f74a7f8f913655649689d51d82 /lldb/source/Commands/CommandObjectFrame.cpp
parent8180f3b1cc3fcca5e7cb858a95627eaf41911694 (diff)
downloadllvm-dab6f0746d17dc087a846c2d42f380c98e5513fe.zip
llvm-dab6f0746d17dc087a846c2d42f380c98e5513fe.tar.gz
llvm-dab6f0746d17dc087a846c2d42f380c98e5513fe.tar.bz2
[lldb] Reland 370734: Test 'frame select -r' and fix that INT32_MIN breaks the option parser
The problem with r370734 was that it removed the code for resetting the options in OptionParsingStarting. This caused that once a 'frame select -r ...' command was executed, we kept the relative index argument for all following 'frame select ...' invocations (even the ones with an absolute index as they are the same command object). See rdar://55791276. This relands the patch but keeps the code that resets the command options before execution. llvm-svn: 373201
Diffstat (limited to 'lldb/source/Commands/CommandObjectFrame.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectFrame.cpp29
1 files changed, 16 insertions, 13 deletions
diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp
index 0a10231..6a7facd 100644
--- a/lldb/source/Commands/CommandObjectFrame.cpp
+++ b/lldb/source/Commands/CommandObjectFrame.cpp
@@ -246,13 +246,15 @@ public:
Status error;
const int short_option = m_getopt_table[option_idx].val;
switch (short_option) {
- case 'r':
- if (option_arg.getAsInteger(0, relative_frame_offset)) {
- relative_frame_offset = INT32_MIN;
+ case 'r': {
+ int32_t offset = 0;
+ if (option_arg.getAsInteger(0, offset) || offset == INT32_MIN) {
error.SetErrorStringWithFormat("invalid frame offset argument '%s'",
option_arg.str().c_str());
- }
+ } else
+ relative_frame_offset = offset;
break;
+ }
default:
llvm_unreachable("Unimplemented option");
@@ -262,14 +264,14 @@ public:
}
void OptionParsingStarting(ExecutionContext *execution_context) override {
- relative_frame_offset = INT32_MIN;
+ relative_frame_offset.reset();
}
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
return llvm::makeArrayRef(g_frame_select_options);
}
- int32_t relative_frame_offset;
+ llvm::Optional<int32_t> relative_frame_offset;
};
CommandObjectFrameSelect(CommandInterpreter &interpreter)
@@ -307,15 +309,16 @@ protected:
Thread *thread = m_exe_ctx.GetThreadPtr();
uint32_t frame_idx = UINT32_MAX;
- if (m_options.relative_frame_offset != INT32_MIN) {
+ if (m_options.relative_frame_offset.hasValue()) {
// The one and only argument is a signed relative frame index
frame_idx = thread->GetSelectedFrameIndex();
if (frame_idx == UINT32_MAX)
frame_idx = 0;
- if (m_options.relative_frame_offset < 0) {
- if (static_cast<int32_t>(frame_idx) >= -m_options.relative_frame_offset)
- frame_idx += m_options.relative_frame_offset;
+ if (*m_options.relative_frame_offset < 0) {
+ if (static_cast<int32_t>(frame_idx) >=
+ -*m_options.relative_frame_offset)
+ frame_idx += *m_options.relative_frame_offset;
else {
if (frame_idx == 0) {
// If you are already at the bottom of the stack, then just warn
@@ -326,15 +329,15 @@ protected:
} else
frame_idx = 0;
}
- } else if (m_options.relative_frame_offset > 0) {
+ } else if (*m_options.relative_frame_offset > 0) {
// I don't want "up 20" where "20" takes you past the top of the stack
// to produce
// an error, but rather to just go to the top. So I have to count the
// stack here...
const uint32_t num_frames = thread->GetStackFrameCount();
if (static_cast<int32_t>(num_frames - frame_idx) >
- m_options.relative_frame_offset)
- frame_idx += m_options.relative_frame_offset;
+ *m_options.relative_frame_offset)
+ frame_idx += *m_options.relative_frame_offset;
else {
if (frame_idx == num_frames - 1) {
// If we are already at the top of the stack, just warn and don't