* 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.
This commit is contained in:
parent
eceb0c5f49
commit
eb8c062170
4 changed files with 34 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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(). */
|
||||
|
|
|
@ -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 *);
|
||||
|
|
16
gdb/thread.c
16
gdb/thread.c
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue