Small event ownership clean up in Python layer

It seems cleaner to me for functions like create_thread_event_object,
which pass object ownership to their callers, to directly return a
gdb_ref<>.  This way the ownership transfer is part of the API.  This
patch makes this change.

ChangeLog
2017-09-11  Tom Tromey  <tom@tromey.com>

	* python/py-threadevent.c (create_thread_event_object): Return
	gdbpy_ref.
	* python/py-stopevent.h (create_stop_event_object)
	(create_breakpoint_event_object, create_signal_event_object):
	Update.
	* python/py-stopevent.c (create_stop_event_object): Return
	gdbpy_ref.
	(emit_stop_event): Update.
	* python/py-signalevent.c (create_signal_event_object): Return
	gdbpy_ref.
	* python/py-infevents.c (create_inferior_call_event_object):
	Update.
	* python/py-event.h (create_event_object)
	(create_thread_event_object): Update.
	* python/py-event.c (create_event_object): Return gdbpy_ref.
	* python/py-continueevent.c: Return gdbpy_ref.
	* python/py-bpevent.c (create_breakpoint_event_object): Return
	gdbpy_ref.
This commit is contained in:
Tom Tromey 2017-09-08 14:26:43 -06:00
parent 7c96f8c1da
commit 35c61a1dd5
10 changed files with 44 additions and 23 deletions

View file

@ -1,3 +1,24 @@
2017-09-11 Tom Tromey <tom@tromey.com>
* python/py-threadevent.c (create_thread_event_object): Return
gdbpy_ref.
* python/py-stopevent.h (create_stop_event_object)
(create_breakpoint_event_object, create_signal_event_object):
Update.
* python/py-stopevent.c (create_stop_event_object): Return
gdbpy_ref.
(emit_stop_event): Update.
* python/py-signalevent.c (create_signal_event_object): Return
gdbpy_ref.
* python/py-infevents.c (create_inferior_call_event_object):
Update.
* python/py-event.h (create_event_object)
(create_thread_event_object): Update.
* python/py-event.c (create_event_object): Return gdbpy_ref.
* python/py-continueevent.c: Return gdbpy_ref.
* python/py-bpevent.c (create_breakpoint_event_object): Return
gdbpy_ref.
2017-09-11 Tom Tromey <tom@tromey.com> 2017-09-11 Tom Tromey <tom@tromey.com>
PR python/15622: PR python/15622:

View file

