Code cleanup: Add objfile_name accessor
[deliverable/binutils-gdb.git] / gdb / python / py-progspace.c
index 45a5193b0ad24bafd579f04654c23560d57dc21b..910c6a3fcb32a65c394f5a08d016fe328f3b8fc4 100644 (file)
@@ -35,11 +35,14 @@ 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;
 } pspace_object;
 
-static PyTypeObject pspace_object_type;
+static PyTypeObject pspace_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("pspace_object");
 
 static const struct program_space_data *pspy_pspace_data_key;
 
@@ -57,7 +60,8 @@ pspy_get_filename (PyObject *self, void *closure)
       struct objfile *objfile = obj->pspace->symfile_object_file;
 
       if (objfile)
-       return PyString_Decode (objfile->name, strlen (objfile->name),
+       return PyString_Decode (objfile_name (objfile),
+                               strlen (objfile_name (objfile)),
                                host_charset (), NULL);
     }
   Py_RETURN_NONE;
@@ -69,6 +73,7 @@ pspy_dealloc (PyObject *self)
   pspace_object *ps_self = (pspace_object *) self;
 
   Py_XDECREF (ps_self->printers);
+  Py_XDECREF (ps_self->frame_filters);
   Py_XDECREF (ps_self->type_printers);
   Py_TYPE (self)->tp_free (self);
 }
@@ -89,6 +94,13 @@ pspy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
          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)
        {
@@ -137,6 +149,47 @@ pspy_set_printers (PyObject *o, PyObject *value, void *ignore)
   return 0;
 }
 
+/* Return the Python dictionary attribute containing frame filters for
+   this program space.  */
+PyObject *
+pspy_get_frame_filters (PyObject *o, void *ignore)
+{
+  pspace_object *self = (pspace_object *) o;
+
+  Py_INCREF (self->frame_filters);
+  return self->frame_filters;
+}
+
+/* Set this object file's frame filters dictionary to FILTERS.  */
+static int
+pspy_set_frame_filters (PyObject *o, PyObject *frame, void *ignore)
+{
+  PyObject *tmp;
+  pspace_object *self = (pspace_object *) o;
+
+  if (! frame)
+    {
+      PyErr_SetString (PyExc_TypeError,
+                      "cannot delete the frame filter attribute");
+      return -1;
+    }
+
+  if (! PyDict_Check (frame))
+    {
+      PyErr_SetString (PyExc_TypeError,
+                      "the frame filter attribute must be a dictionary");
+      return -1;
+    }
+
+  /* Take care in case the LHS and RHS are related somehow.  */
+  tmp = self->frame_filters;
+  Py_INCREF (frame);
+  self->frame_filters = frame;
+  Py_XDECREF (tmp);
+
+  return 0;
+}
+
 /* Get the 'type_printers' attribute.  */
 
 static PyObject *
@@ -221,6 +274,13 @@ pspace_to_pspace_object (struct program_space *pspace)
              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)
            {
@@ -235,18 +295,17 @@ pspace_to_pspace_object (struct program_space *pspace)
   return (PyObject *) object;
 }
 
-void
+int
 gdbpy_initialize_pspace (void)
 {
   pspy_pspace_data_key
     = register_program_space_data_with_cleanup (NULL, py_free_pspace);
 
   if (PyType_Ready (&pspace_object_type) < 0)
-    return;
+    return -1;
 
-  Py_INCREF (&pspace_object_type);
-  PyModule_AddObject (gdb_module, "Progspace",
-                     (PyObject *) &pspace_object_type);
+  return gdb_pymodule_addobject (gdb_module, "Progspace",
+                                (PyObject *) &pspace_object_type);
 }
 
 \f
@@ -257,6 +316,8 @@ static PyGetSetDef pspace_getset[] =
     "The progspace's main filename, or None.", NULL },
   { "pretty_printers", pspy_get_printers, pspy_set_printers,
     "Pretty printers.", NULL },
+  { "frame_filters", pspy_get_frame_filters, pspy_set_frame_filters,
+    "Frame filters.", NULL },
   { "type_printers", pspy_get_type_printers, pspy_set_type_printers,
     "Type printers.", NULL },
   { NULL }
This page took 0.026093 seconds and 4 git commands to generate.