2002-11-09 Andrew Cagney <ac131313@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Sat, 9 Nov 2002 18:14:10 +0000 (18:14 +0000)
committerAndrew Cagney <cagney@redhat.com>
Sat, 9 Nov 2002 18:14:10 +0000 (18:14 +0000)
* frame.c (get_prev_frame): Test prev_p to identify a previously
unwound frame.  Initialize prev_p.
* frame.h (struct frame_info): Add field prev_p.  Expand prev/next
comment.

gdb/ChangeLog
gdb/frame.c
gdb/frame.h

index 2332d14..269a613 100644 (file)
@@ -1,5 +1,12 @@
 2002-11-09  Andrew Cagney  <ac131313@redhat.com>
 
+       * frame.c (get_prev_frame): Test prev_p to identify a previously
+       unwound frame.  Initialize prev_p.
+       * frame.h (struct frame_info): Add field prev_p.  Expand prev/next
+       comment.
+
+2002-11-09  Andrew Cagney  <ac131313@redhat.com>
+
        * frame.c (get_prev_frame): Cleanups.  Eliminate redundant tests
        for a NULL NEXT_FRAME.  Simplify fromleaf initialization.  Add
        more comments.  Zap dead code.
index 8631584..bfefc77 100644 (file)
@@ -742,13 +742,10 @@ get_prev_frame (struct frame_info *next_frame)
       return current_frame;
     }
 
-  /* If we have the prev one, return it.  */
-  if (next_frame->prev)
-    /* FIXME: cagney/2002-11-09: Rather than relying on ->PREV being
-       non-NULL, there should be a predicate (->prev_p?).  That would
-       stop this function constantly trying to chain beyond the
-       outermost frame.  */
+  /* Only try to do the unwind once.  */
+  if (next_frame->prev_p)
     return next_frame->prev;
+  next_frame->prev_p = 1;
 
   /* On some machines it is possible to call a function without
      setting up a stack frame for it.  On these machines, we
index 8fd9244..7b4cca7 100644 (file)
@@ -140,10 +140,11 @@ struct frame_info
     frame_register_unwind_ftype *register_unwind;
     void *register_unwind_cache;
 
-    /* Pointers to the next (down, inner) and previous (up, outer)
-       frame_info's in the frame cache.  */
-    struct frame_info *next; /* down, inner */
-    struct frame_info *prev; /* up, outer */
+    /* Pointers to the next (down, inner, younger) and previous (up,
+       outer, older) frame_info's in the frame cache.  */
+    struct frame_info *next; /* down, inner, younger */
+    int prev_p;
+    struct frame_info *prev; /* up, outer, older */
   };
 
 /* Values for the source flag to be used in print_frame_info_base(). */