https://github.com/python/cpython/commit/c58b7136b2e602c335d2e2c4198a45f5d30b8f10
commit: c58b7136b2e602c335d2e2c4198a45f5d30b8f10
branch: main
author: Donghee Na <[email protected]>
committer: ZeroIntensity <[email protected]>
date: 2026-10-22T05:45:16Z
summary:

gh-114258: Use Argument Clinic for ``__bool__`` (GH-160057)

files:
M Lib/test/test_clinic.py
M Modules/_dbmmodule.c
M Modules/_gdbmmodule.c
M Modules/clinic/_dbmmodule.c.h
M Modules/clinic/_gdbmmodule.c.h
M Tools/clinic/libclinic/slots.py

diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py
index 1860d9eae95e29..e0a48dd9021fb8 100644
--- a/Lib/test/test_clinic.py
+++ b/Lib/test/test_clinic.py
@@ -15,7 +15,6 @@
 import re
 import sys
 import unittest
-from unittest import mock
 import warnings
 
 test_tools.skip_if_missing('clinic')
@@ -35,7 +34,7 @@
     from libclinic.block_parser import Block, BlockParser
     from libclinic.codegen import BlockPrinter, Destination
     from libclinic.dsl_parser import DSLParser
-    from libclinic.slots import SlotSpec, SLOTS
+    from libclinic.slots import SLOTS
     from libclinic.cli import parse_file, Clinic
 
 
@@ -856,9 +855,8 @@ class Foo "FooObject *" "&Foo_Type"
             self.assertNotIn(text, generated)
 
     def test_slot_with_parameters_and_return_type(self):
-        # Slots which take arguments or return something else than an
-        # object are not supported yet; check the machinery with them.
-        slots = {'__bool__': SlotSpec(return_converter='int')}
+        # Check the machinery with slots which take arguments or return
+        # something else than an object.
         block = """
             /*[clinic input]
             output everything block
@@ -874,8 +872,7 @@ class Foo "FooObject *" "&Foo_Type"
             Foo.__bool__
             [clinic start generated code]*/
         """
-        with mock.patch.dict(SLOTS, slots):
-            generated = self.clinic.parse(dedent(block))
+        generated = self.clinic.parse(dedent(block))
         self.assertIn(dedent("""
             static int
             Foo_contains(PyObject *self, PyObject *value)
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 4e9f7f1e2ccb5c..fe2d34a53b5711 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -145,10 +145,16 @@ dbm_length_impl(dbmobject *self)
     return dp->di_size;
 }
 
+/*[clinic input]
+@critical_section
+_dbm.dbm.__bool__ as dbm_bool
+[clinic start generated code]*/
+
 static int
-dbm_bool_lock_held(PyObject *self)
+dbm_bool_impl(dbmobject *self)
+/*[clinic end generated code: output=b550ce1ae52d6ad1 input=212af765b6e60719]*/
 {
-    dbmobject *dp = dbmobject_CAST(self);
+    dbmobject *dp = self;
     _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
     assert(state != NULL);
 
@@ -177,16 +183,6 @@ dbm_bool_lock_held(PyObject *self)
     return 1;
 }
 
-static int
-dbm_bool(PyObject *self)
-{
-    int result;
-    Py_BEGIN_CRITICAL_SECTION(self);
-    result = dbm_bool_lock_held(self);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 /*[clinic input]
 @critical_section
 _dbm.dbm.__getitem__ as dbm_subscript
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index e730645cfac9e6..2cec6e0a0bafbb 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -189,10 +189,16 @@ gdbm_length_impl(gdbmobject *self)
     return dp->di_size;
 }
 
+/*[clinic input]
+@critical_section
+_gdbm.gdbm.__bool__ as gdbm_bool
+[clinic start generated code]*/
+
 static int
-gdbm_bool_lock_held(PyObject *op)
+gdbm_bool_impl(gdbmobject *self)
+/*[clinic end generated code: output=91316ca18acb945c input=bf2878ff5e311848]*/
 {
-    gdbmobject *dp = _gdbmobject_CAST(op);
+    gdbmobject *dp = self;
     _gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
     if (dp->di_dbm == NULL) {
         PyErr_SetString(state->gdbm_error, "GDBM object has already been 
closed");
@@ -219,16 +225,6 @@ gdbm_bool_lock_held(PyObject *op)
     return 1;
 }
 
-static int
-gdbm_bool(PyObject *op)
-{
-    int result;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    result = gdbm_bool_lock_held(op);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 // Wrapper function for PyArg_Parse(o, "s#", &d.dptr, &d.size).
 // This function is needed to support PY_SSIZE_T_CLEAN.
 // Return 1 on success, same to PyArg_Parse().
diff --git a/Modules/clinic/_dbmmodule.c.h b/Modules/clinic/_dbmmodule.c.h
index 294730c7c90c8f..ad3a5b149299a2 100644
--- a/Modules/clinic/_dbmmodule.c.h
+++ b/Modules/clinic/_dbmmodule.c.h
@@ -21,6 +21,21 @@ dbm_length(PyObject *self)
     return return_value;
 }
 
+static int
+dbm_bool_impl(dbmobject *self);
+
+static int
+dbm_bool(PyObject *self)
+{
+    int return_value = -1;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = dbm_bool_impl((dbmobject *)self);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static PyObject *
 dbm_subscript_impl(dbmobject *self, PyObject *key);
 
@@ -309,4 +324,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t 
nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=23fc8f92cd569b86 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=4fa1cc840de2abd3 input=a9049054013a1b77]*/
diff --git a/Modules/clinic/_gdbmmodule.c.h b/Modules/clinic/_gdbmmodule.c.h
index 6c3c8329b59bd8..010e1369fbdc9b 100644
--- a/Modules/clinic/_gdbmmodule.c.h
+++ b/Modules/clinic/_gdbmmodule.c.h
@@ -21,6 +21,21 @@ gdbm_length(PyObject *self)
     return return_value;
 }
 
+static int
+gdbm_bool_impl(gdbmobject *self);
+
+static int
+gdbm_bool(PyObject *self)
+{
+    int return_value = -1;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = gdbm_bool_impl((gdbmobject *)self);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static PyObject *
 gdbm_subscript_impl(gdbmobject *self, PyObject *key);
 
@@ -461,4 +476,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t 
nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=8cc26c8a6790ecac input=a9049054013a1b77]*/
+/*[clinic end generated code: output=f4c81f6e2181a474 input=a9049054013a1b77]*/
diff --git a/Tools/clinic/libclinic/slots.py b/Tools/clinic/libclinic/slots.py
index 8bb9d7a586d1f8..173f9eebc15bb2 100644
--- a/Tools/clinic/libclinic/slots.py
+++ b/Tools/clinic/libclinic/slots.py
@@ -39,6 +39,7 @@ def make_return_converter(self) -> CReturnConverter:
 # not be in dsl_parser.unsupported_special_methods.
 SLOTS: Final[dict[str, SlotSpec]] = {
     '__add__': SlotSpec(return_converter='object'),
+    '__bool__': SlotSpec(return_converter='int'),
     '__contains__': SlotSpec(return_converter='int'),
     '__getitem__': SlotSpec(return_converter='object'),
     '__iadd__': SlotSpec(return_converter='object'),

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to