2009-05-27  Tom Tromey  <tromey@redhat.com>
	    Thiago Jung Bauermann  <bauerman@br.ibm.com>
	    Phil Muldoon  <pmuldoon@redhat.com>
	    Paul Pluzhnikov  <ppluzhnikov@google.com>
	    Vladimir Prus  <vladimir@codesourcery.com>

	* python/python-value.c (value_object_to_value): New function.
	* python/python-internal.h: Include frameobject.h.
	(gdbpy_children_cst, gdbpy_to_string_cst, gdbpy_display_hint_cst):
	Declare.
	(value_object_to_value): Declare.
	* printcmd.c (struct format_data) <raw>: New field.
	(last_format): Default to 0.
	(decode_format): Initialize val.raw.  Handle /r flag.
	(print_command_1): Initialize fmt.raw and opts.raw.
	(output_command): Likewise.
	(x_command): Fix initialization of fmt.format.  Initialize
	fmt.raw.
	(display_command): Initialize fmt.raw.
	(do_one_display): Set opts.raw.
	* python/python.c (gdbpy_to_string_cst, gdbpy_children_cst,
	gdbpy_display_hint_cst): New globals.
	(_initialize_python): Initialize them.  Set gdb.pretty_printers.
	* cp-valprint.c: Include python.h.
	(cp_print_value): Call apply_val_pretty_printer.
	* python/python.h (apply_val_pretty_printer): Declare.
	* stack.c (print_this_frame_argument_p): Remove.
	(print_frame_args): Compute summary flag.  Don't use
	print_this_frame_argument_p.
	* valprint.c: Include python.h.
	(user_print_options): Initialize new fields.
	(scalar_type_p): New function.
	(val_print): Handle 'raw' and 'summary' modes.  Call
	apply_val_pretty_printer.
	(value_print): Handle 'raw' mode.
	* valprint.h (struct value_print_options) <raw, summary>: New
	fields.
	* Makefile.in (SUBDIR_PYTHON_OBS): Add python-prettyprint.o
	(SUBDIR_PYTHON_SRCS): Add python-prettyprint.c.
	(python-prettyprint.o): New target.
	* python/python-prettyprint.c: New file.

gdb/doc

2009-05-27  Tom Tromey  <tromey@redhat.com>
	    Thiago Jung Bauermann  <bauerman@br.ibm.com>
	    Phil Muldoon  <pmuldoon@redhat.com>

	* gdb.texinfo (Objfiles In Python): Reference pretty printing.
	(Pretty Printing): New node.
	(Selecting Pretty-Printers): Likewise.
	(Python API): Update.
	(Output Formats): Document /r format.

gdb/testsuite

2009-05-27  Tom Tromey  <tromey@redhat.com>
	    Thiago Jung Bauermann  <bauerman@br.ibm.com>
	    Phil Muldoon  <pmuldoon@redhat.com>
	    Paul Pluzhnikov  <ppluzhnikov@google.com>

	* gdb.python/python-prettyprint.exp: New file.
	* gdb.python/python-prettyprint.c: New file.
	* gdb.python/python-prettyprint.py: New file.
	* gdb.base/display.exp: print/r is now valid.
This commit is contained in:
Tom Tromey
2009-05-28 01:05:14 +00:00
parent 42ae523077
commit a6bac58e84
19 changed files with 1399 additions and 55 deletions

View File

@@ -34,6 +34,7 @@
#include "doublest.h"
#include "exceptions.h"
#include "dfp.h"
#include "python/python.h"
#include <errno.h>
@@ -80,7 +81,9 @@ struct value_print_options user_print_options =
0, /* print_array_indexes */
0, /* deref_ref */
1, /* static_field_print */
1 /* pascal_static_field_print */
1, /* pascal_static_field_print */
0, /* raw */
0 /* summary */
};
/* Initialize *OPTS to be a copy of the user print options. */
@@ -214,6 +217,33 @@ show_addressprint (struct ui_file *file, int from_tty,
}
/* A helper function for val_print. When printing in "summary" mode,
we want to print scalar arguments, but not aggregate arguments.
This function distinguishes between the two. */
static int
scalar_type_p (struct type *type)
{
CHECK_TYPEDEF (type);
while (TYPE_CODE (type) == TYPE_CODE_REF)
{
type = TYPE_TARGET_TYPE (type);
CHECK_TYPEDEF (type);
}
switch (TYPE_CODE (type))
{
case TYPE_CODE_ARRAY:
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
case TYPE_CODE_SET:
case TYPE_CODE_STRING:
case TYPE_CODE_BITSTRING:
return 0;
default:
return 1;
}
}
/* Print using the given LANGUAGE the data of type TYPE located at VALADDR
(within GDB), which came from the inferior at address ADDRESS, onto
stdio stream STREAM according to OPTIONS.
@@ -257,6 +287,23 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
return (0);
}
if (!options->raw)
{
ret = apply_val_pretty_printer (type, valaddr, embedded_offset,
address, stream, recurse, options,
language);
if (ret)
return ret;
}
/* Handle summary mode. If the value is a scalar, print it;
otherwise, print an ellipsis. */
if (options->summary && !scalar_type_p (type))
{
fprintf_filtered (stream, "...");
return 0;
}
TRY_CATCH (except, RETURN_MASK_ERROR)
{
ret = language->la_val_print (type, valaddr, embedded_offset, address,
@@ -331,6 +378,18 @@ value_print (struct value *val, struct ui_file *stream,
if (!value_check_printable (val, stream))
return 0;
if (!options->raw)
{
int r = apply_val_pretty_printer (value_type (val),
value_contents_all (val),
value_embedded_offset (val),
value_address (val),
stream, 0, options,
current_language);
if (r)
return r;
}
return LA_VALUE_PRINT (val, stream, options);
}