diff options
author | Tom Tromey <tromey@redhat.com> | 2012-11-12 17:26:21 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-11-12 17:26:21 +0000 |
commit | 53342f27db8e8a418ac202335ac2e55af50c1c2f (patch) | |
tree | ce676d5c4c9bedaad60673e5ef3f3960571433a3 /gdb/typeprint.c | |
parent | 6c8702eb92aa9ebaaf9367e54fa6e392d989c589 (diff) |
* NEWS: Update.
* c-typeprint.c (c_type_print_base): Handle print_method and
print_typedefs flags.
* gdbcmd.h (setprinttypelist, showprinttypelist): Declare.
* python/py-type.c (typy_str): Use LA_PRINT_TYPE and raw
options.
* typeprint.c (type_print_raw_options, default_ptype_flags):
Update for new field.s
(whatis_exp): Parse flags. Use LA_PRINT_TYPE.
(setprinttypelist, showprinttypelist, print_methods,
print_typedefs): New globals.
(set_print_type, show_print_type, set_print_type_methods,
show_print_type_methods, set_print_type_typedefs,
show_print_type_typedefs): New functions.
(_initialize_typeprint): Update documentation. Add "print
type methods" and "print type typedefs" parameters.
* typeprint.h (struct type_print_options) <print_methods,
print_typedefs>: New fields.
doc
* gdb.texinfo (Symbols): Document "set print type methods",
"set print type typedefs", and flags to ptype and whatis.
Diffstat (limited to 'gdb/typeprint.c')
-rw-r--r-- | gdb/typeprint.c | 133 |
1 files changed, 129 insertions, 4 deletions
diff --git a/gdb/typeprint.c b/gdb/typeprint.c index cc51497746..509b3ee363 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -36,6 +36,8 @@ #include "exceptions.h" #include "valprint.h" #include <errno.h> +#include <ctype.h> +#include "cli/cli-utils.h" extern void _initialize_typeprint (void); @@ -47,16 +49,22 @@ static void whatis_exp (char *, int); const struct type_print_options type_print_raw_options = { - 1 /* raw */ + 1, /* raw */ + 1, /* print_methods */ + 1 /* print_typedefs */ }; /* The default flags for 'ptype' and 'whatis'. */ static struct type_print_options default_ptype_flags = { - 0 /* raw */ + 0, /* raw */ + 1, /* print_methods */ + 1 /* print_typedefs */ }; + + /* Print a description of a type in the format of a typedef for the current language. NEW is the new name for a type TYPE. */ @@ -132,9 +140,46 @@ whatis_exp (char *exp, int show) int top = -1; int using_enc = 0; struct value_print_options opts; + struct type_print_options flags = default_ptype_flags; if (exp) { + if (*exp == '/') + { + int seen_one = 0; + + for (++exp; *exp && !isspace (*exp); ++exp) + { + switch (*exp) + { + case 'r': + flags.raw = 1; + break; + case 'm': + flags.print_methods = 0; + break; + case 'M': + flags.print_methods = 1; + break; + case 't': + flags.print_typedefs = 0; + break; + case 'T': + flags.print_typedefs = 1; + break; + default: + error (_("unrecognized flag '%c'"), *exp); + } + seen_one = 1; + } + + if (!*exp && !seen_one) + error (_("flag expected")); + if (!isspace (*exp)) + error (_("expected space after format")); + exp = skip_spaces (exp); + } + expr = parse_expression (exp); old_chain = make_cleanup (free_current_contents, &expr); val = evaluate_type (expr); @@ -166,7 +211,7 @@ whatis_exp (char *exp, int show) printf_filtered (" */\n"); } - type_print (type, "", gdb_stdout, show); + LA_PRINT_TYPE (type, "", gdb_stdout, show, 0, &flags); printf_filtered ("\n"); if (exp) @@ -310,17 +355,97 @@ maintenance_print_type (char *typename, int from_tty) } +struct cmd_list_element *setprinttypelist; + +struct cmd_list_element *showprinttypelist; + +static void +set_print_type (char *arg, int from_tty) +{ + printf_unfiltered ( + "\"set print type\" must be followed by the name of a subcommand.\n"); + help_list (setprintlist, "set print type ", -1, gdb_stdout); +} + +static void +show_print_type (char *args, int from_tty) +{ + cmd_show_list (showprinttypelist, from_tty, ""); +} + +static int print_methods = 1; + +static void +set_print_type_methods (char *args, int from_tty, struct cmd_list_element *c) +{ + default_ptype_flags.print_methods = print_methods; +} + +static void +show_print_type_methods (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Printing of methods defined in a class in %s\n"), + value); +} + +static int print_typedefs = 1; + +static void +set_print_type_typedefs (char *args, int from_tty, struct cmd_list_element *c) +{ + default_ptype_flags.print_typedefs = print_typedefs; +} + +static void +show_print_type_typedefs (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Printing of typedefs defined in a class in %s\n"), + value); +} + void _initialize_typeprint (void) { add_com ("ptype", class_vars, ptype_command, _("\ Print definition of type TYPE.\n\ +Usage: ptype[/FLAGS] TYPE-NAME | EXPRESSION\n\ Argument may be a type name defined by typedef, or \"struct STRUCT-TAG\"\n\ or \"class CLASS-NAME\" or \"union UNION-TAG\" or \"enum ENUM-TAG\".\n\ The selected stack frame's lexical context is used to look up the name.\n\ -Contrary to \"whatis\", \"ptype\" always unrolls any typedefs.")); +Contrary to \"whatis\", \"ptype\" always unrolls any typedefs.\n\ +\n\ +Available FLAGS are:\n\ + /r print in \"raw\" form; do not substitute typedefs\n\ + /m do not print methods defined in a class\n\ + /M print methods defined in a class\n\ + /t do not print typedefs defined in a class\n\ + /T print typedefs defined in a class")); add_com ("whatis", class_vars, whatis_command, _("Print data type of expression EXP.\n\ Only one level of typedefs is unrolled. See also \"ptype\".")); + + add_prefix_cmd ("type", no_class, show_print_type, + _("Generic command for showing type-printing settings."), + &showprinttypelist, "show print type ", 0, &showprintlist); + add_prefix_cmd ("type", no_class, set_print_type, + _("Generic command for setting how types print."), + &setprinttypelist, "show print type ", 0, &setprintlist); + + add_setshow_boolean_cmd ("methods", no_class, &print_methods, + _("\ +Set printing of methods defined in classes."), _("\ +Show printing of methods defined in classes."), NULL, + set_print_type_methods, + show_print_type_methods, + &setprinttypelist, &showprinttypelist); + add_setshow_boolean_cmd ("typedefs", no_class, &print_typedefs, + _("\ +Set printing of typedefs defined in classes."), _("\ +Show printing of typedefs defined in classes."), NULL, + set_print_type_typedefs, + show_print_type_typedefs, + &setprinttypelist, &showprinttypelist); } |