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