/* Print and select stack frames for GDB, the GNU debugger.
- Copyright (C) 1986-2015 Free Software Foundation, Inc.
+ Copyright (C) 1986-2016 Free Software Foundation, Inc.
This file is part of GDB.
}
\f
-/* Read a frame specification in whatever the appropriate format is
- from FRAME_EXP. Call error(), printing MESSAGE, if the
- specification is in any way invalid (so this function never returns
- NULL). When SEPECTED_P is non-NULL set its target to indicate that
- the default selected frame was used. */
+/* Read a frame specification in whatever the appropriate format is from
+ FRAME_EXP. Call error() if the specification is in any way invalid (so
+ this function never returns NULL). When SEPECTED_P is non-NULL set its
+ target to indicate that the default selected frame was used. */
static struct frame_info *
-parse_frame_specification (const char *frame_exp, const char *message,
- int *selected_frame_p)
+parse_frame_specification (const char *frame_exp, int *selected_frame_p)
{
int numargs;
struct value *args[4];
{
if (selected_frame_p != NULL)
(*selected_frame_p) = 1;
- return get_selected_frame (message);
+ return get_selected_frame (_("No stack."));
}
/* None of the remaining use the selected frame. */
CORE_ADDR caller_pc = 0;
int caller_pc_p = 0;
- fi = parse_frame_specification (addr_exp, "No stack.", &selected_frame_p);
+ fi = parse_frame_specification (addr_exp, &selected_frame_p);
gdbarch = get_frame_arch (fi);
/* Name of the value returned by get_frame_pc(). Per comments, "pc"
struct print_variable_and_value_data cb_data;
const struct block *block;
CORE_ADDR pc;
+ struct gdb_exception except = exception_none;
if (!get_frame_pc_if_available (frame, &pc))
{
cb_data.stream = stream;
cb_data.values_printed = 0;
- iterate_over_block_local_vars (block,
- do_print_variable_and_value,
- &cb_data);
+ /* Temporarily change the selected frame to the given FRAME.
+ This allows routines that rely on the selected frame instead
+ of being given a frame as parameter to use the correct frame. */
+ select_frame (frame);
+
+ TRY
+ {
+ iterate_over_block_local_vars (block,
+ do_print_variable_and_value,
+ &cb_data);
+ }
+ CATCH (ex, RETURN_MASK_ALL)
+ {
+ except = ex;
+ }
+ END_CATCH
+
+ /* Restore the selected frame, and then rethrow if there was a problem. */
+ select_frame (frame_find_by_id (cb_data.frame_id));
+ if (except.reason < 0)
+ throw_exception (except);
/* do_print_variable_and_value invalidates FRAME. */
frame = NULL;
void
select_frame_command (char *level_exp, int from_tty)
{
- select_frame (parse_frame_specification (level_exp, "No stack.", NULL));
+ select_frame (parse_frame_specification (level_exp, NULL));
}
/* The "frame" command. With no argument, print the selected frame