xref: /dragonfly/contrib/gdb-7/gdb/python/py-event.c (revision ef5ccd6c)
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