[RFA] Have block_innermost_frame start from selected frame

Paul Hilfinger Hilfinger@adacore.com
Tue Dec 27 19:59:00 GMT 2011


The GDB documentation suggests that the notation FOO::x is intended for static
variables, but in fact it also "works" for local variables as well.  For
various reasons, we tend to do this quite a bit in Ada, but the issue
raised here comes up in C as well (the message following this one contains a
proposed test case in C).  The change proposed here causes no regressions, but
the obvious question is why things currently work as they do (FOO::x ignores
the selected frame).  Is this because (as we hope) nobody else uses FOO:: for
referencing local variables?

Previously, GDB would search for the frame containing variables in a
particular lexical block starting from the current (top) frame,
ignoring any currently selected frame.  It is not clear why this is
desirable for variables that require a frame; why would a user
deliberately select one frame and then expect to see the value of a
variable in a more recent frame?  This change causes
block_innermost_frame to start looking from the selected frame, if
there is one.

This change is perhaps unnecessarily conservative.  It uses
get_selected_frame_if_set rather than get_selected_frame in order to
avoid the side effect of calling select_frame, which would probably be
harmless.

Paul N. Hilfinger


2011-12-27  Paul Hilfinger  <hilfingr@adacore.com>

* gdb/blockframe.c (block_innermost_frame): Start search from selected from,
    if present, or otherwise the current frame.
---
 gdb/ChangeLog    |    5 +++++
 gdb/blockframe.c |    4 +++-
 2 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 87031a6..39bc63a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-27  Paul Hilfinger  <hilfingr@adacore.com>
+
+        * blockframe.c (block_innermost_frame): Start search from 
+        selected from,if present, or otherwise the current frame.
+
 2011-12-27  Joel Brobecker  <brobecker@adacore.com>
 
 	* ada-lang.c (should_use_wild_match): New function.
diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index ef53a3d..92271ff 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -370,7 +370,9 @@ block_innermost_frame (const struct block *block)
   start = BLOCK_START (block);
   end = BLOCK_END (block);
 
-  frame = get_current_frame ();
+  frame = get_selected_frame_if_set ();
+  if (frame == NULL)
+    frame = get_current_frame ();
   while (frame != NULL)
     {
       struct block *frame_block = get_frame_block (frame, NULL);
-- 
1.7.0.4





More information about the Gdb-patches mailing list