2003-04-05 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Sat, 5 Apr 2003 15:49:54 +0000 (15:49 +0000)
committerAndrew Cagney <cagney@redhat.com>
Sat, 5 Apr 2003 15:49:54 +0000 (15:49 +0000)
* frame.c (legacy_get_prev_frame): Link prev to next at the
function start.  Update comments.

gdb/ChangeLog
gdb/frame.c

index 81918aa082ec9125db224296b6b15b6b0590201c..8bb0240ff4f79f8188580c65d3bce24c5cd7e94e 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-05  Andrew Cagney  <cagney@redhat.com>
+
+       * frame.c (legacy_get_prev_frame): Link prev to next at the
+       function start.  Update comments.
+
 2003-04-05  Andrew Cagney  <cagney@redhat.com>
 
        * frame.c (get_frame_id): Update comment.
index 1c6533988420423c8f8e45872223eaf4c5b93d20..161ff6085e849997e40fa7ec36bb3fa561841da1 100644 (file)
@@ -1029,10 +1029,7 @@ legacy_get_prev_frame (struct frame_info *this_frame)
   struct frame_info *prev;
   int fromleaf;
 
-  /* Allocate the new frame but do not wire it in to the frame chain.
-     Some (bad) code in INIT_FRAME_EXTRA_INFO tries to look along
-     frame->next to pull some fancy tricks (of course such code is, by
-     definition, recursive).  Try to prevent it.
+  /* Allocate the new frame.
 
      There is no reason to worry about memory leaks, should the
      remainder of the function fail.  The allocated memory will be
@@ -1042,6 +1039,17 @@ legacy_get_prev_frame (struct frame_info *this_frame)
   prev = FRAME_OBSTACK_ZALLOC (struct frame_info);
   prev->level = this_frame->level + 1;
 
+  /* Do not completly wire it in to the frame chain.  Some (bad) code
+     in INIT_FRAME_EXTRA_INFO tries to look along frame->prev to pull
+     some fancy tricks (of course such code is, by definition,
+     recursive).
+  
+     On the other hand, methods, such as get_frame_pc() and
+     get_frame_base() rely on being able to walk along the frame
+     chain.  Make certain that at least they work by providing that
+     link.  Of course things manipulating prev can't go back.  */
+  prev->next = this_frame;
+
   /* NOTE: cagney/2002-11-18: Should have been correctly setting the
      frame's type here, before anything else, and not last, at the
      bottom of this function.  The various
@@ -1155,7 +1163,6 @@ legacy_get_prev_frame (struct frame_info *this_frame)
 
       /* Link it in.  */
       this_frame->prev = prev;
-      prev->next = this_frame;
 
       /* FIXME: cagney/2002-01-19: This call will go away.  Instead of
         initializing extra info, all frames will use the frame_cache
@@ -1230,7 +1237,6 @@ legacy_get_prev_frame (struct frame_info *this_frame)
 
   /* Link in the already allocated prev frame.  */
   this_frame->prev = prev;
-  prev->next = this_frame;
   deprecated_update_frame_base_hack (prev, address);
 
   /* This change should not be needed, FIXME!  We should determine