Change thread_to_thread_object to return a new reference
authorTom Tromey <tom@tromey.com>
Thu, 13 Sep 2018 05:15:48 +0000 (23:15 -0600)
committerTom Tromey <tom@tromey.com>
Sun, 16 Sep 2018 13:25:57 +0000 (07:25 -0600)
This changes thread_to_thread_object to return a new reference and
fixes up all the callers.

gdb/ChangeLog
2018-09-16  Tom Tromey  <tom@tromey.com>

* python/python-internal.h (thread_to_thread_object): Change
return type.
* python/py-inferior.c (thread_to_thread_object): Return a new
reference.
(infpy_thread_from_thread_handle): Update.
* python/py-infthread.c (gdbpy_selected_thread): Update.
* python/py-stopevent.c (create_stop_event_object): Update.
* python/py-threadevent.c (py_get_event_thread): Return a new
reference.
(py_get_event_thread): Update.
* python/py-event.h (py_get_event_thread): Change return type.
* python/py-continueevent.c (create_continue_event_object):
Update.

gdb/ChangeLog
gdb/python/py-continueevent.c
gdb/python/py-event.h
gdb/python/py-inferior.c
gdb/python/py-infthread.c
gdb/python/py-stopevent.c
gdb/python/py-threadevent.c
gdb/python/python-internal.h

index b673acd1616b6e9b130432afc0cf5daa2f2c80f9..d4e2ca34351e7495883f156a12f3452348de69a1 100644 (file)
@@ -1,3 +1,19 @@
+2018-09-16  Tom Tromey  <tom@tromey.com>
+
+       * python/python-internal.h (thread_to_thread_object): Change
+       return type.
+       * python/py-inferior.c (thread_to_thread_object): Return a new
+       reference.
+       (infpy_thread_from_thread_handle): Update.
+       * python/py-infthread.c (gdbpy_selected_thread): Update.
+       * python/py-stopevent.c (create_stop_event_object): Update.
+       * python/py-threadevent.c (py_get_event_thread): Return a new
+       reference.
+       (py_get_event_thread): Update.
+       * python/py-event.h (py_get_event_thread): Change return type.
+       * python/py-continueevent.c (create_continue_event_object):
+       Update.
+
 2018-09-16  Tom Tromey  <tom@tromey.com>
 
        * python/py-progspace.c (pspy_get_objfiles): Update.
index 759b48313662566104cf191f196f17a0446b20e9..9708c0d4059ffca6a9e2533b5d4483fb7732edf0 100644 (file)
 static gdbpy_ref<>
 create_continue_event_object (ptid_t ptid)
 {
-  PyObject *py_thr = py_get_event_thread (ptid);
+  gdbpy_ref<> py_thr = py_get_event_thread (ptid);
 
   if (py_thr == nullptr)
     return nullptr;
 
-  return create_thread_event_object (&continue_event_object_type, py_thr);
+  return create_thread_event_object (&continue_event_object_type,
+                                    py_thr.get ());
 }
 
 /* Callback function which notifies observers when a continue event occurs.
index 56003e8785f6d2258d9933f5c9e1c69c6e340ba5..96be83b44c52f02509b8b151c71bcbba613c2fda 100644 (file)
@@ -68,9 +68,8 @@ extern gdbpy_ref<> create_event_object (PyTypeObject *py_type);
    running in non-stop mode then the event is thread specific, otherwise
    it is process wide.
    This function returns the currently stopped thread in non-stop mode and
-   Py_None otherwise.  In each case it returns a borrowed reference.  */
-extern PyObject *py_get_event_thread (ptid_t ptid)
-  CPYCHECKER_RETURNS_BORROWED_REF;
+   Py_None otherwise.  */
+extern gdbpy_ref<> py_get_event_thread (ptid_t ptid);
 
 extern gdbpy_ref<> create_thread_event_object (PyTypeObject *py_type,
                                               PyObject *thread);
index 512d9392d43f728537d54b51d1c16cf0e00a4585..68c4c9d411efaf0efd17bae18bf78602481f35c6 100644 (file)
@@ -306,7 +306,7 @@ find_inferior_object (int pid)
   return NULL;
 }
 
-thread_object *
+gdbpy_ref<>
 thread_to_thread_object (thread_info *thr)
 {
   gdbpy_ref<inferior_object> inf_obj (inferior_to_inferior_object (thr->inf));
@@ -317,7 +317,7 @@ thread_to_thread_object (thread_info *thr)
        thread != NULL;
        thread = thread->next)
     if (thread->thread_obj->thread == thr)
-      return thread->thread_obj;
+      return gdbpy_ref<>::new_reference ((PyObject *) thread->thread_obj);
 
   return NULL;
 }
