diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/mi/mi-cmd-stack.c | 51 | ||||
-rw-r--r-- | gdb/mi/mi-cmds.c | 1 | ||||
-rw-r--r-- | gdb/mi/mi-cmds.h | 1 |
4 files changed, 56 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eff95fe..35349da 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2009-09-19 Vladimir Prus <vladimir@codesourcery.com> + + * mi/mi-cmds.h (mi_cmd_stack_list_variables): Declare. + * mi/mi-cmds.c (mi_cmds): Register -stack-list-variables. + * mi/mi-cmd-stack.c (enum what_to_list): New. + (list_args_or_locals): Accept what_to_list parameter. + Use 'variables' as output name of all are requested. + (mi_cmd_stack_list_variables): New. + (mi_cmd_stack_list_locals, mi_cmd_stack_list_args): Adjust. + 2009-09-19 Eli Zaretskii <eliz@gnu.org> * config/djgpp/fnchange.lst: Add missing edits. diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index dd06269..4bcbe98 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -32,7 +32,11 @@ #include "language.h" #include "valprint.h" -static void list_args_or_locals (int locals, int values, struct frame_info *fi); + +enum what_to_list { locals, arguments, all }; + +static void list_args_or_locals (enum what_to_list what, + int values, struct frame_info *fi); /* Print a list of the stack frames. Args can be none, in which case we want to print the whole backtrace, or a pair of numbers @@ -148,7 +152,7 @@ mi_cmd_stack_list_locals (char *command, char **argv, int argc) frame = get_selected_frame (NULL); - list_args_or_locals (1, parse_print_values (argv[0]), frame); + list_args_or_locals (locals, parse_print_values (argv[0]), frame); } /* Print a list of the arguments for the current frame. With argument @@ -204,19 +208,37 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc) QUIT; cleanup_frame = make_cleanup_ui_out_tuple_begin_end (uiout, "frame"); ui_out_field_int (uiout, "level", i); - list_args_or_locals (0, print_values, fi); + list_args_or_locals (arguments, print_values, fi); do_cleanups (cleanup_frame); } do_cleanups (cleanup_stack_args); } +/* Print a list of the local variables (including arguments) for the + current frame. With argument of 0, print only the names, with + argument of 1 print also the values. */ +void +mi_cmd_stack_list_variables (char *command, char **argv, int argc) +{ + struct frame_info *frame; + enum print_values print_values; + + if (argc != 1) + error (_("Usage: PRINT_VALUES")); + + frame = get_selected_frame (NULL); + + list_args_or_locals (all, parse_print_values (argv[0]), frame); +} + + /* Print a list of the locals or the arguments for the currently selected frame. If the argument passed is 0, printonly the names of the variables, if an argument of 1 is passed, print the values as well. */ static void -list_args_or_locals (int locals, int values, struct frame_info *fi) +list_args_or_locals (enum what_to_list what, int values, struct frame_info *fi) { struct block *block; struct symbol *sym; @@ -225,12 +247,23 @@ list_args_or_locals (int locals, int values, struct frame_info *fi) struct cleanup *cleanup_list; static struct ui_stream *stb = NULL; struct type *type; + char *name_of_result; stb = ui_out_stream_new (uiout); block = get_frame_block (fi, 0); - cleanup_list = make_cleanup_ui_out_list_begin_end (uiout, locals ? "locals" : "args"); + switch (what) + { + case locals: + name_of_result = "locals"; break; + case arguments: + name_of_result = "args"; break; + case all: + name_of_result = "variables"; break; + } + + cleanup_list = make_cleanup_ui_out_list_begin_end (uiout, name_of_result); while (block != 0) { @@ -259,8 +292,12 @@ list_args_or_locals (int locals, int values, struct frame_info *fi) case LOC_STATIC: /* static */ case LOC_REGISTER: /* register */ case LOC_COMPUTED: /* computed location */ - if (SYMBOL_IS_ARGUMENT (sym) ? !locals : locals) + if (what == all) print_me = 1; + else if (what == locals) + print_me = !SYMBOL_IS_ARGUMENT (sym); + else + print_me = SYMBOL_IS_ARGUMENT (sym); break; } if (print_me) @@ -273,7 +310,7 @@ list_args_or_locals (int locals, int values, struct frame_info *fi) make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "name", SYMBOL_PRINT_NAME (sym)); - if (!locals) + if (SYMBOL_IS_ARGUMENT (sym)) sym2 = lookup_symbol (SYMBOL_NATURAL_NAME (sym), block, VAR_DOMAIN, (int *) NULL); diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 8ba086c..2c425b7 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -89,6 +89,7 @@ struct mi_cmd mi_cmds[] = { "stack-list-arguments", { NULL, 0 }, mi_cmd_stack_list_args}, { "stack-list-frames", { NULL, 0 }, mi_cmd_stack_list_frames}, { "stack-list-locals", { NULL, 0 }, mi_cmd_stack_list_locals}, + { "stack-list-variables", { NULL, 0 }, mi_cmd_stack_list_variables}, { "stack-select-frame", { NULL, 0 }, mi_cmd_stack_select_frame}, { "symbol-list-lines", { NULL, 0 }, mi_cmd_symbol_list_lines}, { "target-attach", { "attach", 1 }, NULL }, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index dfab411..491c1f2 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -75,6 +75,7 @@ extern mi_cmd_argv_ftype mi_cmd_stack_info_frame; extern mi_cmd_argv_ftype mi_cmd_stack_list_args; extern mi_cmd_argv_ftype mi_cmd_stack_list_frames; extern mi_cmd_argv_ftype mi_cmd_stack_list_locals; +extern mi_cmd_argv_ftype mi_cmd_stack_list_variables; extern mi_cmd_argv_ftype mi_cmd_stack_select_frame; extern mi_cmd_argv_ftype mi_cmd_symbol_list_lines; extern mi_cmd_argv_ftype mi_cmd_target_detach; |