aboutsummaryrefslogtreecommitdiff
path: root/gdb/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/stack.c')
-rw-r--r--gdb/stack.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/gdb/stack.c b/gdb/stack.c
index 417e887..b719fcd 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -51,6 +51,7 @@
#include "safe-ctype.h"
#include "symfile.h"
#include "extension.h"
+#include "observer.h"
/* The possible choices of "set print frame-arguments", and the value
of this setting. */
@@ -141,6 +142,24 @@ frame_show_address (struct frame_info *frame,
return get_frame_pc (frame) != sal.pc;
}
+/* See frame.h. */
+
+void
+print_stack_frame_to_uiout (struct ui_out *uiout, struct frame_info *frame,
+ int print_level, enum print_what print_what,
+ int set_current_sal)
+{
+ struct cleanup *old_chain;
+
+ old_chain = make_cleanup_restore_current_uiout ();
+
+ current_uiout = uiout;
+
+ print_stack_frame (frame, print_level, print_what, set_current_sal);
+
+ do_cleanups (old_chain);
+}
+
/* Show or print a stack frame FRAME briefly. The output is formatted
according to PRINT_LEVEL and PRINT_WHAT printing the frame's
relative level, function name, argument list, and file name and
@@ -2302,7 +2321,11 @@ find_relative_frame (struct frame_info *frame, int *level_offset_ptr)
void
select_frame_command (char *level_exp, int from_tty)
{
+ struct frame_info *prev_frame = get_selected_frame_if_set ();
+
select_frame (parse_frame_specification (level_exp, NULL));
+ if (get_selected_frame_if_set () != prev_frame)
+ observer_notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* The "frame" command. With no argument, print the selected frame
@@ -2312,8 +2335,13 @@ select_frame_command (char *level_exp, int from_tty)
static void
frame_command (char *level_exp, int from_tty)
{
- select_frame_command (level_exp, from_tty);
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
+ struct frame_info *prev_frame = get_selected_frame_if_set ();
+
+ select_frame (parse_frame_specification (level_exp, NULL));
+ if (get_selected_frame_if_set () != prev_frame)
+ observer_notify_user_selected_context_changed (USER_SELECTED_FRAME);
+ else
+ print_selected_thread_frame (current_uiout, USER_SELECTED_FRAME);
}
/* Select the frame up one or COUNT_EXP stack levels from the
@@ -2344,7 +2372,7 @@ static void
up_command (char *count_exp, int from_tty)
{
up_silently_base (count_exp);
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
+ observer_notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* Select the frame down one or COUNT_EXP stack levels from the previously
@@ -2383,9 +2411,8 @@ static void
down_command (char *count_exp, int from_tty)
{
down_silently_base (count_exp);
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
+ observer_notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
-
void
return_command (char *retval_exp, int from_tty)
@@ -2616,10 +2643,11 @@ a command file or a user-defined command."));
add_com_alias ("f", "frame", class_stack, 1);
- add_com ("select-frame", class_stack, select_frame_command, _("\
+ add_com_suppress_notification ("select-frame", class_stack, select_frame_command, _("\
Select a stack frame without printing anything.\n\
An argument specifies the frame to select.\n\
-It can be a stack frame number or the address of the frame.\n"));
+It can be a stack frame number or the address of the frame.\n"),
+ &cli_suppress_notification.user_selected_context);
add_com ("backtrace", class_stack, backtrace_command, _("\
Print backtrace of all stack frames, or innermost COUNT frames.\n\