Convert the thread plans over from using the stack count to do their logic to using StackID's. This
should be more efficient.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@151780 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/ThreadPlanStepRange.cpp b/source/Target/ThreadPlanStepRange.cpp
index 01803a1..e67cf28 100644
--- a/source/Target/ThreadPlanStepRange.cpp
+++ b/source/Target/ThreadPlanStepRange.cpp
@@ -43,13 +43,11 @@
m_addr_context (addr_context),
m_address_ranges (),
m_stop_others (stop_others),
- m_stack_depth (0),
m_stack_id (),
m_no_more_plans (false),
m_first_run_event (true)
{
AddRange(range);
- m_stack_depth = m_thread.GetStackFrameCount();
m_stack_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
}
@@ -199,58 +197,26 @@
// Ideally we should remember the whole stack frame list, and then compare that
// to the current list.
-bool
-ThreadPlanStepRange::FrameIsYounger ()
+lldb::FrameComparison
+ThreadPlanStepRange::CompareCurrentFrameToStartFrame()
{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
+ FrameComparison frame_order;
- // FIXME: Might be better to do this by storing the FrameID we started in and seeing if that is still above
- // us on the stack. Counting the whole stack could be expensive.
+ StackID cur_frame_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
- uint32_t current_depth = m_thread.GetStackFrameCount();
- if (current_depth == m_stack_depth)
+ if (cur_frame_id == m_stack_id)
{
- if (log)
- log->Printf ("Step range FrameIsYounger still in start function.");
- return false;
+ frame_order = eFrameCompareEqual;
}
- else if (current_depth < m_stack_depth)
+ else if (cur_frame_id < m_stack_id)
{
- if (log)
- log->Printf ("Step range FrameIsYounger stepped out: start depth: %d current depth %d.", m_stack_depth, current_depth);
- return false;
+ frame_order = eFrameCompareYounger;
}
else
{
- if (log)
- log->Printf ("Step range FrameIsYounger stepped in: start depth: %d current depth %d.", m_stack_depth, current_depth);
- return true;
+ frame_order = eFrameCompareOlder;
}
-}
-
-bool
-ThreadPlanStepRange::FrameIsOlder ()
-{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
- uint32_t current_depth = m_thread.GetStackFrameCount();
- if (current_depth == m_stack_depth)
- {
- if (log)
- log->Printf ("Step range FrameIsOlder still in start function.");
- return false;
- }
- else if (current_depth < m_stack_depth)
- {
- if (log)
- log->Printf ("Step range FrameIsOlder stepped out: start depth: %d current depth %d.", m_stack_depth, current_depth);
- return true;
- }
- else
- {
- if (log)
- log->Printf ("Step range FrameIsOlder stepped in: start depth: %d current depth %d.", m_stack_depth, current_depth);
- return false;
- }
+ return frame_order;
}
bool
@@ -285,15 +251,19 @@
{
done = false;
}
- else if (!FrameIsOlder())
+ else
{
- if (m_no_more_plans)
- done = true;
+ FrameComparison frame_order = CompareCurrentFrameToStartFrame();
+ if (frame_order != eFrameCompareOlder)
+ {
+ if (m_no_more_plans)
+ done = true;
+ else
+ done = false;
+ }
else
- done = false;
+ done = true;
}
- else
- done = true;
}
if (done)