xref: /dflybsd-src/contrib/gdb-7/gdb/python/py-objfile.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
1c50c785cSJohn Marino /* Python interface to objfiles.
2c50c785cSJohn Marino 
3*ef5ccd6cSJohn Marino    Copyright (C) 2008-2013 Free Software Foundation, Inc.
4c50c785cSJohn Marino 
5c50c785cSJohn Marino    This file is part of GDB.
6c50c785cSJohn Marino 
7c50c785cSJohn Marino    This program is free software; you can redistribute it and/or modify
8c50c785cSJohn Marino    it under the terms of the GNU General Public License as published by
9c50c785cSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10c50c785cSJohn Marino    (at your option) any later version.
11c50c785cSJohn Marino 
12c50c785cSJohn Marino    This program is distributed in the hope that it will be useful,
13c50c785cSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14c50c785cSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c50c785cSJohn Marino    GNU General Public License for more details.
16c50c785cSJohn Marino 
17c50c785cSJohn Marino    You should have received a copy of the GNU General Public License
18c50c785cSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19c50c785cSJohn Marino 
20c50c785cSJohn Marino #include "defs.h"
21c50c785cSJohn Marino #include "python-internal.h"
22c50c785cSJohn Marino #include "charset.h"
23c50c785cSJohn Marino #include "objfiles.h"
24c50c785cSJohn Marino #include "language.h"
25c50c785cSJohn Marino 
26c50c785cSJohn Marino typedef struct
27c50c785cSJohn Marino {
28c50c785cSJohn Marino   PyObject_HEAD
29c50c785cSJohn Marino 
30c50c785cSJohn Marino   /* The corresponding objfile.  */
31c50c785cSJohn Marino   struct objfile *objfile;
32c50c785cSJohn Marino 
33c50c785cSJohn Marino   /* The pretty-printer list of functions.  */
34c50c785cSJohn Marino   PyObject *printers;
35*ef5ccd6cSJohn Marino 
36*ef5ccd6cSJohn Marino   /* The type-printer list.  */
37*ef5ccd6cSJohn Marino   PyObject *type_printers;
38c50c785cSJohn Marino } objfile_object;
39c50c785cSJohn Marino 
40c50c785cSJohn Marino static PyTypeObject objfile_object_type;
41c50c785cSJohn Marino 
42c50c785cSJohn Marino static const struct objfile_data *objfpy_objfile_data_key;
43c50c785cSJohn Marino 
44c50c785cSJohn Marino 
45c50c785cSJohn Marino 
46c50c785cSJohn Marino /* An Objfile method which returns the objfile's file name, or None.  */
47c50c785cSJohn Marino static PyObject *
objfpy_get_filename(PyObject * self,void * closure)48c50c785cSJohn Marino objfpy_get_filename (PyObject *self, void *closure)
49c50c785cSJohn Marino {
50c50c785cSJohn Marino   objfile_object *obj = (objfile_object *) self;
51c50c785cSJohn Marino 
52c50c785cSJohn Marino   if (obj->objfile)
53c50c785cSJohn Marino     return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name),
54c50c785cSJohn Marino 			    host_charset (), NULL);
55c50c785cSJohn Marino   Py_RETURN_NONE;
56c50c785cSJohn Marino }
57c50c785cSJohn Marino 
58c50c785cSJohn Marino static void
objfpy_dealloc(PyObject * o)59c50c785cSJohn Marino objfpy_dealloc (PyObject *o)
60c50c785cSJohn Marino {
61c50c785cSJohn Marino   objfile_object *self = (objfile_object *) o;
62c50c785cSJohn Marino 
63c50c785cSJohn Marino   Py_XDECREF (self->printers);
64*ef5ccd6cSJohn Marino   Py_XDECREF (self->type_printers);
65*ef5ccd6cSJohn Marino   Py_TYPE (self)->tp_free (self);
66c50c785cSJohn Marino }
67c50c785cSJohn Marino 
68c50c785cSJohn Marino static PyObject *
objfpy_new(PyTypeObject * type,PyObject * args,PyObject * keywords)69c50c785cSJohn Marino objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
70c50c785cSJohn Marino {
71c50c785cSJohn Marino   objfile_object *self = (objfile_object *) type->tp_alloc (type, 0);
72c50c785cSJohn Marino 
73c50c785cSJohn Marino   if (self)
74c50c785cSJohn Marino     {
75c50c785cSJohn Marino       self->objfile = NULL;
76c50c785cSJohn Marino 
77c50c785cSJohn Marino       self->printers = PyList_New (0);
78c50c785cSJohn Marino       if (!self->printers)
79c50c785cSJohn Marino 	{
80c50c785cSJohn Marino 	  Py_DECREF (self);
81c50c785cSJohn Marino 	  return NULL;
82c50c785cSJohn Marino 	}
83*ef5ccd6cSJohn Marino 
84*ef5ccd6cSJohn Marino       self->type_printers = PyList_New (0);
85*ef5ccd6cSJohn Marino       if (!self->type_printers)
86*ef5ccd6cSJohn Marino 	{
87*ef5ccd6cSJohn Marino 	  Py_DECREF (self);
88*ef5ccd6cSJohn Marino 	  return NULL;
89*ef5ccd6cSJohn Marino 	}
90c50c785cSJohn Marino     }
91c50c785cSJohn Marino   return (PyObject *) self;
92c50c785cSJohn Marino }
93c50c785cSJohn Marino 
94c50c785cSJohn Marino PyObject *
objfpy_get_printers(PyObject * o,void * ignore)95c50c785cSJohn Marino objfpy_get_printers (PyObject *o, void *ignore)
96c50c785cSJohn Marino {
97c50c785cSJohn Marino   objfile_object *self = (objfile_object *) o;
98c50c785cSJohn Marino 
99c50c785cSJohn Marino   Py_INCREF (self->printers);
100c50c785cSJohn Marino   return self->printers;
101c50c785cSJohn Marino }
102c50c785cSJohn Marino 
103c50c785cSJohn Marino static int
objfpy_set_printers(PyObject * o,PyObject * value,void * ignore)104c50c785cSJohn Marino objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
105c50c785cSJohn Marino {
106c50c785cSJohn Marino   PyObject *tmp;
107c50c785cSJohn Marino   objfile_object *self = (objfile_object *) o;
108c50c785cSJohn Marino 
109c50c785cSJohn Marino   if (! value)
110c50c785cSJohn Marino     {
111c50c785cSJohn Marino       PyErr_SetString (PyExc_TypeError,
112c50c785cSJohn Marino 		       _("Cannot delete the pretty_printers attribute."));
113c50c785cSJohn Marino       return -1;
114c50c785cSJohn Marino     }
115c50c785cSJohn Marino 
116c50c785cSJohn Marino   if (! PyList_Check (value))
117c50c785cSJohn Marino     {
118c50c785cSJohn Marino       PyErr_SetString (PyExc_TypeError,
119c50c785cSJohn Marino 		       _("The pretty_printers attribute must be a list."));
120c50c785cSJohn Marino       return -1;
121c50c785cSJohn Marino     }
122c50c785cSJohn Marino 
123c50c785cSJohn Marino   /* Take care in case the LHS and RHS are related somehow.  */
124c50c785cSJohn Marino   tmp = self->printers;
125c50c785cSJohn Marino   Py_INCREF (value);
126c50c785cSJohn Marino   self->printers = value;
127c50c785cSJohn Marino   Py_XDECREF (tmp);
128c50c785cSJohn Marino 
129c50c785cSJohn Marino   return 0;
130c50c785cSJohn Marino }
131c50c785cSJohn Marino 
132*ef5ccd6cSJohn Marino /* Get the 'type_printers' attribute.  */
133*ef5ccd6cSJohn Marino 
134*ef5ccd6cSJohn Marino static PyObject *
objfpy_get_type_printers(PyObject * o,void * ignore)135*ef5ccd6cSJohn Marino objfpy_get_type_printers (PyObject *o, void *ignore)
136*ef5ccd6cSJohn Marino {
137*ef5ccd6cSJohn Marino   objfile_object *self = (objfile_object *) o;
138*ef5ccd6cSJohn Marino 
139*ef5ccd6cSJohn Marino   Py_INCREF (self->type_printers);
140*ef5ccd6cSJohn Marino   return self->type_printers;
141*ef5ccd6cSJohn Marino }
142*ef5ccd6cSJohn Marino 
143*ef5ccd6cSJohn Marino /* Set the 'type_printers' attribute.  */
144*ef5ccd6cSJohn Marino 
145*ef5ccd6cSJohn Marino static int
objfpy_set_type_printers(PyObject * o,PyObject * value,void * ignore)146*ef5ccd6cSJohn Marino objfpy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
147*ef5ccd6cSJohn Marino {
148*ef5ccd6cSJohn Marino   PyObject *tmp;
149*ef5ccd6cSJohn Marino   objfile_object *self = (objfile_object *) o;
150*ef5ccd6cSJohn Marino 
151*ef5ccd6cSJohn Marino   if (! value)
152*ef5ccd6cSJohn Marino     {
153*ef5ccd6cSJohn Marino       PyErr_SetString (PyExc_TypeError,
154*ef5ccd6cSJohn Marino 		       _("Cannot delete the type_printers attribute."));
155*ef5ccd6cSJohn Marino       return -1;
156*ef5ccd6cSJohn Marino     }
157*ef5ccd6cSJohn Marino 
158*ef5ccd6cSJohn Marino   if (! PyList_Check (value))
159*ef5ccd6cSJohn Marino     {
160*ef5ccd6cSJohn Marino       PyErr_SetString (PyExc_TypeError,
161*ef5ccd6cSJohn Marino 		       _("The type_printers attribute must be a list."));
162*ef5ccd6cSJohn Marino       return -1;
163*ef5ccd6cSJohn Marino     }
164*ef5ccd6cSJohn Marino 
165*ef5ccd6cSJohn Marino   /* Take care in case the LHS and RHS are related somehow.  */
166*ef5ccd6cSJohn Marino   tmp = self->type_printers;
167*ef5ccd6cSJohn Marino   Py_INCREF (value);
168*ef5ccd6cSJohn Marino   self->type_printers = value;
169*ef5ccd6cSJohn Marino   Py_XDECREF (tmp);
170*ef5ccd6cSJohn Marino 
171*ef5ccd6cSJohn Marino   return 0;
172*ef5ccd6cSJohn Marino }
173*ef5ccd6cSJohn Marino 
174c50c785cSJohn Marino /* Implementation of gdb.Objfile.is_valid (self) -> Boolean.
175c50c785cSJohn Marino    Returns True if this object file still exists in GDB.  */
176c50c785cSJohn Marino 
177c50c785cSJohn Marino static PyObject *
objfpy_is_valid(PyObject * self,PyObject * args)178c50c785cSJohn Marino objfpy_is_valid (PyObject *self, PyObject *args)
179c50c785cSJohn Marino {
180c50c785cSJohn Marino   objfile_object *obj = (objfile_object *) self;
181c50c785cSJohn Marino 
182c50c785cSJohn Marino   if (! obj->objfile)
183c50c785cSJohn Marino     Py_RETURN_FALSE;
184c50c785cSJohn Marino 
185c50c785cSJohn Marino   Py_RETURN_TRUE;
186c50c785cSJohn Marino }
187c50c785cSJohn Marino 
188c50c785cSJohn Marino 
189c50c785cSJohn Marino 
190c50c785cSJohn Marino /* Clear the OBJFILE pointer in an Objfile object and remove the
191c50c785cSJohn Marino    reference.  */
192c50c785cSJohn Marino static void
py_free_objfile(struct objfile * objfile,void * datum)193c50c785cSJohn Marino py_free_objfile (struct objfile *objfile, void *datum)
194c50c785cSJohn Marino {
195c50c785cSJohn Marino   struct cleanup *cleanup;
196c50c785cSJohn Marino   objfile_object *object = datum;
197c50c785cSJohn Marino 
198c50c785cSJohn Marino   cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
199c50c785cSJohn Marino   object->objfile = NULL;
200c50c785cSJohn Marino   Py_DECREF ((PyObject *) object);
201c50c785cSJohn Marino   do_cleanups (cleanup);
202c50c785cSJohn Marino }
203c50c785cSJohn Marino 
204c50c785cSJohn Marino /* Return a borrowed reference to the Python object of type Objfile
205c50c785cSJohn Marino    representing OBJFILE.  If the object has already been created,
206c50c785cSJohn Marino    return it.  Otherwise, create it.  Return NULL and set the Python
207c50c785cSJohn Marino    error on failure.  */
208c50c785cSJohn Marino PyObject *
objfile_to_objfile_object(struct objfile * objfile)209c50c785cSJohn Marino objfile_to_objfile_object (struct objfile *objfile)
210c50c785cSJohn Marino {
211c50c785cSJohn Marino   objfile_object *object;
212c50c785cSJohn Marino 
213c50c785cSJohn Marino   object = objfile_data (objfile, objfpy_objfile_data_key);
214c50c785cSJohn Marino   if (!object)
215c50c785cSJohn Marino     {
216c50c785cSJohn Marino       object = PyObject_New (objfile_object, &objfile_object_type);
217c50c785cSJohn Marino       if (object)
218c50c785cSJohn Marino 	{
219c50c785cSJohn Marino 	  object->objfile = objfile;
220c50c785cSJohn Marino 
221c50c785cSJohn Marino 	  object->printers = PyList_New (0);
222c50c785cSJohn Marino 	  if (!object->printers)
223c50c785cSJohn Marino 	    {
224c50c785cSJohn Marino 	      Py_DECREF (object);
225c50c785cSJohn Marino 	      return NULL;
226c50c785cSJohn Marino 	    }
227c50c785cSJohn Marino 
228*ef5ccd6cSJohn Marino 	  object->type_printers = PyList_New (0);
229*ef5ccd6cSJohn Marino 	  if (!object->type_printers)
230*ef5ccd6cSJohn Marino 	    {
231*ef5ccd6cSJohn Marino 	      Py_DECREF (object);
232*ef5ccd6cSJohn Marino 	      return NULL;
233*ef5ccd6cSJohn Marino 	    }
234*ef5ccd6cSJohn Marino 
235c50c785cSJohn Marino 	  set_objfile_data (objfile, objfpy_objfile_data_key, object);
236c50c785cSJohn Marino 	}
237c50c785cSJohn Marino     }
238c50c785cSJohn Marino 
239c50c785cSJohn Marino   return (PyObject *) object;
240c50c785cSJohn Marino }
241c50c785cSJohn Marino 
242c50c785cSJohn Marino void
gdbpy_initialize_objfile(void)243c50c785cSJohn Marino gdbpy_initialize_objfile (void)
244c50c785cSJohn Marino {
245c50c785cSJohn Marino   objfpy_objfile_data_key
246c50c785cSJohn Marino     = register_objfile_data_with_cleanup (NULL, py_free_objfile);
247c50c785cSJohn Marino 
248c50c785cSJohn Marino   if (PyType_Ready (&objfile_object_type) < 0)
249c50c785cSJohn Marino     return;
250c50c785cSJohn Marino 
251c50c785cSJohn Marino   Py_INCREF (&objfile_object_type);
252c50c785cSJohn Marino   PyModule_AddObject (gdb_module, "Objfile",
253c50c785cSJohn Marino 		      (PyObject *) &objfile_object_type);
254c50c785cSJohn Marino }
255c50c785cSJohn Marino 
256c50c785cSJohn Marino 
257c50c785cSJohn Marino 
258c50c785cSJohn Marino static PyMethodDef objfile_object_methods[] =
259c50c785cSJohn Marino {
260c50c785cSJohn Marino   { "is_valid", objfpy_is_valid, METH_NOARGS,
261c50c785cSJohn Marino     "is_valid () -> Boolean.\n\
262c50c785cSJohn Marino Return true if this object file is valid, false if not." },
263c50c785cSJohn Marino 
264c50c785cSJohn Marino   { NULL }
265c50c785cSJohn Marino };
266c50c785cSJohn Marino 
267c50c785cSJohn Marino static PyGetSetDef objfile_getset[] =
268c50c785cSJohn Marino {
269c50c785cSJohn Marino   { "filename", objfpy_get_filename, NULL,
270c50c785cSJohn Marino     "The objfile's filename, or None.", NULL },
271c50c785cSJohn Marino   { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
272c50c785cSJohn Marino     "Pretty printers.", NULL },
273*ef5ccd6cSJohn Marino   { "type_printers", objfpy_get_type_printers, objfpy_set_type_printers,
274*ef5ccd6cSJohn Marino     "Type printers.", NULL },
275c50c785cSJohn Marino   { NULL }
276c50c785cSJohn Marino };
277c50c785cSJohn Marino 
278c50c785cSJohn Marino static PyTypeObject objfile_object_type =
279c50c785cSJohn Marino {
280*ef5ccd6cSJohn Marino   PyVarObject_HEAD_INIT (NULL, 0)
281c50c785cSJohn Marino   "gdb.Objfile",		  /*tp_name*/
282c50c785cSJohn Marino   sizeof (objfile_object),	  /*tp_basicsize*/
283c50c785cSJohn Marino   0,				  /*tp_itemsize*/
284c50c785cSJohn Marino   objfpy_dealloc,		  /*tp_dealloc*/
285c50c785cSJohn Marino   0,				  /*tp_print*/
286c50c785cSJohn Marino   0,				  /*tp_getattr*/
287c50c785cSJohn Marino   0,				  /*tp_setattr*/
288c50c785cSJohn Marino   0,				  /*tp_compare*/
289c50c785cSJohn Marino   0,				  /*tp_repr*/
290c50c785cSJohn Marino   0,				  /*tp_as_number*/
291c50c785cSJohn Marino   0,				  /*tp_as_sequence*/
292c50c785cSJohn Marino   0,				  /*tp_as_mapping*/
293c50c785cSJohn Marino   0,				  /*tp_hash */
294c50c785cSJohn Marino   0,				  /*tp_call*/
295c50c785cSJohn Marino   0,				  /*tp_str*/
296c50c785cSJohn Marino   0,				  /*tp_getattro*/
297c50c785cSJohn Marino   0,				  /*tp_setattro*/
298c50c785cSJohn Marino   0,				  /*tp_as_buffer*/
299c50c785cSJohn Marino   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
300c50c785cSJohn Marino   "GDB objfile object",		  /* tp_doc */
301c50c785cSJohn Marino   0,				  /* tp_traverse */
302c50c785cSJohn Marino   0,				  /* tp_clear */
303c50c785cSJohn Marino   0,				  /* tp_richcompare */
304c50c785cSJohn Marino   0,				  /* tp_weaklistoffset */
305c50c785cSJohn Marino   0,				  /* tp_iter */
306c50c785cSJohn Marino   0,				  /* tp_iternext */
307c50c785cSJohn Marino   objfile_object_methods,	  /* tp_methods */
308c50c785cSJohn Marino   0,				  /* tp_members */
309c50c785cSJohn Marino   objfile_getset,		  /* tp_getset */
310c50c785cSJohn Marino   0,				  /* tp_base */
311c50c785cSJohn Marino   0,				  /* tp_dict */
312c50c785cSJohn Marino   0,				  /* tp_descr_get */
313c50c785cSJohn Marino   0,				  /* tp_descr_set */
314c50c785cSJohn Marino   0,				  /* tp_dictoffset */
315c50c785cSJohn Marino   0,				  /* tp_init */
316c50c785cSJohn Marino   0,				  /* tp_alloc */
317c50c785cSJohn Marino   objfpy_new,			  /* tp_new */
318c50c785cSJohn Marino };
319