From: Matthieu Longo Date: Thu, 26 Feb 2026 17:20:20 +0000 (+0000) Subject: gdb/python: allow ref_ptr::new_reference to accept subclasses of T X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=f0cfbf6ceda8396291d736858cfd713cc4a0e0da;p=thirdparty%2Fbinutils-gdb.git gdb/python: allow ref_ptr::new_reference to accept subclasses of T When ref_ptr::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::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 --- diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index 263819e1292..4d77242ca0d 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -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) diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 76e3da9f620..ed28ccf3c07 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -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; } diff --git a/gdbsupport/gdb_ref_ptr.h b/gdbsupport/gdb_ref_ptr.h index 4352ab3e7c0..0eb654324c6 100644 --- a/gdbsupport/gdb_ref_ptr.h +++ b/gdbsupport/gdb_ref_ptr.h @@ -197,9 +197,12 @@ public: } /* Acquire a new reference and return a ref_ptr that owns it. */ - static ref_ptr new_reference (T *obj) + template + static ref_ptr new_reference (TObj *obj) { Policy::incref (obj); + if constexpr (std::is_base_of::value) + return ref_ptr (static_cast (obj)); return ref_ptr (obj); }