1c50c785cSJohn Marino /* Python interface to inferior exit events.
2c50c785cSJohn Marino 
3*ef5ccd6cSJohn Marino    Copyright (C) 2009-2013 Free Software Foundation, Inc.
4c50c785cSJohn Marino 
5c50c785cSJohn Marino    This file is part of GDB.
6c50c785cSJohn Marino 
7c50c785cSJohn Marino    This program is free software; you can redistribute it and/or modify
8c50c785cSJohn Marino    it under the terms of the GNU General Public License as published by
9c50c785cSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10c50c785cSJohn Marino    (at your option) any later version.
11c50c785cSJohn Marino 
12c50c785cSJohn Marino    This program is distributed in the hope that it will be useful,
13c50c785cSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14c50c785cSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c50c785cSJohn Marino    GNU General Public License for more details.
16c50c785cSJohn Marino 
17c50c785cSJohn Marino    You should have received a copy of the GNU General Public License
18c50c785cSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19c50c785cSJohn Marino 
20*ef5ccd6cSJohn Marino #include "defs.h"
21c50c785cSJohn Marino #include "py-event.h"
22c50c785cSJohn Marino 
23c50c785cSJohn Marino static PyTypeObject exited_event_object_type;
24c50c785cSJohn Marino 
25c50c785cSJohn Marino static PyObject *
create_exited_event_object(const LONGEST * exit_code,struct inferior * inf)26a45ae5f8SJohn Marino create_exited_event_object (const LONGEST *exit_code, struct inferior *inf)
27c50c785cSJohn Marino {
28c50c785cSJohn Marino   PyObject *exited_event;
29*ef5ccd6cSJohn Marino   PyObject *inf_obj = NULL;
30c50c785cSJohn Marino 
31c50c785cSJohn Marino   exited_event = create_event_object (&exited_event_object_type);
32c50c785cSJohn Marino 
33c50c785cSJohn Marino   if (!exited_event)
34c50c785cSJohn Marino     goto fail;
35c50c785cSJohn Marino 
36*ef5ccd6cSJohn Marino   if (exit_code)
37*ef5ccd6cSJohn Marino     {
38*ef5ccd6cSJohn Marino       PyObject *exit_code_obj = PyLong_FromLongLong (*exit_code);
39*ef5ccd6cSJohn Marino       int failed;
40*ef5ccd6cSJohn Marino 
41*ef5ccd6cSJohn Marino       if (exit_code_obj == NULL)
42c50c785cSJohn Marino 	goto fail;
43c50c785cSJohn Marino 
44*ef5ccd6cSJohn Marino       failed = evpy_add_attribute (exited_event, "exit_code",
45*ef5ccd6cSJohn Marino 				   exit_code_obj) < 0;
46*ef5ccd6cSJohn Marino       Py_DECREF (exit_code_obj);
47*ef5ccd6cSJohn Marino       if (failed)
48*ef5ccd6cSJohn Marino 	goto fail;
49*ef5ccd6cSJohn Marino     }
50*ef5ccd6cSJohn Marino 
51a45ae5f8SJohn Marino   inf_obj = inferior_to_inferior_object (inf);
52a45ae5f8SJohn Marino   if (!inf_obj || evpy_add_attribute (exited_event,
53a45ae5f8SJohn Marino                                       "inferior",
54a45ae5f8SJohn Marino                                       inf_obj) < 0)
55a45ae5f8SJohn Marino     goto fail;
56*ef5ccd6cSJohn Marino   Py_DECREF (inf_obj);
57a45ae5f8SJohn Marino 
58c50c785cSJohn Marino   return exited_event;
59c50c785cSJohn Marino 
60c50c785cSJohn Marino  fail:
61*ef5ccd6cSJohn Marino   Py_XDECREF (inf_obj);
62c50c785cSJohn Marino   Py_XDECREF (exited_event);
63c50c785cSJohn Marino   return NULL;
64c50c785cSJohn Marino }
65c50c785cSJohn Marino 
66c50c785cSJohn Marino /* Callback that is used when an exit event occurs.  This function
67c50c785cSJohn Marino    will create a new Python exited event object.  */
68c50c785cSJohn Marino 
69c50c785cSJohn Marino int
emit_exited_event(const LONGEST * exit_code,struct inferior * inf)70a45ae5f8SJohn Marino emit_exited_event (const LONGEST *exit_code, struct inferior *inf)
71c50c785cSJohn Marino {
72c50c785cSJohn Marino   PyObject *event;
73c50c785cSJohn Marino 
74c50c785cSJohn Marino   if (evregpy_no_listeners_p (gdb_py_events.exited))
75c50c785cSJohn Marino     return 0;
76c50c785cSJohn Marino 
77a45ae5f8SJohn Marino   event = create_exited_event_object (exit_code, inf);
78c50c785cSJohn Marino 
79c50c785cSJohn Marino   if (event)
80c50c785cSJohn Marino     return evpy_emit_event (event, gdb_py_events.exited);
81c50c785cSJohn Marino 
82c50c785cSJohn Marino   return -1;
83c50c785cSJohn Marino }
84c50c785cSJohn Marino 
85c50c785cSJohn Marino 
86c50c785cSJohn Marino GDBPY_NEW_EVENT_TYPE (exited,
87c50c785cSJohn Marino                       "gdb.ExitedEvent",
88c50c785cSJohn Marino                       "ExitedEvent",
89c50c785cSJohn Marino                       "GDB exited event object",
90c50c785cSJohn Marino                       event_object_type,
91c50c785cSJohn Marino                       static);
92