Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 04/10] Return gdbpy_ref<> from block_to_block_object
Date: Fri, 20 Feb 2026 14:03:50 -0700	[thread overview]
Message-ID: <20260220-python-safety-minor-v1-4-4c4b12e445af@adacore.com> (raw)
In-Reply-To: <20260220-python-safety-minor-v1-0-4c4b12e445af@adacore.com>

This changes block_to_block_object to return a gdbpy_ref<>,
using the type system to convey that a new reference is always
returned.
---
 gdb/python/py-block.c        | 20 +++++++-------------
 gdb/python/py-frame.c        |  3 ++-
 gdb/python/py-progspace.c    |  2 +-
 gdb/python/py-symtab.c       |  6 ++++--
 gdb/python/py-unwind.c       |  3 ++-
 gdb/python/python-internal.h |  4 ++--
 6 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c
index 718aca17829..263819e1292 100644
--- a/gdb/python/py-block.c
+++ b/gdb/python/py-block.c
@@ -143,7 +143,7 @@ blpy_get_superblock (PyObject *self, void *closure)
 
   super_block = block->superblock ();
   if (super_block)
-    return block_to_block_object (super_block, self_obj->objfile);
+    return block_to_block_object (super_block, self_obj->objfile).release ();
 
   Py_RETURN_NONE;
 }
@@ -168,7 +168,7 @@ blpy_get_subblocks (PyObject *self, void *closure)
     {
       if (each->superblock () == block)
 	{
-	  gdbpy_ref<> item (block_to_block_object (each, cu->objfile ()));
+	  gdbpy_ref<> item = block_to_block_object (each, cu->objfile ());
 
 	  if (item.get () == nullptr
 	      || PyList_Append (list.get (), item.get ()) == -1)
@@ -192,9 +192,7 @@ blpy_get_global_block (PyObject *self, void *closure)
 
   global_block = block->global_block ();
 
-  return block_to_block_object (global_block,
-				self_obj->objfile);
-
+  return block_to_block_object (global_block, self_obj->objfile).release ();
 }
 
 /* Return the static block associated to this block.  Return None
@@ -214,7 +212,7 @@ blpy_get_static_block (PyObject *self, void *closure)
 
   static_block = block->static_block ();
 
-  return block_to_block_object (static_block, self_obj->objfile);
+  return block_to_block_object (static_block, self_obj->objfile).release ();
 }
 
 /* Implementation of gdb.Block.is_global (self) -> Boolean.
@@ -333,7 +331,7 @@ blpy_dealloc (PyObject *obj)
 
 /* Create a new block object (gdb.Block) that encapsulates the struct
    block object from GDB.  */
-PyObject *
+gdbpy_ref<>
 block_to_block_object (const struct block *block, struct objfile *objfile)
 {
   htab_t table = blpy_objfile_data_key.get (objfile);
@@ -348,11 +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)
-    {
-      PyObject *py_result = (PyObject *) result;
-      Py_INCREF (py_result);
-      return py_result;
-    }
+    return gdbpy_ref<>::new_reference ((PyObject *) result);
 
   result = PyObject_New (block_object, &block_object_type);
   if (result == nullptr)
@@ -364,7 +358,7 @@ block_to_block_object (const struct block *block, struct objfile *objfile)
   void **slot = htab_find_slot_with_hash (table, block, hash, INSERT);
   *slot = result;
 
-  return (PyObject *) result;
+  return gdbpy_ref<> (result);
 }
 
 /* Return struct block reference that is wrapped by this object.  */
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index e98edd52cfb..d9af3639d29 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -323,7 +323,8 @@ frapy_block (PyObject *self, PyObject *args)
       return NULL;
     }
 
-  return block_to_block_object (block, fn_block->function ()->objfile ());
+  return block_to_block_object (block,
+				fn_block->function ()->objfile ()).release ();
 }
 
 
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index 8b5ada2dc2e..587bcf1b8c3 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -522,7 +522,7 @@ pspy_block_for_pc (PyObject *o, PyObject *args)
     Py_RETURN_NONE;
 
   if (block)
-    return block_to_block_object (block, cust->objfile ());
+    return block_to_block_object (block, cust->objfile ()).release ();
 
   Py_RETURN_NONE;
 }
diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c
index 3b05721e616..550f287a6ee 100644
--- a/gdb/python/py-symtab.c
+++ b/gdb/python/py-symtab.c
@@ -188,7 +188,8 @@ stpy_global_block (PyObject *self, PyObject *args)
   blockvector = symtab->compunit ()->blockvector ();
   const struct block *block = blockvector->global_block ();
 
-  return block_to_block_object (block, symtab->compunit ()->objfile ());
+  return block_to_block_object (block,
+				symtab->compunit ()->objfile ()).release ();
 }
 
 /* Return the STATIC_BLOCK of the underlying symtab.  */
@@ -204,7 +205,8 @@ stpy_static_block (PyObject *self, PyObject *args)
   blockvector = symtab->compunit ()->blockvector ();
   const struct block *block = blockvector->static_block ();
 
-  return block_to_block_object (block, symtab->compunit ()->objfile ());
+  return block_to_block_object (block,
+				symtab->compunit ()->objfile ()).release ();
 }
 
 /* Implementation of gdb.Symtab.linetable (self) -> gdb.LineTable.
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index a71aaac7335..5465d3d6cf9 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -666,7 +666,8 @@ pending_framepy_block (PyObject *self, PyObject *args)
       return nullptr;
     }
 
-  return block_to_block_object (block, fn_block->function ()->objfile ());
+  return block_to_block_object (block,
+				fn_block->function ()->objfile ()).release ();
 }
 
 /* Implement gdb.PendingFrame.function().  Return a gdb.Symbol
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 8d101e8afb6..de4226868dc 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -498,8 +498,8 @@ PyObject *gdbpy_register_tui_window (PyObject *self, PyObject *args,
 gdbpy_ref<> symtab_and_line_to_sal_object (struct symtab_and_line sal);
 gdbpy_ref<> symtab_to_symtab_object (struct symtab *symtab);
 gdbpy_ref<> symbol_to_symbol_object (struct symbol *sym);
-PyObject *block_to_block_object (const struct block *block,
-				 struct objfile *objfile);
+gdbpy_ref<> block_to_block_object (const struct block *block,
+				   struct objfile *objfile);
 PyObject *value_to_value_object (struct value *v);
 PyObject *type_to_type_object (struct type *);
 PyObject *frame_info_to_frame_object (const frame_info_ptr &frame);

-- 
2.53.0


  parent reply	other threads:[~2026-02-20 21:05 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-20 21:03 [PATCH 00/10] Mildly better refcount safety for Python Tom Tromey
2026-02-20 21:03 ` [PATCH 01/10] Return gdbpy_ref<> from symtab_and_line_to_sal_object Tom Tromey
2026-02-21  1:58   ` Simon Marchi
2026-02-21  2:13     ` Simon Marchi
2026-02-21 22:33       ` Tom Tromey
2026-02-23 12:28     ` Tom Tromey
2026-02-20 21:03 ` [PATCH 02/10] Return gdbpy_ref<> from symbol_to_symbol_object Tom Tromey
2026-02-21  2:28   ` Simon Marchi
2026-02-21 22:35     ` Tom Tromey
2026-02-20 21:03 ` [PATCH 03/10] Return gdbpy_ref<> from symtab_to_symtab_object Tom Tromey
2026-02-20 21:03 ` Tom Tromey [this message]
2026-02-20 21:03 ` [PATCH 05/10] Return gdbpy_ref<> from value_to_value_object Tom Tromey
2026-02-20 21:03 ` [PATCH 06/10] Return gdbpy_ref<> from type_to_type_object Tom Tromey
2026-02-20 21:03 ` [PATCH 07/10] Return gdbpy_ref<> from frame_info_to_frame_object Tom Tromey
2026-02-20 21:03 ` [PATCH 08/10] Return gdbpy_ref<> from symtab_to_linetable_object Tom Tromey
2026-02-20 21:03 ` [PATCH 09/10] Return gdbpy_ref<> from gdbarch_to_arch_object Tom Tromey
2026-02-20 21:03 ` [PATCH 10/10] Return gdbpy_ref<> from gdbpy_registry::lookup Tom Tromey
2026-02-21  2:31 ` [PATCH 00/10] Mildly better refcount safety for Python 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=20260220-python-safety-minor-v1-4-4c4b12e445af@adacore.com \
    --to=tromey@adacore.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