* NEWS: Update.
* data-directory/Makefile.in (PYTHON_FILES): Add type_printers.py. * python/lib/gdb/command/type_printers.py: New file. * python/lib/gdb/command/types.py (TypePrinter): New class. (_get_some_type_recognizers, get_type_recognizers, apply_type_recognizers, register_type_printer): New functions. * python/py-objfile.c (objfile_object) <type_printers>: New field. (objfpy_dealloc): Decref new field. (objfpy_new): Set new field. (objfpy_get_type_printers, objfpy_set_type_printers): New functions. (objfile_to_objfile_object): Set new field. (objfile_getset): Add "type_printers". * python/py-progspace.c (pspace_object) <type_printers>: New field. (pspy_dealloc): Decref new field. (pspy_new): Set new field. (pspy_get_type_printers, pspy_set_type_printers): New functions. (pspace_to_pspace_object): Set new field. (pspace_getset): Add "type_printers". * python/python.c (start_type_printers, apply_type_printers, free_type_printers): New functions. (_initialize_python): Set gdb.type_printers. * python/python.h (start_type_printers, apply_type_printers, free_type_printers): Declare. * typeprint.c (type_print_raw_options, default_ptype_flags): Update for new fields. (do_free_global_table, create_global_typedef_table, find_global_typedef): New functions. (find_typedef_in_hash): Use find_global_typedef. (whatis_exp): Use create_global_typedef_table. Change cleanup handling. * typeprint.h (struct type_print_options) <global_typedefs, global_printers>: New fields. doc * gdb.texinfo (Symbols): Document "info type-printers", "enable type-printer" and "disable type-printer". (Python API): Add new node to menu. (Type Printing API): New node. (Progspaces In Python): Document type_printers field. (Objfiles In Python): Likewise. (gdb.types) <get_type_recognizers, apply_type_recognizers, register_type_printer, TypePrinter>: Document. testsuite * gdb.base/completion.exp: Update for "info type-printers". * gdb.python/py-typeprint.cc: New file. * gdb.python/py-typeprint.exp: New file. * gdb.python/py-typeprint.py: New file.
This commit is contained in:
parent
bd69fc683f
commit
18a9fc1261
19 changed files with 874 additions and 17 deletions
|
@ -32,6 +32,9 @@ typedef struct
|
|||
|
||||
/* The pretty-printer list of functions. */
|
||||
PyObject *printers;
|
||||
|
||||
/* The type-printer list. */
|
||||
PyObject *type_printers;
|
||||
} objfile_object;
|
||||
|
||||
static PyTypeObject objfile_object_type;
|
||||
|
@ -58,6 +61,7 @@ objfpy_dealloc (PyObject *o)
|
|||
objfile_object *self = (objfile_object *) o;
|
||||
|
||||
Py_XDECREF (self->printers);
|
||||
Py_XDECREF (self->type_printers);
|
||||
self->ob_type->tp_free ((PyObject *) self);
|
||||
}
|
||||
|
||||
|
@ -76,6 +80,13 @@ objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
|
|||
Py_DECREF (self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->type_printers = PyList_New (0);
|
||||
if (!self->type_printers)
|
||||
{
|
||||
Py_DECREF (self);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return (PyObject *) self;
|
||||
}
|
||||
|
@ -118,6 +129,48 @@ objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Get the 'type_printers' attribute. */
|
||||
|
||||
static PyObject *
|
||||
objfpy_get_type_printers (PyObject *o, void *ignore)
|
||||
{
|
||||
objfile_object *self = (objfile_object *) o;
|
||||
|
||||
Py_INCREF (self->type_printers);
|
||||
return self->type_printers;
|
||||
}
|
||||
|
||||
/* Set the 'type_printers' attribute. */
|
||||
|
||||
static int
|
||||
objfpy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
|
||||
{
|
||||
PyObject *tmp;
|
||||
objfile_object *self = (objfile_object *) o;
|
||||
|
||||
if (! value)
|
||||
{
|
||||
PyErr_SetString (PyExc_TypeError,
|
||||
_("Cannot delete the type_printers attribute."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (! PyList_Check (value))
|
||||
{
|
||||
PyErr_SetString (PyExc_TypeError,
|
||||
_("The type_printers attribute must be a list."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Take care in case the LHS and RHS are related somehow. */
|
||||
tmp = self->type_printers;
|
||||
Py_INCREF (value);
|
||||
self->type_printers = value;
|
||||
Py_XDECREF (tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Implementation of gdb.Objfile.is_valid (self) -> Boolean.
|
||||
Returns True if this object file still exists in GDB. */
|
||||
|
||||
|
@ -172,6 +225,13 @@ objfile_to_objfile_object (struct objfile *objfile)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
object->type_printers = PyList_New (0);
|
||||
if (!object->type_printers)
|
||||
{
|
||||
Py_DECREF (object);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
set_objfile_data (objfile, objfpy_objfile_data_key, object);
|
||||
}
|
||||
}
|
||||
|
@ -210,6 +270,8 @@ static PyGetSetDef objfile_getset[] =
|
|||
"The objfile's filename, or None.", NULL },
|
||||
{ "pretty_printers", objfpy_get_printers, objfpy_set_printers,
|
||||
"Pretty printers.", NULL },
|
||||
{ "type_printers", objfpy_get_type_printers, objfpy_set_type_printers,
|
||||
"Type printers.", NULL },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue