gdb/python/py-evtregistry.c - gdb

Global variables defined

Functions defined

Source code

  1. /* Python interface to inferior thread event registries.

  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 "command.h"
  16. #include "py-events.h"

  17. events_object gdb_py_events;

  18. static PyTypeObject eventregistry_object_type
  19.     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("eventregistry_object");

  20. /* Implementation of EventRegistry.connect () -> NULL.
  21.    Add FUNCTION to the list of listeners.  */

  22. static PyObject *
  23. evregpy_connect (PyObject *self, PyObject *function)
  24. {
  25.   PyObject *func;
  26.   PyObject *callback_list = (((eventregistry_object *) self)->callbacks);

  27.   if (!PyArg_ParseTuple (function, "O", &func))
  28.     return NULL;

  29.   if (!PyCallable_Check (func))
  30.     {
  31.       PyErr_SetString (PyExc_RuntimeError, "Function is not callable");
  32.       return NULL;
  33.     }

  34.   if (PyList_Append (callback_list, func) < 0)
  35.     return NULL;

  36.   Py_RETURN_NONE;
  37. }

  38. /* Implementation of EventRegistry.disconnect () -> NULL.
  39.    Remove FUNCTION from the list of listeners.  */

  40. static PyObject *
  41. evregpy_disconnect (PyObject *self, PyObject *function)
  42. {
  43.   PyObject *func;
  44.   int index;
  45.   PyObject *callback_list = (((eventregistry_object *) self)->callbacks);

  46.   if (!PyArg_ParseTuple (function, "O", &func))
  47.     return NULL;

  48.   index = PySequence_Index (callback_list, func);
  49.   if (index < 0)
  50.     Py_RETURN_NONE;

  51.   if (PySequence_DelItem (callback_list, index) < 0)
  52.     return NULL;

  53.   Py_RETURN_NONE;
  54. }

  55. /* Create a new event registry.  This function uses PyObject_New
  56.    and therefore returns a new reference that callers must handle.  */

  57. eventregistry_object *
  58. create_eventregistry_object (void)
  59. {
  60.   eventregistry_object *eventregistry_obj;

  61.   eventregistry_obj = PyObject_New (eventregistry_object,
  62.                                     &eventregistry_object_type);

  63.   if (!eventregistry_obj)
  64.     return NULL;

  65.   eventregistry_obj->callbacks = PyList_New (0);
  66.   if (!eventregistry_obj->callbacks)
  67.     {
  68.       Py_DECREF (eventregistry_obj);
  69.       return NULL;
  70.     }

  71.   return eventregistry_obj;
  72. }

  73. static void
  74. evregpy_dealloc (PyObject *self)
  75. {
  76.   Py_XDECREF (((eventregistry_object *) self)->callbacks);
  77.   Py_TYPE (self)->tp_free (self);
  78. }

  79. /* Initialize the Python event registry code.  */

  80. int
  81. gdbpy_initialize_eventregistry (void)
  82. {
  83.   if (PyType_Ready (&eventregistry_object_type) < 0)
  84.     return -1;

  85.   return gdb_pymodule_addobject (gdb_module, "EventRegistry",
  86.                                  (PyObject *) &eventregistry_object_type);
  87. }

  88. /* Retern the number of listeners currently connected to this
  89.    registry.  */

  90. int
  91. evregpy_no_listeners_p (eventregistry_object *registry)
  92. {
  93.   return PyList_Size (registry->callbacks) == 0;
  94. }

  95. static PyMethodDef eventregistry_object_methods[] =
  96. {
  97.   { "connect", evregpy_connect, METH_VARARGS, "Add function" },
  98.   { "disconnect", evregpy_disconnect, METH_VARARGS, "Remove function" },
  99.   { NULL } /* Sentinel.  */
  100. };

  101. static PyTypeObject eventregistry_object_type =
  102. {
  103.   PyVarObject_HEAD_INIT (NULL, 0)
  104.   "gdb.EventRegistry",                        /* tp_name */
  105.   sizeof (eventregistry_object),              /* tp_basicsize */
  106.   0,                                          /* tp_itemsize */
  107.   evregpy_dealloc,                            /* tp_dealloc */
  108.   0,                                          /* tp_print */
  109.   0,                                          /* tp_getattr */
  110.   0,                                          /* tp_setattr */
  111.   0,                                          /* tp_compare */
  112.   0,                                          /* tp_repr */
  113.   0,                                          /* tp_as_number */
  114.   0,                                          /* tp_as_sequence */
  115.   0,                                          /* tp_as_mapping */
  116.   0,                                          /* tp_hash  */
  117.   0,                                          /* tp_call */
  118.   0,                                          /* tp_str */
  119.   0,                                          /* tp_getattro */
  120.   0,                                          /* tp_setattro */
  121.   0,                                          /* tp_as_buffer */
  122.   Py_TPFLAGS_DEFAULT,                         /* tp_flags */
  123.   "GDB event registry object",                /* tp_doc */
  124.   0,                                          /* tp_traverse */
  125.   0,                                          /* tp_clear */
  126.   0,                                          /* tp_richcompare */
  127.   0,                                          /* tp_weaklistoffset */
  128.   0,                                          /* tp_iter */
  129.   0,                                          /* tp_iternext */
  130.   eventregistry_object_methods,               /* tp_methods */
  131.   0,                                          /* tp_members */
  132.   0,                                          /* tp_getset */
  133.   0,                                          /* tp_base */
  134.   0,                                          /* tp_dict */
  135.   0,                                          /* tp_descr_get */
  136.   0,                                          /* tp_descr_set */
  137.   0,                                          /* tp_dictoffset */
  138.   0,                                          /* tp_init */
  139.   0                                           /* tp_alloc */
  140. };