diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2332d14d66..269a613735 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2002-11-09 Andrew Cagney + + * 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 * frame.c (get_prev_frame): Cleanups. Eliminate redundant tests diff --git a/gdb/frame.c b/gdb/frame.c index 86315841ba..bfefc77693 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -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 diff --git a/gdb/frame.h b/gdb/frame.h index 8fd9244458..7b4cca7a1a 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -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(). */