From: Tom de Vries <tdevries@suse.de>
To: gdb-patches@sourceware.org
Subject: [PATCH v3 1/5] [gdb/python] Introduce py_{none, true, false, notimplemented} functions
Date: Fri, 15 May 2026 15:58:30 +0200 [thread overview]
Message-ID: <20260515135834.2502165-1-tdevries@suse.de> (raw)
I came across this code:
...
if (c)
return v;
else
Py_RETURN_NONE;
...
and realized I couldn't easily rewrite it into "return c ? v : ...".
Probably something like this would work:
...
return c ? v : ([] { Py_RETURN_NONE; } ());
...
but it made me wonder if we can rid of Py_RETURN_NONE.
The only point of it seems to be to increase the reference count on the
Py_None object for older python versions.
Add a refcount-safe wrapper py_none (returning a gdbpy_ref), with the aim of
replacing all uses of Py_RETURN_NONE with "return py_none ().release ()".
Likewise for Py_RETURN_TRUE/Py_RETURN_FALSE/Py_RETURN_NOTIMPLEMENTED.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34145
---
gdb/python/python-internal.h | 44 ++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 3147156d5be..7c58309e4d4 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -1343,4 +1343,48 @@ class gdbpy_memoizing_registry_storage
extern int eval_python_command (const char *command, int start_symbol,
const char *filename = nullptr);
+/* The following four functions are refcount-safe wrappers around
+ Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED}.
+
+ Starting with python 3.12, None, True, False and Py_NotImplemented are
+ immortal, and increasing and decreasing refcount for such objects is a
+ no-op, and consequently for the limited C API 3.12 and newer,
+ Py_RETURN_NONE is simply "return Py_None".
+
+ So for the limited C API 3.12 and newer, we could just return a
+ "PyObject *" instead.
+
+ For the limited C API 3.12 and newer, while returning gdbpy_ref<> there's
+ an imbalance (we do a Py_DECREF in gdbpy_ref_policy::decref, without
+ corresponding Py_INCREF in Py_RETURN_NONE), but this is not harmful because
+ Py_DECREF is no-op for immortal objects. */
+
+static inline gdbpy_ref<>
+py_none ()
+{
+ auto f = [] { Py_RETURN_NONE; };
+ return gdbpy_ref<> (f ());
+}
+
+static inline gdbpy_ref<>
+py_true ()
+{
+ auto f = [] { Py_RETURN_TRUE; };
+ return gdbpy_ref<> (f ());
+}
+
+static inline gdbpy_ref<>
+py_false ()
+{
+ auto f = [] { Py_RETURN_FALSE; };
+ return gdbpy_ref<> (f ());
+}
+
+static inline gdbpy_ref<>
+py_notimplemented ()
+{
+ auto f = [] { Py_RETURN_NOTIMPLEMENTED; };
+ return gdbpy_ref<> (f ());
+}
+
#endif /* GDB_PYTHON_PYTHON_INTERNAL_H */
base-commit: 79fcceafcbfe9aa02441445eb9444718b17330df
--
2.51.0
next reply other threads:[~2026-05-15 13:59 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-15 13:58 Tom de Vries [this message]
2026-05-15 13:58 ` [PATCH v3 2/5] [gdb/python] Remove Py_RETURN_{NONE, TRUE, FALSE, NOTIMPLEMENTED} Tom de Vries
2026-05-15 13:58 ` [PATCH v3 3/5] [gdb/python] Undefine " Tom de Vries
2026-05-15 14:05 ` Tom de Vries
2026-05-15 17:40 ` Tom Tromey
2026-05-15 13:58 ` [PATCH v3 4/5] [gdb/python] Use py_{none,false} more often Tom de Vries
2026-05-15 17:39 ` Tom Tromey
2026-05-15 13:58 ` [PATCH v3 5/5] [gdb/python] Use py_{none,notimplemented} " Tom de Vries
2026-05-15 17:38 ` Tom Tromey
2026-05-15 17:36 ` [PATCH v3 1/5] [gdb/python] Introduce py_{none, true, false, notimplemented} functions Tom Tromey
2026-05-15 17:44 ` Tom de Vries
2026-05-15 18:36 ` Tom Tromey
2026-05-15 19:08 ` Tom de Vries
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=20260515135834.2502165-1-tdevries@suse.de \
--to=tdevries@suse.de \
--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