Add support for Python 3.
[binutils-gdb.git] / gdb / python / py-objfile.c
index 732edb0077f56787d561965272df716326ff4730..d4110bcaa24f69bc17d969d7b76d6dbe8c3425dc 100644 (file)
@@ -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;
+}
+
 \f
 
 /* 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);
 }
 
 \f
 
+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 */