* thread.c (restore_selected_frame): Handle frame_level == -1.
authorTom Tromey <tromey@redhat.com>
Wed, 9 Mar 2011 14:22:09 +0000 (14:22 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 9 Mar 2011 14:22:09 +0000 (14:22 +0000)
(make_cleanup_restore_current_thread): Use
get_selected_frame_if_set.
* frame.h (get_selected_frame_if_set): Declare.
* frame.c (get_selected_frame_if_set): New function.

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

index 3a26f18e0d606b4670abf09fe9c8cff506608df3..ddb885df391ed859821375f1cc393b69a2710785 100644 (file)
@@ -1,3 +1,11 @@
+2011-03-09  Tom Tromey  <tromey@redhat.com>
+
+       * thread.c (restore_selected_frame): Handle frame_level == -1.
+       (make_cleanup_restore_current_thread): Use
+       get_selected_frame_if_set.
+       * frame.h (get_selected_frame_if_set): Declare.
+       * frame.c (get_selected_frame_if_set): New function.
+
 2011-03-09  Pedro Alves  <pedro@codesourcery.com>
 
        * cli/cli-cmds.c (shell_escape): Use lbasename.
index 36fcefe6f7b7b5eff0e3e982855a95e2cffb7652..bf3ce77ba7e988d8272d89792c48d789b4121645 100644 (file)
@@ -1247,6 +1247,14 @@ get_selected_frame (const char *message)
   return selected_frame;
 }
 
+/* If there is a selected frame, return it.  Otherwise, return NULL.  */
+
+struct frame_info *
+get_selected_frame_if_set (void)
+{
+  return selected_frame;
+}
+
 /* This is a variant of get_selected_frame() which can be called when
    the inferior does not have a frame; in that case it will return
    NULL instead of calling error().  */
index 2c5276e0fa606309d4ca3faf42ae860d3b3450d2..252b75e05390175c7ccb5df37cd04c23ef3aa511 100644 (file)
@@ -260,6 +260,9 @@ extern void reinit_frame_cache (void);
    and then return that thread's previously selected frame.  */
 extern struct frame_info *get_selected_frame (const char *message);
 
+/* If there is a selected frame, return it.  Otherwise, return NULL.  */
+extern struct frame_info *get_selected_frame_if_set (void);
+
 /* Select a specific frame.  NULL, apparently implies re-select the
    inner most frame.  */
 extern void select_frame (struct frame_info *);
index 7d8f6da353b8843a7921e5923ff5e7a93ebca939..b48909f1e48531dfc5faf2579db7076d4de103bc 100644 (file)
@@ -1019,6 +1019,13 @@ restore_selected_frame (struct frame_id a_frame_id, int frame_level)
   struct frame_info *frame = NULL;
   int count;
 
+  /* This means there was no selected frame.  */
+  if (frame_level == -1)
+    {
+      select_frame (NULL);
+      return;
+    }
+
   gdb_assert (frame_level >= 0);
 
   /* Restore by level first, check if the frame id is the same as
@@ -1137,7 +1144,14 @@ make_cleanup_restore_current_thread (void)
          && target_has_registers
          && target_has_stack
          && target_has_memory)
-       frame = get_selected_frame (NULL);
+       {
+         /* When processing internal events, there might not be a
+            selected frame.  If we naively call get_selected_frame
+            here, then we can end up reading debuginfo for the
+            current frame, but we don't generally need the debuginfo
+            at this point.  */
+         frame = get_selected_frame_if_set ();
+       }
       else
        frame = NULL;