Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH] Change inferior_to_inferior_object to return a gdbpy_ref
Date: Wed, 02 Jan 2019 17:01:00 -0000	[thread overview]
Message-ID: <20190102170136.437-1-tom@tromey.com> (raw)

Most callers of inferior_to_inferior_object already use a gdbpy_ref,
so this changes inferior_to_inferior_object to return one.  Doing this
revealed that create_thread_object was not correctly handling the case
where inferior_to_inferior_object failed, so this patch fixes this as
well.

gdb/ChangeLog
2019-01-02  Tom Tromey  <tom@tromey.com>

	* python/python-internal.h (inferior_to_inferior_object): Change
	return type.
	* python/py-exitedevent.c (create_exited_event_object): Update.
	* python/py-inferior.c (inferior_to_inferior_object): Return
	gdbpy_ref.
	(python_new_inferior, python_inferior_deleted)
	(thread_to_thread_object, delete_thread_object)
	(build_inferior_list, gdbpy_selected_inferior): Update.
	* python/py-infthread.c (create_thread_object): Update.  Also fail
	if inferior_to_inferior_object fails.
---
 gdb/ChangeLog                | 13 +++++++++++++
 gdb/python/py-exitedevent.c  |  2 +-
 gdb/python/py-inferior.c     | 24 +++++++++++-------------
 gdb/python/py-infthread.c    |  6 +++++-
 gdb/python/python-internal.h |  2 +-
 5 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c
index 474aa250ce..5e9dabf15e 100644
--- a/gdb/python/py-exitedevent.c
+++ b/gdb/python/py-exitedevent.c
@@ -39,7 +39,7 @@ create_exited_event_object (const LONGEST *exit_code, struct inferior *inf)
 	return NULL;
     }
 
-  gdbpy_ref<inferior_object> inf_obj (inferior_to_inferior_object (inf));
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
   if (inf_obj == NULL || evpy_add_attribute (exited_event.get (),
 					     "inferior",
 					     (PyObject *) inf_obj.get ()) < 0)
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index b1b9e947ae..63b13d46ec 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -208,7 +208,7 @@ python_new_objfile (struct objfile *objfile)
    return it and increment the reference count,  otherwise, create it.
    Return NULL on failure.  */
 
-inferior_object *
+gdbpy_ref<inferior_object>
 inferior_to_inferior_object (struct inferior *inferior)
 {
   inferior_object *inf_obj;
@@ -218,7 +218,7 @@ inferior_to_inferior_object (struct inferior *inferior)
     {
       inf_obj = PyObject_New (inferior_object, &inferior_object_type);
       if (!inf_obj)
-	  return NULL;
+	return NULL;
 
       inf_obj->inferior = inferior;
       inf_obj->threads = NULL;
@@ -227,13 +227,11 @@ inferior_to_inferior_object (struct inferior *inferior)
       /* PyObject_New initializes the new object with a refcount of 1.  This
 	 counts for the reference we are keeping in the inferior data.  */
       set_inferior_data (inferior, infpy_inf_data_key, inf_obj);
-
     }
 
   /* We are returning a new reference.  */
-  Py_INCREF ((PyObject *)inf_obj);
-
-  return inf_obj;
+  gdb_assert (inf_obj != nullptr);
+  return gdbpy_ref<inferior_object>::new_reference (inf_obj);
 }
 
 /* Called when a new inferior is created.  Notifies any Python event
@@ -249,7 +247,7 @@ python_new_inferior (struct inferior *inf)
   if (evregpy_no_listeners_p (gdb_py_events.new_inferior))
     return;
 
-  gdbpy_ref<inferior_object> inf_obj (inferior_to_inferior_object (inf));
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
   if (inf_obj == NULL)
     {
       gdbpy_print_stack ();
@@ -277,7 +275,7 @@ python_inferior_deleted (struct inferior *inf)
   if (evregpy_no_listeners_p (gdb_py_events.inferior_deleted))
     return;
 
-  gdbpy_ref<inferior_object> inf_obj (inferior_to_inferior_object (inf));
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
   if (inf_obj == NULL)
     {
       gdbpy_print_stack ();
@@ -295,7 +293,7 @@ python_inferior_deleted (struct inferior *inf)
 gdbpy_ref<>
 thread_to_thread_object (thread_info *thr)
 {
-  gdbpy_ref<inferior_object> inf_obj (inferior_to_inferior_object (thr->inf));
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (thr->inf);
   if (inf_obj == NULL)
     return NULL;
 
@@ -358,8 +356,7 @@ delete_thread_object (struct thread_info *tp, int ignore)
 
   gdbpy_enter enter_py (python_gdbarch, python_language);
 
-  gdbpy_ref<inferior_object> inf_obj
-    ((inferior_object *) inferior_to_inferior_object (tp->inf));
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (tp->inf);
   if (inf_obj == NULL)
     return;
 
@@ -466,7 +463,7 @@ static int
 build_inferior_list (struct inferior *inf, void *arg)
 {
   PyObject *list = (PyObject *) arg;
-  gdbpy_ref<inferior_object> inferior (inferior_to_inferior_object (inf));
+  gdbpy_ref<inferior_object> inferior = inferior_to_inferior_object (inf);
 
   if (inferior == NULL)
     return 0;
@@ -925,7 +922,8 @@ py_free_inferior (struct inferior *inf, void *datum)
 PyObject *
 gdbpy_selected_inferior (PyObject *self, PyObject *args)
 {
-  return (PyObject *) inferior_to_inferior_object (current_inferior ());
+  return ((PyObject *)
+	  inferior_to_inferior_object (current_inferior ()).release ());
 }
 
 int
diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
index e15e2810cd..bf90d08ae6 100644
--- a/gdb/python/py-infthread.c
+++ b/gdb/python/py-infthread.c
@@ -41,12 +41,16 @@ create_thread_object (struct thread_info *tp)
 {
   thread_object *thread_obj;
 
+  gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (tp->inf);
+  if (inf_obj == NULL)
+    return NULL;
+
   thread_obj = PyObject_New (thread_object, &thread_object_type);
   if (!thread_obj)
     return NULL;
 
   thread_obj->thread = tp;
-  thread_obj->inf_obj = (PyObject *) inferior_to_inferior_object (tp->inf);
+  thread_obj->inf_obj = (PyObject *) inf_obj.release ();
 
   return thread_obj;
 }
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index d8d345734d..51919b7b85 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -521,7 +521,7 @@ PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch);
 
 thread_object *create_thread_object (struct thread_info *tp);
 gdbpy_ref<> thread_to_thread_object (thread_info *thr);;
-inferior_object *inferior_to_inferior_object (inferior *inf);
+gdbpy_ref<inferior_object> inferior_to_inferior_object (inferior *inf);
 
 const struct block *block_object_to_block (PyObject *obj);
 struct symbol *symbol_object_to_symbol (PyObject *obj);
-- 
2.17.2


             reply	other threads:[~2019-01-02 17:01 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-02 17:01 Tom Tromey [this message]
2019-01-02 20:18 ` Simon Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190102170136.437-1-tom@tromey.com \
    --to=tom@tromey.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox