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]