1 /* Python interface to new object file loading events. 2 3 Copyright (C) 2011-2015 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 static PyTypeObject new_objfile_event_object_type 24 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); 25 static PyTypeObject clear_objfiles_event_object_type 26 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); 27 28 static PyObject * 29 create_new_objfile_event_object (struct objfile *objfile) 30 { 31 PyObject *objfile_event; 32 PyObject *py_objfile; 33 34 objfile_event = create_event_object (&new_objfile_event_object_type); 35 if (!objfile_event) 36 goto fail; 37 38 /* Note that objfile_to_objfile_object returns a borrowed reference, 39 so we don't need a decref here. */ 40 py_objfile = objfile_to_objfile_object (objfile); 41 if (!py_objfile || evpy_add_attribute (objfile_event, 42 "new_objfile", 43 py_objfile) < 0) 44 goto fail; 45 46 return objfile_event; 47 48 fail: 49 Py_XDECREF (objfile_event); 50 return NULL; 51 } 52 53 /* Callback function which notifies observers when a new objfile event occurs. 54 This function will create a new Python new_objfile event object. 55 Return -1 if emit fails. */ 56 57 int 58 emit_new_objfile_event (struct objfile *objfile) 59 { 60 PyObject *event; 61 62 if (evregpy_no_listeners_p (gdb_py_events.new_objfile)) 63 return 0; 64 65 event = create_new_objfile_event_object (objfile); 66 if (event) 67 return evpy_emit_event (event, gdb_py_events.new_objfile); 68 return -1; 69 } 70 71 GDBPY_NEW_EVENT_TYPE (new_objfile, 72 "gdb.NewObjFileEvent", 73 "NewObjFileEvent", 74 "GDB new object file event object", 75 event_object_type, 76 static); 77 78 /* Subroutine of emit_clear_objfiles_event to simplify it. */ 79 80 static PyObject * 81 create_clear_objfiles_event_object (void) 82 { 83 PyObject *objfile_event; 84 PyObject *py_progspace; 85 86 objfile_event = create_event_object (&clear_objfiles_event_object_type); 87 if (!objfile_event) 88 goto fail; 89 90 /* Note that pspace_to_pspace_object returns a borrowed reference, 91 so we don't need a decref here. */ 92 py_progspace = pspace_to_pspace_object (current_program_space); 93 if (!py_progspace || evpy_add_attribute (objfile_event, 94 "progspace", 95 py_progspace) < 0) 96 goto fail; 97 98 return objfile_event; 99 100 fail: 101 Py_XDECREF (objfile_event); 102 return NULL; 103 } 104 105 /* Callback function which notifies observers when the "clear objfiles" 106 event occurs. 107 This function will create a new Python clear_objfiles event object. 108 Return -1 if emit fails. */ 109 110 int 111 emit_clear_objfiles_event (void) 112 { 113 PyObject *event; 114 115 if (evregpy_no_listeners_p (gdb_py_events.clear_objfiles)) 116 return 0; 117 118 event = create_clear_objfiles_event_object (); 119 if (event) 120 return evpy_emit_event (event, gdb_py_events.clear_objfiles); 121 return -1; 122 } 123 124 GDBPY_NEW_EVENT_TYPE (clear_objfiles, 125 "gdb.ClearObjFilesEvent", 126 "ClearObjFilesEvent", 127 "GDB clear object files event object", 128 event_object_type, 129 static); 130