Introduce gdb.ValuePrinter

There was an earlier thread about adding new methods to
pretty-printers:

https://sourceware.org/pipermail/gdb-patches/2023-June/200503.html

We've known about the need for printer extensibility for a while, but
have been hampered by backward-compatibilty concerns: gdb never
documented that printers might acquire new methods, and so existing
printers may have attribute name clashes.

To solve this problem, this patch adds a new pretty-printer tag class
that signals to gdb that the printer follows new extensibility rules.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30816
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
This commit is contained in:
Tom Tromey
2023-09-07 13:40:29 -06:00
parent 854f72b36d
commit fb28257699
5 changed files with 135 additions and 44 deletions

View File

@@ -27,6 +27,8 @@
#include "python-internal.h"
#include "cli/cli-style.h"
extern PyTypeObject printer_object_type;
/* Return type of print_string_repr. */
enum gdbpy_string_repr_result
@@ -779,3 +781,66 @@ gdbpy_get_print_options (value_print_options *opts)
else
get_user_print_options (opts);
}
/* A ValuePrinter is just a "tag", so it has no state other than that
required by Python. */
struct printer_object
{
PyObject_HEAD
};
/* The ValuePrinter type object. */
PyTypeObject printer_object_type =
{
PyVarObject_HEAD_INIT (NULL, 0)
"gdb.ValuePrinter", /*tp_name*/
sizeof (printer_object), /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
"GDB value printer object", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
};
/* Set up the ValuePrinter type. */
static int
gdbpy_initialize_prettyprint ()
{
if (PyType_Ready (&printer_object_type) < 0)
return -1;
return gdb_pymodule_addobject (gdb_module, "ValuePrinter",
(PyObject *) &printer_object_type);
}
GDBPY_INITIALIZE_FILE (gdbpy_initialize_prettyprint);