gdb/python/py-progspace.c - gdb
Global variables defined
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "python-internal.h"
- #include "charset.h"
- #include "progspace.h"
- #include "objfiles.h"
- #include "language.h"
- #include "arch-utils.h"
- typedef struct
- {
- PyObject_HEAD
-
- struct program_space *pspace;
-
- PyObject *dict;
-
- PyObject *printers;
-
- PyObject *frame_filters;
-
- PyObject *type_printers;
-
- PyObject *xmethods;
- } pspace_object;
- static PyTypeObject pspace_object_type
- CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("pspace_object");
- static const struct program_space_data *pspy_pspace_data_key;
- static PyObject *
- pspy_get_filename (PyObject *self, void *closure)
- {
- pspace_object *obj = (pspace_object *) self;
- if (obj->pspace)
- {
- struct objfile *objfile = obj->pspace->symfile_object_file;
- if (objfile)
- return PyString_Decode (objfile_name (objfile),
- strlen (objfile_name (objfile)),
- host_charset (), NULL);
- }
- Py_RETURN_NONE;
- }
- static void
- pspy_dealloc (PyObject *self)
- {
- pspace_object *ps_self = (pspace_object *) self;
- Py_XDECREF (ps_self->dict);
- Py_XDECREF (ps_self->printers);
- Py_XDECREF (ps_self->frame_filters);
- Py_XDECREF (ps_self->type_printers);
- Py_XDECREF (ps_self->xmethods);
- Py_TYPE (self)->tp_free (self);
- }
- static int
- pspy_initialize (pspace_object *self)
- {
- self->pspace = NULL;
- self->dict = NULL;
- self->printers = PyList_New (0);
- if (self->printers == NULL)
- return 0;
- self->frame_filters = PyDict_New ();
- if (self->frame_filters == NULL)
- return 0;
- self->type_printers = PyList_New (0);
- if (self->type_printers == NULL)
- return 0;
- self->xmethods = PyList_New (0);
- if (self->xmethods == NULL)
- return 0;
- return 1;
- }
- static PyObject *
- pspy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
- {
- pspace_object *self = (pspace_object *) type->tp_alloc (type, 0);
- if (self)
- {
- if (!pspy_initialize (self))
- {
- Py_DECREF (self);
- return NULL;
- }
- }
- return (PyObject *) self;
- }
- PyObject *
- pspy_get_printers (PyObject *o, void *ignore)
- {
- pspace_object *self = (pspace_object *) o;
- Py_INCREF (self->printers);
- return self->printers;
- }
- static int
- pspy_set_printers (PyObject *o, PyObject *value, void *ignore)
- {
- PyObject *tmp;
- pspace_object *self = (pspace_object *) o;
- if (! value)
- {
- PyErr_SetString (PyExc_TypeError,
- "cannot delete the pretty_printers attribute");
- return -1;
- }
- if (! PyList_Check (value))
- {
- PyErr_SetString (PyExc_TypeError,
- "the pretty_printers attribute must be a list");
- return -1;
- }
-
- tmp = self->printers;
- Py_INCREF (value);
- self->printers = value;
- Py_XDECREF (tmp);
- return 0;
- }
- PyObject *
- pspy_get_frame_filters (PyObject *o, void *ignore)
- {
- pspace_object *self = (pspace_object *) o;
- Py_INCREF (self->frame_filters);
- return self->frame_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;
- }
-
- tmp = self->frame_filters;
- Py_INCREF (frame);
- self->frame_filters = frame;
- Py_XDECREF (tmp);
- return 0;
- }
- static PyObject *
- pspy_get_type_printers (PyObject *o, void *ignore)
- {
- pspace_object *self = (pspace_object *) o;
- Py_INCREF (self->type_printers);
- return self->type_printers;
- }
- PyObject *
- pspy_get_xmethods (PyObject *o, void *ignore)
- {
- pspace_object *self = (pspace_object *) o;
- Py_INCREF (self->xmethods);
- return self->xmethods;
- }
- static int
- pspy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
- {
- PyObject *tmp;
- pspace_object *self = (pspace_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;
- }
-
- tmp = self->type_printers;
- Py_INCREF (value);
- self->type_printers = value;
- Py_XDECREF (tmp);
- return 0;
- }
- static void
- py_free_pspace (struct program_space *pspace, void *datum)
- {
- struct cleanup *cleanup;
- pspace_object *object = datum;
-
- struct gdbarch *arch = target_gdbarch ();
- cleanup = ensure_python_env (arch, current_language);
- object->pspace = NULL;
- Py_DECREF ((PyObject *) object);
- do_cleanups (cleanup);
- }
- PyObject *
- pspace_to_pspace_object (struct program_space *pspace)
- {
- pspace_object *object;
- object = program_space_data (pspace, pspy_pspace_data_key);
- if (!object)
- {
- object = PyObject_New (pspace_object, &pspace_object_type);
- if (object)
- {
- if (!pspy_initialize (object))
- {
- Py_DECREF (object);
- return NULL;
- }
- object->pspace = pspace;
- set_program_space_data (pspace, pspy_pspace_data_key, object);
- }
- }
- return (PyObject *) object;
- }
- 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 -1;
- return gdb_pymodule_addobject (gdb_module, "Progspace",
- (PyObject *) &pspace_object_type);
- }
- static PyGetSetDef pspace_getset[] =
- {
- { "__dict__", gdb_py_generic_dict, NULL,
- "The __dict__ for this progspace.", &pspace_object_type },
- { "filename", pspy_get_filename, NULL,
- "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 },
- { "xmethods", pspy_get_xmethods, NULL,
- "Debug methods.", NULL },
- { NULL }
- };
- static PyTypeObject pspace_object_type =
- {
- PyVarObject_HEAD_INIT (NULL, 0)
- "gdb.Progspace",
- sizeof (pspace_object),
- 0,
- pspy_dealloc,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- Py_TPFLAGS_DEFAULT,
- "GDB progspace object",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- pspace_getset,
- 0,
- 0,
- 0,
- 0,
- offsetof (pspace_object, dict),
- 0,
- 0,
- pspy_new,
- };