GDB (xrefs)
py-event.c
Go to the documentation of this file.
1 /* Python interface to inferior events.
2 
3  Copyright (C) 2009-2018 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 
31 create_event_object (PyTypeObject *py_type)
32 {
33  gdbpy_ref<event_object> event_obj (PyObject_New (event_object, py_type));
34  if (event_obj == NULL)
35  return NULL;
36 
37  event_obj->dict = PyDict_New ();
38  if (!event_obj->dict)
39  return NULL;
40 
41  return gdbpy_ref<> ((PyObject *) event_obj.release ());
42 }
43 
44 /* Add the attribute ATTR to the event object EVENT. In
45  python this attribute will be accessible by the name NAME.
46  returns 0 if the operation succeeds and -1 otherwise. This
47  function acquires a new reference to ATTR. */
48 
49 int
50 evpy_add_attribute (PyObject *event, const char *name, PyObject *attr)
51 {
52  return PyObject_SetAttrString (event, name, attr);
53 }
54 
55 /* Initialize the Python event code. */
56 
57 int
59 {
61  "Event");
62 }
63 
64 /* Initialize the given event type. If BASE is not NULL it will
65  be set as the types base.
66  Returns 0 if initialization was successful -1 otherwise. */
67 
68 int
70  const char *name)
71 {
72  if (PyType_Ready (type) < 0)
73  return -1;
74 
75  return gdb_pymodule_addobject (gdb_module, name, (PyObject *) type);
76 }
77 
78 
79 /* Notify the list of listens that the given EVENT has occurred.
80  returns 0 if emit is successful -1 otherwise. */
81 
82 int
83 evpy_emit_event (PyObject *event,
84  eventregistry_object *registry)
85 {
86  Py_ssize_t i;
87 
88  /* Create a copy of call back list and use that for
89  notifying listeners to avoid skipping callbacks
90  in the case of a callback being disconnected during
91  a notification. */
92  gdbpy_ref<> callback_list_copy (PySequence_List (registry->callbacks));
93  if (callback_list_copy == NULL)
94  return -1;
95 
96  for (i = 0; i < PyList_Size (callback_list_copy.get ()); i++)
97  {
98  PyObject *func = PyList_GetItem (callback_list_copy.get (), i);
99 
100  if (func == NULL)
101  return -1;
102 
103  gdbpy_ref<> func_result (PyObject_CallFunctionObjArgs (func, event,
104  NULL));
105 
106  if (func_result == NULL)
107  {
108  /* Print the trace here, but keep going -- we want to try to
109  call all of the callbacks even if one is broken. */
111  }
112  }
113 
114  return 0;
115 }
116 
118 {
119  { "__dict__", gdb_py_generic_dict, NULL,
120  "The __dict__ for this event.", &event_object_type },
121  { NULL }
122 };
123 
124 PyTypeObject event_object_type =
125 {
126  PyVarObject_HEAD_INIT (NULL, 0)
127  "gdb.Event", /* tp_name */
128  sizeof (event_object), /* tp_basicsize */
129  0, /* tp_itemsize */
130  evpy_dealloc, /* tp_dealloc */
131  0, /* tp_print */
132  0, /* tp_getattr */
133  0, /* tp_setattr */
134  0, /* tp_compare */
135  0, /* tp_repr */
136  0, /* tp_as_number */
137  0, /* tp_as_sequence */
138  0, /* tp_as_mapping */
139  0, /* tp_hash */
140  0, /* tp_call */
141  0, /* tp_str */
142  0, /* tp_getattro */
143  0, /* tp_setattro */
144  0, /* tp_as_buffer */
145  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
146  "GDB event object", /* tp_doc */
147  0, /* tp_traverse */
148  0, /* tp_clear */
149  0, /* tp_richcompare */
150  0, /* tp_weaklistoffset */
151  0, /* tp_iter */
152  0, /* tp_iternext */
153  0, /* tp_methods */
154  0, /* tp_members */
155  event_object_getset, /* tp_getset */
156  0, /* tp_base */
157  0, /* tp_dict */
158  0, /* tp_descr_get */
159  0, /* tp_descr_set */
160  offsetof (event_object, dict), /* tp_dictoffset */
161  0, /* tp_init */
162  0 /* tp_alloc */
163 };
int gdb_pymodule_addobject(PyObject *module, const char *name, PyObject *object)
Definition: py-utils.c:376
void evpy_dealloc(PyObject *self)
Definition: py-event.c:24
PyObject * gdb_py_generic_dict(PyObject *self, void *closure)
Definition: py-utils.c:359
void(* func)(char *)
PyObject_HEAD PyObject * callbacks
Definition: py-events.h:34
int gdbpy_initialize_event_generic(PyTypeObject *type, const char *name)
Definition: py-event.c:69
#define PyVarObject_HEAD_INIT(type, size)
int evpy_add_attribute(PyObject *event, const char *name, PyObject *attr)
Definition: py-event.c:50
const char *const name
Definition: aarch64-tdep.c:76
int gdbpy_initialize_event(void)
Definition: py-event.c:58
Definition: gdbtypes.h:749
static gdb_PyGetSetDef event_object_getset[]
Definition: py-event.c:117
PyTypeObject event_object_type
Definition: py-event.c:124
void gdbpy_print_stack(void)
Definition: python.c:1262
T * get() const
Definition: gdb_ref_ptr.h:130
gdbpy_ref create_event_object(PyTypeObject *py_type)
Definition: py-event.c:31
int evpy_emit_event(PyObject *event, eventregistry_object *registry)
Definition: py-event.c:83
#define Py_TYPE(ob)
PyObject * gdb_module
Definition: python.c:116