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