X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-objfile.c;h=d4110bcaa24f69bc17d969d7b76d6dbe8c3425dc;hb=9a27f2c60d760a95a27e336750f26f69f91dd156;hp=732edb0077f56787d561965272df716326ff4730;hpb=f92adf3ccc9f87786c3ed6ca1bf2ced52cfbcd62;p=binutils-gdb.git diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 732edb0077f..d4110bcaa24 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -1,6 +1,6 @@ /* Python interface to objfiles. - Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2008-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -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; @@ -45,7 +48,8 @@ static PyObject * objfpy_get_filename (PyObject *self, void *closure) { objfile_object *obj = (objfile_object *) self; - if (obj->objfile && obj->objfile->name) + + if (obj->objfile) return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name), host_charset (), NULL); Py_RETURN_NONE; @@ -55,14 +59,17 @@ static void objfpy_dealloc (PyObject *o) { objfile_object *self = (objfile_object *) o; + Py_XDECREF (self->printers); - self->ob_type->tp_free ((PyObject *) self); + Py_XDECREF (self->type_printers); + Py_TYPE (self)->tp_free (self); } static PyObject * objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords) { objfile_object *self = (objfile_object *) type->tp_alloc (type, 0); + if (self) { self->objfile = NULL; @@ -73,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; } @@ -81,6 +95,7 @@ PyObject * objfpy_get_printers (PyObject *o, void *ignore) { objfile_object *self = (objfile_object *) o; + Py_INCREF (self->printers); return self->printers; } @@ -90,6 +105,7 @@ objfpy_set_printers (PyObject *o, PyObject *value, void *ignore) { PyObject *tmp; objfile_object *self = (objfile_object *) o; + if (! value) { PyErr_SetString (PyExc_TypeError, @@ -113,6 +129,62 @@ 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. */ + +static PyObject * +objfpy_is_valid (PyObject *self, PyObject *args) +{ + objfile_object *obj = (objfile_object *) self; + + if (! obj->objfile) + Py_RETURN_FALSE; + + Py_RETURN_TRUE; +} + /* Clear the OBJFILE pointer in an Objfile object and remove the @@ -153,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); } } @@ -170,24 +249,35 @@ gdbpy_initialize_objfile (void) return; Py_INCREF (&objfile_object_type); - PyModule_AddObject (gdb_module, "Objfile", (PyObject *) &objfile_object_type); + PyModule_AddObject (gdb_module, "Objfile", + (PyObject *) &objfile_object_type); } +static PyMethodDef objfile_object_methods[] = +{ + { "is_valid", objfpy_is_valid, METH_NOARGS, + "is_valid () -> Boolean.\n\ +Return true if this object file is valid, false if not." }, + + { NULL } +}; + static PyGetSetDef objfile_getset[] = { { "filename", objfpy_get_filename, NULL, "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 } }; 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*/ @@ -214,7 +304,7 @@ static PyTypeObject objfile_object_type = 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + objfile_object_methods, /* tp_methods */ 0, /* tp_members */ objfile_getset, /* tp_getset */ 0, /* tp_base */