From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12173 invoked by alias); 19 Sep 2009 10:12:43 -0000 Received: (qmail 12157 invoked by uid 22791); 19 Sep 2009 10:12:42 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 19 Sep 2009 10:12:35 +0000 Received: (qmail 10710 invoked from network); 19 Sep 2009 10:12:33 -0000 Received: from unknown (HELO wind.localnet) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 Sep 2009 10:12:33 -0000 From: Vladimir Prus To: gdb-patches@sources.redhat.com Subject: [MI] -stack-list-variables Date: Sat, 19 Sep 2009 10:12:00 -0000 User-Agent: KMail/1.11.90 (Linux/2.6.24-24-generic; KDE/4.2.90; i686; svn-979530; 2009-06-10) MIME-Version: 1.0 Message-Id: <200909191412.37692.vladimir@codesourcery.com> Content-Type: Multipart/Mixed; boundary="Boundary-00=_V6KtKMGFIM+J/uH" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-09/txt/msg00625.txt.bz2 --Boundary-00=_V6KtKMGFIM+J/uH Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 662 MI presently have two separate commands to list locals and arguments in the current frame. Most often than not, frontend need both, so having to emit two commands is inconvenience and and extra roundtrip. I believe Nick has suggested having a single command, and Andre is in favour of this idea, and I also think it's good. I actually recall than Nick planned to write a patch, but I did not saw any, and this is fairly trivial change, so here it goes. The new command is called -stack-list-variables, and it's checked in into CVS HEAD. I'll post doc patch shortly; I will also merge this to 7.0 after a couple of days, if no issues appear. Thanks, Volodya --Boundary-00=_V6KtKMGFIM+J/uH Content-Type: text/x-patch; charset="utf-8"; name="stack-list-variables.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="stack-list-variables.diff" Content-length: 6185 Index: ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.10882 diff -u -p -r1.10882 ChangeLog --- ChangeLog 19 Sep 2009 09:46:45 -0000 1.10882 +++ ChangeLog 19 Sep 2009 09:58:45 -0000 @@ -1,3 +1,13 @@ +2009-09-19 Vladimir Prus + + * 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 * config/djgpp/fnchange.lst: Add missing edits. Index: mi/mi-cmd-stack.c =================================================================== RCS file: /cvs/src/src/gdb/mi/mi-cmd-stack.c,v retrieving revision 1.44 diff -u -p -r1.44 mi-cmd-stack.c --- mi/mi-cmd-stack.c 30 Jun 2009 09:37:23 -0000 1.44 +++ mi/mi-cmd-stack.c 19 Sep 2009 09:58:45 -0000 @@ -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, 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, c 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 val 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 val 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 val 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); Index: mi/mi-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/mi/mi-cmds.c,v retrieving revision 1.43 diff -u -p -r1.43 mi-cmds.c --- mi/mi-cmds.c 15 Sep 2009 18:51:25 -0000 1.43 +++ mi/mi-cmds.c 19 Sep 2009 09:58:45 -0000 @@ -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 }, Index: mi/mi-cmds.h =================================================================== RCS file: /cvs/src/src/gdb/mi/mi-cmds.h,v retrieving revision 1.40 diff -u -p -r1.40 mi-cmds.h --- mi/mi-cmds.h 15 Sep 2009 18:51:25 -0000 1.40 +++ mi/mi-cmds.h 19 Sep 2009 09:58:45 -0000 @@ -75,6 +75,7 @@ extern mi_cmd_argv_ftype mi_cmd_stack_in 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; --Boundary-00=_V6KtKMGFIM+J/uH--