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
next prev 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