aboutsummaryrefslogtreecommitdiff
path: root/gdb/typeprint.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-11-12 17:26:21 +0000
committerTom Tromey <tromey@redhat.com>2012-11-12 17:26:21 +0000
commit53342f27db8e8a418ac202335ac2e55af50c1c2f (patch)
treece676d5c4c9bedaad60673e5ef3f3960571433a3 /gdb/typeprint.c
parent6c8702eb92aa9ebaaf9367e54fa6e392d989c589 (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.c133
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);
}