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 extern PyTypeObject new_objfile_event_object_type 24 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); 25 extern 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 77 /* Subroutine of emit_clear_objfiles_event to simplify it. */ 78 79 static PyObject * 80 create_clear_objfiles_event_object (void) 81 { 82 PyObject *objfile_event; 83 PyObject *py_progspace; 84 85 objfile_event = create_event_object (&clear_objfiles_event_object_type); 86 if (!objfile_event) 87 goto fail; 88 89 /* Note that pspace_to_pspace_object returns a borrowed reference, 90 so we don't need a decref here. */ 91 py_progspace = pspace_to_pspace_object (current_program_space); 92 if (!py_progspace || evpy_add_attribute (objfile_event, 93 "progspace", 94 py_progspace) < 0) 95 goto fail; 96 97 return objfile_event; 98 99 fail: 100 Py_XDECREF (objfile_event); 101 return NULL; 102 } 103 104 /* Callback function which notifies observers when the "clear objfiles" 105 event occurs. 106 This function will create a new Python clear_objfiles event object. 107 Return -1 if emit fails. */ 108 109 int 110 emit_clear_objfiles_event (void) 111 { 112 PyObject *event; 113 114 if (evregpy_no_listeners_p (gdb_py_events.clear_objfiles)) 115 return 0; 116 117 event = create_clear_objfiles_event_object (); 118 if (event) 119 return evpy_emit_event (event, gdb_py_events.clear_objfiles); 120 return -1; 121 } 122 123 GDBPY_NEW_EVENT_TYPE (clear_objfiles, 124 "gdb.ClearObjFilesEvent", 125 "ClearObjFilesEvent", 126 "GDB clear object files event object", 127 event_object_type); 128