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