GDB (xrefs)
py-event.c
Go to the documentation of this file.
1 /* Python interface to inferior events.
2 
3  Copyright (C) 2009-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "py-event.h"
22 
23 void
24 evpy_dealloc (PyObject *self)
25 {
26  Py_XDECREF (((event_object *) self)->dict);
27  Py_TYPE (self)->tp_free (self);
28 }
29 
30 PyObject *
31 create_event_object (PyTypeObject *py_type)
32 {
33  event_object *event_obj;
34 
35  event_obj = PyObject_New (event_object, py_type);
36  if (!event_obj)
37  goto fail;
38 
39  event_obj->dict = PyDict_New ();
40  if (!event_obj->dict)
41  goto fail;
42 
43  return (PyObject*) event_obj;
44 
45  fail:
46  Py_XDECREF (event_obj);
47  return NULL;
48 }
49 
50 /* Add the attribute ATTR to the event object EVENT. In
51  python this attribute will be accessible by the name NAME.
52  returns 0 if the operation succeeds and -1 otherwise. This
53  function acquires a new reference to ATTR. */
54 
55 int
56 evpy_add_attribute (PyObject *event, char *name, PyObject *attr)
57 {
58  return PyObject_SetAttrString (event, name, attr);
59 }
60 
61 /* Initialize the Python event code. */
62 
63 int
65 {
67  "Event");
68 }
69 
70 /* Initialize the given event type. If BASE is not NULL it will
71  be set as the types base.
72  Returns 0 if initialization was successful -1 otherwise. */
73 
74 int
76  char *name)
77 {
78  if (PyType_Ready (type) < 0)
79  return -1;
80 
81  return gdb_pymodule_addobject (gdb_module, name, (PyObject *) type);
82 }
83 
84 
85 /* Notify the list of listens that the given EVENT has occurred.
86  returns 0 if emit is successful -1 otherwise. */
87 
88 int
89 evpy_emit_event (PyObject *event,
90  eventregistry_object *registry)
91 {
92  PyObject *callback_list_copy = NULL;
93  Py_ssize_t i;
94 
95  /* Create a copy of call back list and use that for
96  notifying listeners to avoid skipping callbacks
97  in the case of a callback being disconnected during
98  a notification. */
99  callback_list_copy = PySequence_List (registry->callbacks);
100  if (!callback_list_copy)
101  goto fail;
102 
103  for (i = 0; i < PyList_Size (callback_list_copy); i++)
104  {
105  PyObject *func = PyList_GetItem (callback_list_copy, i);
106  PyObject *func_result;
107 
108  if (func == NULL)
109  goto fail;
110 
111  func_result = PyObject_CallFunctionObjArgs (func, event, NULL);
112 
113  if (func_result == NULL)
114  {
115  /* Print the trace here, but keep going -- we want to try to
116  call all of the callbacks even if one is broken. */
118  }
119  else
120  {
121  Py_DECREF (func_result);
122  }
123  }
124 
125  Py_XDECREF (callback_list_copy);
126  Py_XDECREF (event);
127  return 0;
128 
129  fail:
131  Py_XDECREF (callback_list_copy);
132  Py_XDECREF (event);
133  return -1;
134 }
135 
136 static PyGetSetDef event_object_getset[] =
137 {
138  { "__dict__", gdb_py_generic_dict, NULL,
139  "The __dict__ for this event.", &event_object_type },
140  { NULL }
141 };
142 
143 PyTypeObject event_object_type =
144 {
145  PyVarObject_HEAD_INIT (NULL, 0)
146  "gdb.Event", /* tp_name */
147  sizeof (event_object), /* tp_basicsize */
148  0, /* tp_itemsize */
149  evpy_dealloc, /* tp_dealloc */
150  0, /* tp_print */
151  0, /* tp_getattr */
152  0, /* tp_setattr */
153  0, /* tp_compare */
154  0, /* tp_repr */
155  0, /* tp_as_number */
156  0, /* tp_as_sequence */
157  0, /* tp_as_mapping */
158  0, /* tp_hash */
159  0, /* tp_call */
160  0, /* tp_str */
161  0, /* tp_getattro */
162  0, /* tp_setattro */
163  0, /* tp_as_buffer */
164  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
165  "GDB event object", /* tp_doc */
166  0, /* tp_traverse */
167  0, /* tp_clear */
168  0, /* tp_richcompare */
169  0, /* tp_weaklistoffset */
170  0, /* tp_iter */
171  0, /* tp_iternext */
172  0, /* tp_methods */
173  0, /* tp_members */
174  event_object_getset, /* tp_getset */
175  0, /* tp_base */
176  0, /* tp_dict */
177  0, /* tp_descr_get */
178  0, /* tp_descr_set */
179  offsetof (event_object, dict), /* tp_dictoffset */
180  0, /* tp_init */
181  0 /* tp_alloc */
182 };
int gdb_pymodule_addobject(PyObject *module, const char *name, PyObject *object)
Definition: py-utils.c:437
#define Py_DECREF(op)
void evpy_dealloc(PyObject *self)
Definition: py-event.c:24
PyObject * gdb_py_generic_dict(PyObject *self, void *closure)
Definition: py-utils.c:420
PyObject_HEAD PyObject * dict
Definition: py-event.h:101
void(* func)(char *)
PyObject_HEAD PyObject * callbacks
Definition: py-events.h:37
const char *const name
Definition: aarch64-tdep.c:68
int gdbpy_initialize_event(void)
Definition: py-event.c:64
Definition: gdbtypes.h:749
int evpy_add_attribute(PyObject *event, char *name, PyObject *attr)
Definition: py-event.c:56
PyObject * create_event_object(PyTypeObject *py_type)
Definition: py-event.c:31
PyTypeObject event_object_type
Definition: py-event.c:143
void gdbpy_print_stack(void)
Definition: python.c:1199
int gdbpy_initialize_event_generic(PyTypeObject *type, char *name)
Definition: py-event.c:75
static PyGetSetDef event_object_getset[]
Definition: py-event.c:136
int evpy_emit_event(PyObject *event, eventregistry_object *registry)
Definition: py-event.c:89
PyObject * gdb_module
Definition: python.c:112
#define Py_TYPE(ob)
#define PyVarObject_HEAD_INIT(type, size)