Home | History | Annotate | Line # | Download | only in python
py-newobjfileevent.c revision 1.1.1.8
      1 /* Python interface to new object file loading events.
      2 
      3    Copyright (C) 2011-2023 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 gdbpy_ref<>
     24 create_new_objfile_event_object (struct objfile *objfile)
     25 {
     26   gdbpy_ref<> objfile_event
     27     = create_event_object (&new_objfile_event_object_type);
     28   if (objfile_event == NULL)
     29     return NULL;
     30 
     31   gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
     32   if (py_objfile == NULL || evpy_add_attribute (objfile_event.get (),
     33 						"new_objfile",
     34 						py_objfile.get ()) < 0)
     35     return NULL;
     36 
     37   return objfile_event;
     38 }
     39 
     40 /* Callback function which notifies observers when a new objfile event occurs.
     41    This function will create a new Python new_objfile event object.
     42    Return -1 if emit fails.  */
     43 
     44 int
     45 emit_new_objfile_event (struct objfile *objfile)
     46 {
     47   if (evregpy_no_listeners_p (gdb_py_events.new_objfile))
     48     return 0;
     49 
     50   gdbpy_ref<> event = create_new_objfile_event_object (objfile);
     51   if (event != NULL)
     52     return evpy_emit_event (event.get (), gdb_py_events.new_objfile);
     53   return -1;
     54 }
     55 
     56 /* Create an event object representing a to-be-freed objfile.  Return
     57    nullptr, with the Python exception set, on error.  */
     58 
     59 static gdbpy_ref<>
     60 create_free_objfile_event_object (struct objfile *objfile)
     61 {
     62   gdbpy_ref<> objfile_event
     63     = create_event_object (&free_objfile_event_object_type);
     64   if (objfile_event == nullptr)
     65     return nullptr;
     66 
     67   gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
     68   if (py_objfile == nullptr
     69       || evpy_add_attribute (objfile_event.get (), "objfile",
     70 			     py_objfile.get ()) < 0)
     71     return nullptr;
     72 
     73   return objfile_event;
     74 }
     75 
     76 /* Callback function which notifies observers when a free objfile
     77    event occurs.  This function will create a new Python event object.
     78    Return -1 if emit fails.  */
     79 
     80 int
     81 emit_free_objfile_event (struct objfile *objfile)
     82 {
     83   if (evregpy_no_listeners_p (gdb_py_events.free_objfile))
     84     return 0;
     85 
     86   gdbpy_ref<> event = create_free_objfile_event_object (objfile);
     87   if (event == nullptr)
     88     return -1;
     89   return evpy_emit_event (event.get (), gdb_py_events.free_objfile);
     90 }
     91 
     92 
     93 /* Subroutine of emit_clear_objfiles_event to simplify it.  */
     95 
     96 static gdbpy_ref<>
     97 create_clear_objfiles_event_object (void)
     98 {
     99   gdbpy_ref<> objfile_event
    100     = create_event_object (&clear_objfiles_event_object_type);
    101   if (objfile_event == NULL)
    102     return NULL;
    103 
    104   gdbpy_ref<> py_progspace = pspace_to_pspace_object (current_program_space);
    105   if (py_progspace == NULL || evpy_add_attribute (objfile_event.get (),
    106 						  "progspace",
    107 						  py_progspace.get ()) < 0)
    108     return NULL;
    109 
    110   return objfile_event;
    111 }
    112 
    113 /* Callback function which notifies observers when the "clear objfiles"
    114    event occurs.
    115    This function will create a new Python clear_objfiles event object.
    116    Return -1 if emit fails.  */
    117 
    118 int
    119 emit_clear_objfiles_event (void)
    120 {
    121   if (evregpy_no_listeners_p (gdb_py_events.clear_objfiles))
    122     return 0;
    123 
    124   gdbpy_ref<> event = create_clear_objfiles_event_object ();
    125   if (event != NULL)
    126     return evpy_emit_event (event.get (), gdb_py_events.clear_objfiles);
    127   return -1;
    128 }
    129