@ -27,7 +27,7 @@ extern PyTypeObject breakpoint_event_object_type
/* Create and initialize a BreakpointEvent object. This acquires new /* Create and initialize a BreakpointEvent object. This acquires new
references to BREAKPOINT_LIST and FIRST_BP. */ references to BREAKPOINT_LIST and FIRST_BP. */
PyObject * gdbpy_ref<>
create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp) create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp)
{ {
gdbpy_ref<> breakpoint_event_obj gdbpy_ref<> breakpoint_event_obj
@ -45,7 +45,7 @@ create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp)
breakpoint_list) < 0) breakpoint_list) < 0)
return NULL; return NULL;
return breakpoint_event_obj.release (); return breakpoint_event_obj;
} }
GDBPY_NEW_EVENT_TYPE (breakpoint, GDBPY_NEW_EVENT_TYPE (breakpoint,

View file

@ -24,7 +24,7 @@
extern PyTypeObject continue_event_object_type extern PyTypeObject continue_event_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
static PyObject * static gdbpy_ref<>
create_continue_event_object (void) create_continue_event_object (void)
{ {
return create_thread_event_object (&continue_event_object_type); return create_thread_event_object (&continue_event_object_type);

View file

@ -27,7 +27,7 @@ evpy_dealloc (PyObject *self)
Py_TYPE (self)->tp_free (self); Py_TYPE (self)->tp_free (self);
} }
PyObject * gdbpy_ref<>
create_event_object (PyTypeObject *py_type) create_event_object (PyTypeObject *py_type)
{ {
gdbpy_ref<event_object> event_obj (PyObject_New (event_object, py_type)); gdbpy_ref<event_object> event_obj (PyObject_New (event_object, py_type));
@ -38,7 +38,7 @@ create_event_object (PyTypeObject *py_type)
if (!event_obj->dict) if (!event_obj->dict)
return NULL; return NULL;
return (PyObject*) event_obj.release (); return gdbpy_ref<> ((PyObject *) event_obj.release ());
} }
/* Add the attribute ATTR to the event object EVENT. In /* Add the attribute ATTR to the event object EVENT. In

View file

@ -124,8 +124,8 @@ extern int emit_memory_changed_event (CORE_ADDR addr, ssize_t len);
extern int evpy_emit_event (PyObject *event, extern int evpy_emit_event (PyObject *event,
eventregistry_object *registry); eventregistry_object *registry);
extern PyObject *create_event_object (PyTypeObject *py_type); extern gdbpy_ref<> create_event_object (PyTypeObject *py_type);
extern PyObject *create_thread_event_object (PyTypeObject *py_type, extern gdbpy_ref<> create_thread_event_object (PyTypeObject *py_type,
PyObject *thread = nullptr); PyObject *thread = nullptr);
extern int emit_new_objfile_event (struct objfile *objfile); extern int emit_new_objfile_event (struct objfile *objfile);
extern int emit_clear_objfiles_event (void); extern int emit_clear_objfiles_event (void);

View file

@ -43,10 +43,10 @@ create_inferior_call_event_object (inferior_call_kind flag, ptid_t ptid,
switch (flag) switch (flag)
{ {
case INFERIOR_CALL_PRE: case INFERIOR_CALL_PRE:
event.reset (create_event_object (&inferior_call_pre_event_object_type)); event = create_event_object (&inferior_call_pre_event_object_type);
break; break;
case INFERIOR_CALL_POST: case INFERIOR_CALL_POST:
event.reset (create_event_object (&inferior_call_post_event_object_type)); event = create_event_object (&inferior_call_post_event_object_type);
break; break;
default: default:
gdb_assert_not_reached ("invalid inferior_call_kind"); gdb_assert_not_reached ("invalid inferior_call_kind");

View file

@ -23,7 +23,7 @@
extern PyTypeObject signal_event_object_type extern PyTypeObject signal_event_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
PyObject * gdbpy_ref<>
create_signal_event_object (enum gdb_signal stop_signal) create_signal_event_object (enum gdb_signal stop_signal)
{ {
const char *signal_name; const char *signal_name;
@ -43,7 +43,7 @@ create_signal_event_object (enum gdb_signal stop_signal)
signal_name_obj.get ()) < 0) signal_name_obj.get ()) < 0)
return NULL; return NULL;
return signal_event_obj.release (); return signal_event_obj;
} }
GDBPY_NEW_EVENT_TYPE (signal, GDBPY_NEW_EVENT_TYPE (signal,

View file

@ -20,7 +20,7 @@
#include "defs.h" #include "defs.h"
#include "py-stopevent.h" #include "py-stopevent.h"
PyObject * gdbpy_ref<>
create_stop_event_object (PyTypeObject *py_type) create_stop_event_object (PyTypeObject *py_type)
{ {
return create_thread_event_object (py_type); return create_thread_event_object (py_type);
@ -70,8 +70,8 @@ emit_stop_event (struct bpstats *bs, enum gdb_signal stop_signal)
if (list != NULL) if (list != NULL)
{ {
stop_event_obj.reset (create_breakpoint_event_object (list.get (), stop_event_obj = create_breakpoint_event_object (list.get (),
first_bp)); first_bp);
if (stop_event_obj == NULL) if (stop_event_obj == NULL)
return -1; return -1;
} }
@ -80,7 +80,7 @@ emit_stop_event (struct bpstats *bs, enum gdb_signal stop_signal)
if (stop_signal != GDB_SIGNAL_0 if (stop_signal != GDB_SIGNAL_0
&& stop_signal != GDB_SIGNAL_TRAP) && stop_signal != GDB_SIGNAL_TRAP)
{ {
stop_event_obj.reset (create_signal_event_object (stop_signal)); stop_event_obj = create_signal_event_object (stop_signal);
if (stop_event_obj == NULL) if (stop_event_obj == NULL)
return -1; return -1;
} }
@ -89,7 +89,7 @@ emit_stop_event (struct bpstats *bs, enum gdb_signal stop_signal)
be known and this should eventually be unused. */ be known and this should eventually be unused. */
if (stop_event_obj == NULL) if (stop_event_obj == NULL)
{ {
stop_event_obj.reset (create_stop_event_object (&stop_event_object_type)); stop_event_obj = create_stop_event_object (&stop_event_object_type);
if (stop_event_obj == NULL) if (stop_event_obj == NULL)
return -1; return -1;
} }

View file

@ -22,15 +22,15 @@
#include "py-event.h" #include "py-event.h"
extern PyObject *create_stop_event_object (PyTypeObject *py_type); extern gdbpy_ref<> create_stop_event_object (PyTypeObject *py_type);
extern void stop_evpy_dealloc (PyObject *self); extern void stop_evpy_dealloc (PyObject *self);
extern int emit_stop_event (struct bpstats *bs, extern int emit_stop_event (struct bpstats *bs,
enum gdb_signal stop_signal); enum gdb_signal stop_signal);
extern PyObject *create_breakpoint_event_object (PyObject *breakpoint_list, extern gdbpy_ref<> create_breakpoint_event_object (PyObject *breakpoint_list,
PyObject *first_bp); PyObject *first_bp);
extern PyObject *create_signal_event_object (enum gdb_signal stop_signal); extern gdbpy_ref<> create_signal_event_object (enum gdb_signal stop_signal);
#endif /* GDB_PY_STOPEVENT_H */ #endif /* GDB_PY_STOPEVENT_H */

View file

@ -47,7 +47,7 @@ get_event_thread (void)
return thread; return thread;
} }
PyObject * gdbpy_ref<>
create_thread_event_object (PyTypeObject *py_type, PyObject *thread) create_thread_event_object (PyTypeObject *py_type, PyObject *thread)
{ {
gdbpy_ref<> thread_event_obj (create_event_object (py_type)); gdbpy_ref<> thread_event_obj (create_event_object (py_type));
@ -66,7 +66,7 @@ create_thread_event_object (PyTypeObject *py_type, PyObject *thread)
thread) < 0) thread) < 0)
return NULL; return NULL;
return thread_event_obj.release (); return thread_event_obj;
} }
GDBPY_NEW_EVENT_TYPE (thread, GDBPY_NEW_EVENT_TYPE (thread,