gdb/python/py-event.c - gdb

Global variables defined

Functions defined

Source code

  1. /* Python interface to inferior events.

  2.    Copyright (C) 2009-2015 Free Software Foundation, Inc.

  3.    This file is part of GDB.

  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 3 of the License, or
  7.    (at your option) any later version.

  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.

  12.    You should have received a copy of the GNU General Public License
  13.    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

  14. #include "defs.h"
  15. #include "py-event.h"

  16. void
  17. evpy_dealloc (PyObject *self)
  18. {
  19.   Py_XDECREF (((event_object *) self)->dict);
  20.   Py_TYPE (self)->tp_free (self);
  21. }

  22. PyObject *
  23. create_event_object (PyTypeObject *py_type)
  24. {
  25.   event_object *event_obj;

  26.   event_obj = PyObject_New (event_object, py_type);
  27.   if (!event_obj)
  28.     goto fail;

  29.   event_obj->dict = PyDict_New ();
  30.   if (!event_obj->dict)
  31.     goto fail;

  32.   return (PyObject*) event_obj;

  33. fail:
  34.   Py_XDECREF (event_obj);
  35.   return NULL;
  36. }

  37. /* Add the attribute ATTR to the event object EVENT.  In
  38.    python this attribute will be accessible by the name NAME.
  39.    returns 0 if the operation succeeds and -1 otherwise.  This
  40.    function acquires a new reference to ATTR.  */

  41. int
  42. evpy_add_attribute (PyObject *event, char *name, PyObject *attr)
  43. {
  44.   return PyObject_SetAttrString (event, name, attr);
  45. }

  46. /* Initialize the Python event code.  */

  47. int
  48. gdbpy_initialize_event (void)
  49. {
  50.   return gdbpy_initialize_event_generic (&event_object_type,
  51.                                          "Event");
  52. }

  53. /* Initialize the given event type.  If BASE is not NULL it will
  54.   be set as the types base.
  55.   Returns 0 if initialization was successful -1 otherwise.  */

  56. int
  57. gdbpy_initialize_event_generic (PyTypeObject *type,
  58.                                 char *name)
  59. {
  60.   if (PyType_Ready (type) < 0)
  61.     return -1;

  62.   return gdb_pymodule_addobject (gdb_module, name, (PyObject *) type);
  63. }


  64. /* Notify the list of listens that the given EVENT has occurred.
  65.    returns 0 if emit is successful -1 otherwise.  */

  66. int
  67. evpy_emit_event (PyObject *event,
  68.                  eventregistry_object *registry)
  69. {
  70.   PyObject *callback_list_copy = NULL;
  71.   Py_ssize_t i;

  72.   /* Create a copy of call back list and use that for
  73.      notifying listeners to avoid skipping callbacks
  74.      in the case of a callback being disconnected during
  75.      a notification.  */
  76.   callback_list_copy = PySequence_List (registry->callbacks);
  77.   if (!callback_list_copy)
  78.     goto fail;

  79.   for (i = 0; i < PyList_Size (callback_list_copy); i++)
  80.     {
  81.       PyObject *func = PyList_GetItem (callback_list_copy, i);
  82.       PyObject *func_result;

  83.       if (func == NULL)
  84.         goto fail;

  85.       func_result = PyObject_CallFunctionObjArgs (func, event, NULL);

  86.       if (func_result == NULL)
  87.         {
  88.           /* Print the trace here, but keep going -- we want to try to
  89.              call all of the callbacks even if one is broken.  */
  90.           gdbpy_print_stack ();
  91.         }
  92.       else
  93.         {
  94.           Py_DECREF (func_result);
  95.         }
  96.     }

  97.   Py_XDECREF (callback_list_copy);
  98.   Py_XDECREF (event);
  99.   return 0;

  100. fail:
  101.   gdbpy_print_stack ();
  102.   Py_XDECREF (callback_list_copy);
  103.   Py_XDECREF (event);
  104.   return -1;
  105. }

  106. static PyGetSetDef event_object_getset[] =
  107. {
  108.   { "__dict__", gdb_py_generic_dict, NULL,
  109.     "The __dict__ for this event.", &event_object_type },
  110.   { NULL }
  111. };

  112. PyTypeObject event_object_type =
  113. {
  114.   PyVarObject_HEAD_INIT (NULL, 0)
  115.   "gdb.Event",                                /* tp_name */
  116.   sizeof (event_object),                      /* tp_basicsize */
  117.   0,                                          /* tp_itemsize */
  118.   evpy_dealloc,                               /* tp_dealloc */
  119.   0,                                          /* tp_print */
  120.   0,                                          /* tp_getattr */
  121.   0,                                          /* tp_setattr */
  122.   0,                                          /* tp_compare */
  123.   0,                                          /* tp_repr */
  124.   0,                                          /* tp_as_number */
  125.   0,                                          /* tp_as_sequence */
  126.   0,                                          /* tp_as_mapping */
  127.   0,                                          /* tp_hash  */
  128.   0,                                          /* tp_call */
  129.   0,                                          /* tp_str */
  130.   0,                                          /* tp_getattro */
  131.   0,                                          /* tp_setattro */
  132.   0,                                          /* tp_as_buffer */
  133.   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
  134.   "GDB event object",                         /* tp_doc */
  135.   0,                                          /* tp_traverse */
  136.   0,                                          /* tp_clear */
  137.   0,                                          /* tp_richcompare */
  138.   0,                                          /* tp_weaklistoffset */
  139.   0,                                          /* tp_iter */
  140.   0,                                          /* tp_iternext */
  141.   0,                                          /* tp_methods */
  142.   0,                                          /* tp_members */
  143.   event_object_getset,                              /* tp_getset */
  144.   0,                                          /* tp_base */
  145.   0,                                          /* tp_dict */
  146.   0,                                          /* tp_descr_get */
  147.   0,                                          /* tp_descr_set */
  148.   offsetof (event_object, dict),              /* tp_dictoffset */
  149.   0,                                          /* tp_init */
  150.   0                                           /* tp_alloc */
  151. };