diff options
author | Daniel Jacobowitz <drow@false.org> | 2005-07-15 04:12:19 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2005-07-15 04:12:19 +0000 |
commit | 1ecb4ee0309ec7962314a8f98d45ac91be48aebf (patch) | |
tree | a653dbd8674e8acc1979271d013ec8a8023af084 /gdb/mi/mi-cmd-var.c | |
parent | fb6ae37f9e6776de6a048387949575b08a52ab1f (diff) | |
download | gdb-1ecb4ee0309ec7962314a8f98d45ac91be48aebf.zip gdb-1ecb4ee0309ec7962314a8f98d45ac91be48aebf.tar.gz gdb-1ecb4ee0309ec7962314a8f98d45ac91be48aebf.tar.bz2 |
2005-07-15 Nick Roberts <nickrob@snap.net.nz>
Daniel Jacobowitz <dan@codesourcery.com>
* mi/mi-cmds.h (mi_no_values, mi_simple_values, mi_all_values): New
declarations.
* mi/mi-cmd-stack.c (mi_cmd_stack_list_locals): Use string
constants instead of literals for MI command options.
* mi/mi-cmd-var.c (mi_no_values, mi_simple_values, mi_all_values):
New variables.
(mi_parse_values_option, mi_print_value_p): New functions.
(mi_cmd_var_list_children): Use mi_parse_values_option and
mi_print_value_p.
(mi_cmd_var_update): Support a PRINT_VALUES option. Update calls
to varobj_update_one.
(varobj_update_one): Take a print_values argument. Call
mi_print_value_p.
* varobj.c (varobj_get_gdb_type): New function.
* varobj.h (varobj_get_gdb_type): New prototype.
Diffstat (limited to 'gdb/mi/mi-cmd-var.c')
-rw-r--r-- | gdb/mi/mi-cmd-var.c | 97 |
1 files changed, 76 insertions, 21 deletions
diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 96e7beb..df244cc 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -1,6 +1,6 @@ /* MI Command Set - varobj commands. - Copyright 2000, 2002, 2004 Free Software Foundation, Inc. + Copyright 2000, 2002, 2004, 2005 Free Software Foundation, Inc. Contributed by Cygnus Solutions (a Red Hat company). @@ -30,9 +30,14 @@ #include <ctype.h> #include "gdb_string.h" +const char mi_no_values[] = "--no-values"; +const char mi_simple_values[] = "--simple-values"; +const char mi_all_values[] = "--all-values"; + extern int varobjdebug; /* defined in varobj.c */ -static int varobj_update_one (struct varobj *var); +static int varobj_update_one (struct varobj *var, + enum print_values print_values); /* VAROBJ operations */ @@ -247,6 +252,49 @@ mi_cmd_var_info_num_children (char *command, char **argv, int argc) return MI_CMD_DONE; } +/* Parse a string argument into a print_values value. */ + +static enum print_values +mi_parse_values_option (const char *arg) +{ + if (strcmp (arg, "0") == 0 + || strcmp (arg, mi_no_values) == 0) + return PRINT_NO_VALUES; + else if (strcmp (arg, "1") == 0 + || strcmp (arg, mi_all_values) == 0) + return PRINT_ALL_VALUES; + else if (strcmp (arg, "2") == 0 + || strcmp (arg, mi_simple_values) == 0) + return PRINT_SIMPLE_VALUES; + else + error (_("Unknown value for PRINT_VALUES\n\ +Must be: 0 or \"%s\", 1 or \"%s\", 2 or \"%s\""), + mi_no_values, mi_simple_values, mi_all_values); +} + +/* Return 1 if given the argument PRINT_VALUES we should display + a value of type TYPE. */ + +static int +mi_print_value_p (struct type *type, enum print_values print_values) +{ + if (type != NULL) + type = check_typedef (type); + + if (print_values == PRINT_NO_VALUES) + return 0; + + if (print_values == PRINT_ALL_VALUES) + return 1; + + /* For PRINT_SIMPLE_VALUES, only print the value if it has a type + and that type is not a compound type. */ + + return (TYPE_CODE (type) != TYPE_CODE_ARRAY + && TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION); +} + enum mi_cmd_result mi_cmd_var_list_children (char *command, char **argv, int argc) { @@ -262,23 +310,19 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME")); /* Get varobj handle, if a valid var obj name was specified */ - if (argc == 1) var = varobj_get_handle (argv[0]); - else var = varobj_get_handle (argv[1]); + if (argc == 1) + var = varobj_get_handle (argv[0]); + else + var = varobj_get_handle (argv[1]); if (var == NULL) error (_("Variable object not found")); numchild = varobj_list_children (var, &childlist); ui_out_field_int (uiout, "numchild", numchild); if (argc == 2) - if (strcmp (argv[0], "0") == 0 - || strcmp (argv[0], "--no-values") == 0) - print_values = PRINT_NO_VALUES; - else if (strcmp (argv[0], "1") == 0 - || strcmp (argv[0], "--all-values") == 0) - print_values = PRINT_ALL_VALUES; - else - error (_("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\"")); - else print_values = PRINT_NO_VALUES; + print_values = mi_parse_values_option (argv[0]); + else + print_values = PRINT_NO_VALUES; if (numchild <= 0) return MI_CMD_DONE; @@ -295,12 +339,12 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) ui_out_field_string (uiout, "name", varobj_get_objname (*cc)); ui_out_field_string (uiout, "exp", varobj_get_expression (*cc)); ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc)); - if (print_values) + if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values)) ui_out_field_string (uiout, "value", varobj_get_value (*cc)); type = varobj_get_type (*cc); /* C++ pseudo-variables (public, private, protected) do not have a type */ if (type) - ui_out_field_string (uiout, "type", varobj_get_type (*cc)); + ui_out_field_string (uiout, "type", type); do_cleanups (cleanup_child); cc++; } @@ -426,11 +470,20 @@ mi_cmd_var_update (char *command, char **argv, int argc) struct cleanup *cleanup; char *name; int nv; + enum print_values print_values; - if (argc != 1) - error (_("mi_cmd_var_update: Usage: NAME.")); + if (argc != 1 && argc != 2) + error (_("mi_cmd_var_update: Usage: [PRINT_VALUES] NAME.")); + + if (argc == 1) + name = argv[0]; + else + name = (argv[1]); - name = argv[0]; + if (argc == 2) + print_values = mi_parse_values_option (argv[0]); + else + print_values = PRINT_NO_VALUES; /* Check if the parameter is a "*" which means that we want to update all variables */ @@ -450,7 +503,7 @@ mi_cmd_var_update (char *command, char **argv, int argc) cr = rootlist; while (*cr != NULL) { - varobj_update_one (*cr); + varobj_update_one (*cr, print_values); cr++; } xfree (rootlist); @@ -467,7 +520,7 @@ mi_cmd_var_update (char *command, char **argv, int argc) cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); else cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); - varobj_update_one (var); + varobj_update_one (var, print_values); do_cleanups (cleanup); } return MI_CMD_DONE; @@ -478,7 +531,7 @@ mi_cmd_var_update (char *command, char **argv, int argc) scope), and 1 if it succeeds. */ static int -varobj_update_one (struct varobj *var) +varobj_update_one (struct varobj *var, enum print_values print_values) { struct varobj **changelist; struct varobj **cc; @@ -524,6 +577,8 @@ varobj_update_one (struct varobj *var) if (mi_version (uiout) > 1) cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "name", varobj_get_objname (*cc)); + if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values)) + ui_out_field_string (uiout, "value", varobj_get_value (*cc)); ui_out_field_string (uiout, "in_scope", "true"); ui_out_field_string (uiout, "type_changed", "false"); if (mi_version (uiout) > 1) |