| Index: gdb/python/py-objfile.c
|
| diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
|
| index 9fa6813f62e74aad1749f68663a907d8a2a63e98..9bbd4c22183f69dbe46849b7c927e90e65167b97 100644
|
| --- a/gdb/python/py-objfile.c
|
| +++ b/gdb/python/py-objfile.c
|
| @@ -1,6 +1,6 @@
|
| /* Python interface to objfiles.
|
|
|
| - Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -32,9 +32,15 @@ typedef struct
|
|
|
| /* The pretty-printer list of functions. */
|
| PyObject *printers;
|
| +
|
| + /* The frame filter list of functions. */
|
| + PyObject *frame_filters;
|
| + /* The type-printer list. */
|
| + PyObject *type_printers;
|
| } objfile_object;
|
|
|
| -static PyTypeObject objfile_object_type;
|
| +static PyTypeObject objfile_object_type
|
| + CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("objfile_object");
|
|
|
| static const struct objfile_data *objfpy_objfile_data_key;
|
|
|
| @@ -47,7 +53,8 @@ objfpy_get_filename (PyObject *self, void *closure)
|
| objfile_object *obj = (objfile_object *) self;
|
|
|
| if (obj->objfile)
|
| - return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name),
|
| + return PyString_Decode (objfile_name (obj->objfile),
|
| + strlen (objfile_name (obj->objfile)),
|
| host_charset (), NULL);
|
| Py_RETURN_NONE;
|
| }
|
| @@ -58,7 +65,9 @@ objfpy_dealloc (PyObject *o)
|
| objfile_object *self = (objfile_object *) o;
|
|
|
| Py_XDECREF (self->printers);
|
| - self->ob_type->tp_free ((PyObject *) self);
|
| + Py_XDECREF (self->frame_filters);
|
| + Py_XDECREF (self->type_printers);
|
| + Py_TYPE (self)->tp_free (self);
|
| }
|
|
|
| static PyObject *
|
| @@ -76,6 +85,20 @@ objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
|
| Py_DECREF (self);
|
| return NULL;
|
| }
|
| +
|
| + self->frame_filters = PyDict_New ();
|
| + if (!self->frame_filters)
|
| + {
|
| + 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 +141,89 @@ objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
|
| return 0;
|
| }
|
|
|
| +/* Return the Python dictionary attribute containing frame filters for
|
| + this object file. */
|
| +PyObject *
|
| +objfpy_get_frame_filters (PyObject *o, void *ignore)
|
| +{
|
| + objfile_object *self = (objfile_object *) o;
|
| +
|
| + Py_INCREF (self->frame_filters);
|
| + return self->frame_filters;
|
| +}
|
| +
|
| +/* Set this object file's frame filters dictionary to FILTERS. */
|
| +static int
|
| +objfpy_set_frame_filters (PyObject *o, PyObject *filters, void *ignore)
|
| +{
|
| + PyObject *tmp;
|
| + objfile_object *self = (objfile_object *) o;
|
| +
|
| + if (! filters)
|
| + {
|
| + PyErr_SetString (PyExc_TypeError,
|
| + _("Cannot delete the frame filters attribute."));
|
| + return -1;
|
| + }
|
| +
|
| + if (! PyDict_Check (filters))
|
| + {
|
| + PyErr_SetString (PyExc_TypeError,
|
| + _("The frame_filters attribute must be a dictionary."));
|
| + return -1;
|
| + }
|
| +
|
| + /* Take care in case the LHS and RHS are related somehow. */
|
| + tmp = self->frame_filters;
|
| + Py_INCREF (filters);
|
| + self->frame_filters = filters;
|
| + Py_XDECREF (tmp);
|
| +
|
| + 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 +278,20 @@ objfile_to_objfile_object (struct objfile *objfile)
|
| return NULL;
|
| }
|
|
|
| + object->frame_filters = PyDict_New ();
|
| + if (!object->frame_filters)
|
| + {
|
| + Py_DECREF (object);
|
| + 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);
|
| }
|
| }
|
| @@ -179,18 +299,17 @@ objfile_to_objfile_object (struct objfile *objfile)
|
| return (PyObject *) object;
|
| }
|
|
|
| -void
|
| +int
|
| gdbpy_initialize_objfile (void)
|
| {
|
| objfpy_objfile_data_key
|
| = register_objfile_data_with_cleanup (NULL, py_free_objfile);
|
|
|
| if (PyType_Ready (&objfile_object_type) < 0)
|
| - return;
|
| + return -1;
|
|
|
| - Py_INCREF (&objfile_object_type);
|
| - PyModule_AddObject (gdb_module, "Objfile",
|
| - (PyObject *) &objfile_object_type);
|
| + return gdb_pymodule_addobject (gdb_module, "Objfile",
|
| + (PyObject *) &objfile_object_type);
|
| }
|
|
|
|
|
| @@ -210,13 +329,16 @@ static PyGetSetDef objfile_getset[] =
|
| "The objfile's filename, or None.", NULL },
|
| { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
|
| "Pretty printers.", NULL },
|
| + { "frame_filters", objfpy_get_frame_filters,
|
| + objfpy_set_frame_filters, "Frame Filters.", NULL },
|
| + { "type_printers", objfpy_get_type_printers, objfpy_set_type_printers,
|
| + "Type printers.", NULL },
|
| { NULL }
|
| };
|
|
|
| static PyTypeObject objfile_object_type =
|
| {
|
| - PyObject_HEAD_INIT (NULL)
|
| - 0, /*ob_size*/
|
| + PyVarObject_HEAD_INIT (NULL, 0)
|
| "gdb.Objfile", /*tp_name*/
|
| sizeof (objfile_object), /*tp_basicsize*/
|
| 0, /*tp_itemsize*/
|
|
|