@@ -832,7 +832,7 @@ infpy_is_valid (PyObject *self, PyObject *args)
 static PyObject *
 infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw)
 {
-  PyObject *handle_obj, *result;
+  PyObject *handle_obj;
   inferior_object *inf_obj = (inferior_object *) self;
   static const char *keywords[] = { "thread_handle", NULL };
 
@@ -841,8 +841,6 @@ infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw)
   if (! gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords, &handle_obj))
     return NULL;
 
-  result = Py_None;
-
   if (!gdbpy_is_value_object (handle_obj))
     {
       PyErr_SetString (PyExc_TypeError,
@@ -850,29 +848,27 @@ infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw)
 
       return NULL;
     }
-  else
+
+  gdbpy_ref<> result;
+  TRY
+    {
+      struct thread_info *thread_info;
+      struct value *val = value_object_to_value (handle_obj);
+
+      thread_info = find_thread_by_handle (val, inf_obj->inferior);
+      if (thread_info != NULL)
+       result = thread_to_thread_object (thread_info);
+    }
+  CATCH (except, RETURN_MASK_ALL)
     {
-      TRY
-       {
-         struct thread_info *thread_info;
-         struct value *val = value_object_to_value (handle_obj);
-
-         thread_info = find_thread_by_handle (val, inf_obj->inferior);
-         if (thread_info != NULL)
-           {
-             result = (PyObject *) thread_to_thread_object (thread_info);
-             if (result != NULL)
-               Py_INCREF (result);
-           }
-       }
-      CATCH (except, RETURN_MASK_ALL)
-       {
-         GDB_PY_HANDLE_EXCEPTION (except);
-       }
-      END_CATCH
+      GDB_PY_HANDLE_EXCEPTION (except);
     }
+  END_CATCH
 
-  return result;
+  if (result == NULL)
+    result = gdbpy_ref<>::new_reference (Py_None);
+
+  return result.release ();
 }
 
 /* Implement repr() for gdb.Inferior.  */
index 36ae71b635817f3b03d439f540515f9e10d3cb21..4b2705a0af66b809b1463d0d1ce561c7ba8f1b33 100644 (file)
@@ -284,15 +284,7 @@ PyObject *
 gdbpy_selected_thread (PyObject *self, PyObject *args)
 {
   if (inferior_ptid != null_ptid)
-    {
-      PyObject *thread_obj
-       = (PyObject *) thread_to_thread_object (inferior_thread ());
-      if (thread_obj != NULL)
-       {
-         Py_INCREF (thread_obj);
-         return thread_obj;
-       }
-    }
+    return thread_to_thread_object (inferior_thread ()).release ();
 
   Py_RETURN_NONE;
 }
index f6bd207f3b8ff5410408aef0af3054a4abfd8522..cbdf7b7e7e057a9d8add432f901441b6f6fae268 100644 (file)
@@ -23,8 +23,8 @@
 gdbpy_ref<>
 create_stop_event_object (PyTypeObject *py_type)
 {
-  return create_thread_event_object (py_type,
-                                    py_get_event_thread (inferior_ptid));
+  gdbpy_ref<> thread = py_get_event_thread (inferior_ptid);
+  return create_thread_event_object (py_type, thread.get ());
 }
 
 /* Callback observers when a stop event occurs.  This function will create a
index 4f822b4ae09c03c4eef9baf621fe9f2fb112fc90..13af1c840ba993afd7ba256fd331ca5196785ef3 100644 (file)
 
 /* See py-event.h.  */
 
-PyObject *
+gdbpy_ref<>
 py_get_event_thread (ptid_t ptid)
 {
-  PyObject *pythread = nullptr;
+  gdbpy_ref<> pythread;
 
   if (non_stop)
     {
       thread_info *thread = find_thread_ptid (ptid);
       if (thread != nullptr)
-       pythread = (PyObject *) thread_to_thread_object (thread);
+       pythread = thread_to_thread_object (thread);
     }
   else
-    pythread = Py_None;
+    pythread = gdbpy_ref<>::new_reference (Py_None);
 
   if (pythread == nullptr)
     {
index ad8d33372845337051c7e16da333fdc5315e1b41..0b42603dce6e4d721f4bac5fbdc68d25b7f178d5 100644 (file)
@@ -532,8 +532,7 @@ PyObject *gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw);
 PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch);
 
 thread_object *create_thread_object (struct thread_info *tp);
-thread_object *thread_to_thread_object (thread_info *thr)
-  CPYCHECKER_RETURNS_BORROWED_REF;
+gdbpy_ref<> thread_to_thread_object (thread_info *thr);;
 inferior_object *inferior_to_inferior_object (inferior *inf);
 
 const struct block *block_object_to_block (PyObject *obj);