Allow a pretty-printer without a to_string method

PR python/16047 points out that, while the documentation says that the
to_string method is optional for a pretty-printer, the code disagrees
and throws an exception.  This patch fixes the problem.  varobj is
already ok here.

Tested on x86-64 Fedora 26.

gdb/ChangeLog
2018-09-08  Tom Tromey  <tom@tromey.com>

	PR python/16047:
	* python/py-prettyprint.c (pretty_print_one_value): Check for
	to_string method.

gdb/testsuite/ChangeLog
2018-09-08  Tom Tromey  <tom@tromey.com>

	PR python/16047:
	* gdb.python/py-prettyprint.py (pp_int_typedef3): New class.
	(register_pretty_printers): Register new printer.
	* gdb.python/py-prettyprint.exp (run_lang_tests): Add int_type3
	test.
	* gdb.python/py-prettyprint.c (int_type3): New typedef.
	(an_int_type3): New global.
This commit is contained in:
Tom Tromey 2018-09-08 14:40:38 -06:00
parent 0653638f9f
commit 332cf4c925
6 changed files with 47 additions and 10 deletions

View file

@ -195,18 +195,23 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
*out_value = NULL;
TRY
{
result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst,
NULL));
if (result != NULL)
if (!PyObject_HasAttr (printer, gdbpy_to_string_cst))
result = gdbpy_ref<>::new_reference (Py_None);
else
{
if (! gdbpy_is_string (result.get ())
&& ! gdbpy_is_lazy_string (result.get ())
&& result != Py_None)
result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst,
NULL));
if (result != NULL)
{
*out_value = convert_value_from_python (result.get ());
if (PyErr_Occurred ())
*out_value = NULL;
result = NULL;
if (! gdbpy_is_string (result.get ())
&& ! gdbpy_is_lazy_string (result.get ())
&& result != Py_None)
{
*out_value = convert_value_from_python (result.get ());
if (PyErr_Occurred ())
*out_value = NULL;
result = NULL;
}
}
}
}