]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/python: allow ref_ptr<T, Policy>::new_reference to accept subclasses of T
authorMatthieu Longo <matthieu.longo@arm.com>
Thu, 26 Feb 2026 17:20:20 +0000 (17:20 +0000)
committerMatthieu Longo <matthieu.longo@arm.com>
Tue, 10 Mar 2026 12:43:12 +0000 (12:43 +0000)
When ref_ptr<T,Policy>::new_reference() is specialized for 'PyObject'
(i.e. gdbpy_ref<>), it currently requires the argument type to be exactly
'PyObject *'. As a result, pointers to subclasses of 'PyObject' must be
explicitly cast before being passed, making call sites unnecessarily
verbose.

This patch makes ref_ptr<T,Policy>::new_reference() a template method
that accepts both T and subclasses of T, performing the cast to 'T *'
internally when needed. This removes redundant casts at call sites
without changing behavior.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/python/py-block.c
gdb/python/py-inferior.c
gdbsupport/gdb_ref_ptr.h

index 263819e12926ccb093badddbc672b7dffe83ebbf..4d77242ca0df7264023c5acda0fd638f4936ee49 100644 (file)
@@ -346,7 +346,7 @@ block_to_block_object (const struct block *block, struct objfile *objfile)
   block_object *result = (block_object *) htab_find_with_hash (table, block,
                                                               hash);
   if (result != nullptr)
-    return gdbpy_ref<>::new_reference ((PyObject *) result);
+    return gdbpy_ref<>::new_reference (result);
 
   result = PyObject_New (block_object, &block_object_type);
   if (result == nullptr)
index 76e3da9f62074a52e22ae8a7bba9339866a5a5fc..ed28ccf3c0712ee4115657815b3982ca70364ce3 100644 (file)
@@ -400,7 +400,7 @@ infpy_threads (PyObject *self, PyObject *args)
 
   for (const thread_map_t::value_type &entry : *inf_obj->threads)
     {
-      auto thr = gdbpy_ref<>::new_reference ((PyObject *) entry.second.get ());
+      gdbpy_ref<> thr = entry.second;
       if (PyTuple_SetItem (tuple.get (), i++, thr.release ()) < 0)
        return nullptr;
     }
index 4352ab3e7c097cda772180b33b33e8355ecc1ff5..0eb654324c6ae735f9db636c85a185718f4abe21 100644 (file)
@@ -197,9 +197,12 @@ public:
   }
 
   /* Acquire a new reference and return a ref_ptr that owns it.  */
-  static ref_ptr<T, Policy> new_reference (T *obj)
+  template <class TObj>
+  static ref_ptr<T, Policy> new_reference (TObj *obj)
   {
     Policy::incref (obj);
+    if constexpr (std::is_base_of<T, TObj>::value)
+      return ref_ptr<T, Policy> (static_cast<T *> (obj));
     return ref_ptr<T, Policy> (obj);
   }