* frame.c (has_stack_frames): Make public.
authorPedro Alves <palves@redhat.com>
Thu, 5 Feb 2009 17:28:21 +0000 (17:28 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 5 Feb 2009 17:28:21 +0000 (17:28 +0000)
(get_prev_frame): Don't allow a NULL this_frame anymore.
* frame.h (has_stack_frames): Declare.
* varobj.c (find_frame_addr_in_frame_chain): Don't ever pass NULL
to get_prev_frame, instead start at get_current_frame.
(varobj_create): Check has_stack_frames before getting any frame;
eliminate one usage of deprecated_safe_get_selected_frame.

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

index 97f7044b4e6f46bcdb2a8fbb3d3c1c0f99564274..94adead7370b246268f69a09a8da113518f38146 100644 (file)
@@ -1,3 +1,13 @@
+2009-02-05  Pedro Alves  <pedro@codesourcery.com>
+
+       * frame.c (has_stack_frames): Make public.
+       (get_prev_frame): Don't allow a NULL this_frame anymore.
+       * frame.h (has_stack_frames): Declare.
+       * varobj.c (find_frame_addr_in_frame_chain): Don't ever pass NULL
+       to get_prev_frame, instead start at get_current_frame.
+       (varobj_create): Check has_stack_frames before getting any frame;
+       eliminate one usage of deprecated_safe_get_selected_frame.
+
 2009-02-05  Tom Tromey  <tromey@redhat.com>
            Thiago Jung Bauermann  <bauerman@br.ibm.com>
 
index 7f67d2e453cc13242cceafd3cefa44ba6f785c7a..f0aefb56209fe2090c43f21f84db38b6e7484e89 100644 (file)
@@ -997,7 +997,7 @@ get_current_frame (void)
 
 static struct frame_info *selected_frame;
 
-static int
+int
 has_stack_frames (void)
 {
   if (!target_has_registers || !target_has_stack || !target_has_memory)
@@ -1458,42 +1458,6 @@ get_prev_frame (struct frame_info *this_frame)
 {
   struct frame_info *prev_frame;
 
-  /* Return the inner-most frame, when the caller passes in NULL.  */
-  /* NOTE: cagney/2002-11-09: Not sure how this would happen.  The
-     caller should have previously obtained a valid frame using
-     get_selected_frame() and then called this code - only possibility
-     I can think of is code behaving badly.
-
-     NOTE: cagney/2003-01-10: Talk about code behaving badly.  Check
-     block_innermost_frame().  It does the sequence: frame = NULL;
-     while (1) { frame = get_prev_frame (frame); .... }.  Ulgh!  Why
-     it couldn't be written better, I don't know.
-
-     NOTE: cagney/2003-01-11: I suspect what is happening in
-     block_innermost_frame() is, when the target has no state
-     (registers, memory, ...), it is still calling this function.  The
-     assumption being that this function will return NULL indicating
-     that a frame isn't possible, rather than checking that the target
-     has state and then calling get_current_frame() and
-     get_prev_frame().  This is a guess mind.  */
-  if (this_frame == NULL)
-    {
-      /* NOTE: cagney/2002-11-09: There was a code segment here that
-        would error out when CURRENT_FRAME was NULL.  The comment
-        that went with it made the claim ...
-
-        ``This screws value_of_variable, which just wants a nice
-        clean NULL return from block_innermost_frame if there are no
-        frames.  I don't think I've ever seen this message happen
-        otherwise.  And returning NULL here is a perfectly legitimate
-        thing to do.''
-
-         Per the above, this code shouldn't even be called with a NULL
-         THIS_FRAME.  */
-      frame_debug_got_null_frame (this_frame, "this_frame NULL");
-      return current_frame;
-    }
-
   /* There is always a frame.  If this assertion fails, suspect that
      something should be calling get_selected_frame() or
      get_current_frame().  */
index b25ab9cc053337415fd6a4ee5e757258c8fdeca2..224aec9a03591fb0d5717c60329d817a03ab6389 100644 (file)
@@ -204,6 +204,11 @@ enum frame_type
    error.  */
 extern struct frame_info *get_current_frame (void);
 
+/* Does the current target interface have enough state to be able to
+   query the current inferior for frame info, and is the inferior in a
+   state where that is possible?  */
+extern int has_stack_frames (void);
+
 /* Invalidates the frame cache (this function should have been called
    invalidate_cached_frames).
 
index 5b2ed9c377f1d30ca1c95b8a5e95b8dd207f0434..2ec6d90f2255026790f9659b6e2ced0d793816c0 100644 (file)
@@ -431,14 +431,15 @@ find_frame_addr_in_frame_chain (CORE_ADDR frame_addr)
   if (frame_addr == (CORE_ADDR) 0)
     return NULL;
 
-  while (1)
+  for (frame = get_current_frame ();
+       frame != NULL;
+       frame = get_prev_frame (frame))
     {
-      frame = get_prev_frame (frame);
-      if (frame == NULL)
-       return NULL;
       if (get_frame_base_address (frame) == frame_addr)
        return frame;
     }
+
+  return NULL;
 }
 
 struct varobj *
@@ -462,20 +463,26 @@ varobj_create (char *objname,
       struct value *value = NULL;
       int expr_len;
 
-      /* Parse and evaluate the expression, filling in as much
-         of the variable's data as possible */
+      /* Parse and evaluate the expression, filling in as much of the
+         variable's data as possible.  */
 
-      /* Allow creator to specify context of variable */
-      if ((type == USE_CURRENT_FRAME) || (type == USE_SELECTED_FRAME))
-       fi = deprecated_safe_get_selected_frame ();
+      if (has_stack_frames ())
+       {
+         /* Allow creator to specify context of variable */
+         if ((type == USE_CURRENT_FRAME) || (type == USE_SELECTED_FRAME))
+           fi = get_selected_frame (NULL);
+         else
+           /* FIXME: cagney/2002-11-23: This code should be doing a
+              lookup using the frame ID and not just the frame's
+              ``address''.  This, of course, means an interface
+              change.  However, with out that interface change ISAs,
+              such as the ia64 with its two stacks, won't work.
+              Similar goes for the case where there is a frameless
+              function.  */
+           fi = find_frame_addr_in_frame_chain (frame);
+       }
       else
-       /* FIXME: cagney/2002-11-23: This code should be doing a
-          lookup using the frame ID and not just the frame's
-          ``address''.  This, of course, means an interface change.
-          However, with out that interface change ISAs, such as the
-          ia64 with its two stacks, won't work.  Similar goes for the
-          case where there is a frameless function.  */
-       fi = find_frame_addr_in_frame_chain (frame);
+       fi = NULL;
 
       /* frame = -2 means always use selected frame */
       if (type == USE_SELECTED_FRAME)