https://github.com/python/cpython/commit/c1c4c18dfc7c4daa37cba79ebc00ea07286c90a0
commit: c1c4c18dfc7c4daa37cba79ebc00ea07286c90a0
branch: main
author: Donghee Na <[email protected]>
committer: corona10 <[email protected]>
date: 2026-10-22T01:06:48Z
summary:

gh-114258: Use Argument Clinic for ``__getitem__`` (gh-160068)

files:
M Lib/test/test_clinic.py
M Modules/_collectionsmodule.c
M Modules/_ctypes/_ctypes.c
M Modules/_ctypes/clinic/_ctypes.c.h
M Modules/_dbmmodule.c
M Modules/_gdbmmodule.c
M Modules/clinic/_collectionsmodule.c.h
M Modules/clinic/_dbmmodule.c.h
M Modules/clinic/_gdbmmodule.c.h
M Modules/clinic/mmapmodule.c.h
M Modules/mmapmodule.c
M Objects/bytearrayobject.c
M Objects/clinic/bytearrayobject.c.h
M Tools/clinic/libclinic/dsl_parser.py
M Tools/clinic/libclinic/slots.py

diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py
index 8293003f8ce925..1860d9eae95e29 100644
--- a/Lib/test/test_clinic.py
+++ b/Lib/test/test_clinic.py
@@ -34,7 +34,7 @@
     from libclinic.return_converters import return_converters, 
int_return_converter
     from libclinic.block_parser import Block, BlockParser
     from libclinic.codegen import BlockPrinter, Destination
-    from libclinic.dsl_parser import DSLParser, unsupported_special_methods
+    from libclinic.dsl_parser import DSLParser
     from libclinic.slots import SlotSpec, SLOTS
     from libclinic.cli import parse_file, Clinic
 
@@ -3368,8 +3368,8 @@ class Foo "FooObject *" ""
         self.assertIn("METH_COEXIST", function.methoddef_flags)
 
     def test_slot_parameters(self):
-        # __getitem__ is not supported yet; its parameter gives the slot
-        # (Py_ssize_t for sq_item, object for mp_subscript) and is not parsed.
+        # The parameter of __getitem__ gives the slot (Py_ssize_t for
+        # sq_item, object for mp_subscript) and is not parsed.
         block = """
             module foo
             class Foo "FooObject *" ""
@@ -3383,21 +3383,17 @@ class Foo "FooObject *" ""
             ("Foo.__getitem__\n    key: object = None\n    /",
              "The parameters of '__getitem__' cannot have a default value"),
         ]
-        supported = unsupported_special_methods - {'__getitem__'}
-        with (mock.patch.dict(SLOTS, {'__getitem__': 
SlotSpec(return_converter='object')}),
-              mock.patch.object(libclinic.dsl_parser,
-                                'unsupported_special_methods', supported)):
-            for converter in "Py_ssize_t", "object":
-                with self.subTest(converter=converter):
-                    function = self.parse_function(
-                        block.format(converter=converter),
-                        signatures_in_block=3, function_index=2)
-                    self.assertIs(function.kind, FunctionKind.SLOT)
-                    self.assertEqual(list(function.parameters), ["self", 
"key"])
-            for body, err in errors:
-                with self.subTest(block=body):
-                    body = 'class Foo "FooObject *" "&Foo_Type"\n' + body
-                    self.expect_failure(body, err)
+        for converter in ["Py_ssize_t", "object"]:
+            with self.subTest(converter=converter):
+                function = self.parse_function(
+                    block.format(converter=converter),
+                    signatures_in_block=3, function_index=2)
+                self.assertIs(function.kind, FunctionKind.SLOT)
+                self.assertEqual(list(function.parameters), ["self", "key"])
+        for body, err in errors:
+            with self.subTest(block=body):
+                body = 'class Foo "FooObject *" "&Foo_Type"\n' + body
+                self.expect_failure(body, err)
 
     def test_slot_errors(self):
         cases = [
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 1d8181e9299f14..0626cc6a70bc8f 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -1376,8 +1376,17 @@ valid_index(Py_ssize_t i, Py_ssize_t limit)
     return (size_t) i < (size_t) limit;
 }
 
+/*[clinic input]
+@critical_section
+_collections.deque.__getitem__ as deque_item
+    deque: dequeobject
+    i: Py_ssize_t
+    /
+[clinic start generated code]*/
+
 static PyObject *
-deque_item_lock_held(dequeobject *deque, Py_ssize_t i)
+deque_item_impl(dequeobject *deque, Py_ssize_t i)
+/*[clinic end generated code: output=52e62af1427d61ef input=89f14f06b29122a1]*/
 {
     block *b;
     PyObject *item;
@@ -1415,17 +1424,6 @@ deque_item_lock_held(dequeobject *deque, Py_ssize_t i)
     return Py_NewRef(item);
 }
 
-static PyObject *
-deque_item(PyObject *self, Py_ssize_t i)
-{
-    dequeobject *deque = dequeobject_CAST(self);
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(deque);
-    result = deque_item_lock_held(deque, i);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 static int
 deque_del_item(dequeobject *deque, Py_ssize_t i)
 {
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index af3748a0124ec5..bbd744cdba8b38 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -5026,8 +5026,17 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
     return 0;
 }
 
+/*[clinic input]
+@critical_section
+_ctypes.Array.__getitem__ as Array_item
+    myself: self
+    index: Py_ssize_t
+    /
+[clinic start generated code]*/
+
 static PyObject *
-Array_item_lock_held(PyObject *myself, Py_ssize_t index)
+Array_item_impl(PyObject *myself, Py_ssize_t index)
+/*[clinic end generated code: output=d038162d727d7d9b input=68fa9889c77bb8c9]*/
 {
     _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
 
@@ -5056,18 +5065,17 @@ Array_item_lock_held(PyObject *myself, Py_ssize_t index)
                        index, size, self->b_ptr + offset);
 }
 
-static PyObject *
-Array_item(PyObject *myself, Py_ssize_t index)
-{
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(myself);
-    result = Array_item_lock_held(myself, index);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
+/*[clinic input]
+@critical_section
+_ctypes.Array.__getitem__ as Array_subscript
+    myself: self
+    item: object
+    /
+[clinic start generated code]*/
 
 static PyObject *
-Array_subscript_lock_held(PyObject *myself, PyObject *item)
+Array_subscript_impl(PyObject *myself, PyObject *item)
+/*[clinic end generated code: output=5c88d612ad5c8a1a input=510935495a857cac]*/
 {
     _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
 
@@ -5080,7 +5088,7 @@ Array_subscript_lock_held(PyObject *myself, PyObject 
*item)
             return NULL;
         if (i < 0)
             i += self->b_length;
-        return Array_item_lock_held(myself, i);
+        return Array_item_impl(myself, i);
     }
     else if (PySlice_Check(item)) {
         PyObject *proto;
@@ -5168,7 +5176,7 @@ Array_subscript_lock_held(PyObject *myself, PyObject 
*item)
 
         for (cur = start, i = 0; i < slicelen;
              cur += step, i++) {
-            PyObject *v = Array_item_lock_held(myself, cur);
+            PyObject *v = Array_item_impl(myself, cur);
             if (v == NULL) {
                 Py_DECREF(np);
                 return NULL;
@@ -5185,16 +5193,6 @@ Array_subscript_lock_held(PyObject *myself, PyObject 
*item)
 }
 
 
-static PyObject *
-Array_subscript(PyObject *myself, PyObject *item)
-{
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(myself);
-    result = Array_subscript_lock_held(myself, item);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 /*[clinic input]
 @critical_section
 _ctypes.Array.__setitem__ as Array_ass_item
@@ -5577,8 +5575,22 @@ static PyType_Spec pycsimple_spec = {
 /*
   PyCPointer_Type
 */
+/*[clinic input]
+class _ctypes._Pointer "PyObject *" "clinic_state()->PyCPointer_Type"
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=452695db70aa7c3e]*/
+
+/*[clinic input]
+@critical_section
+_ctypes._Pointer.__getitem__ as Pointer_item
+    myself: self
+    index: Py_ssize_t
+    /
+[clinic start generated code]*/
+
 static PyObject *
-Pointer_item_lock_held(PyObject *myself, Py_ssize_t index)
+Pointer_item_impl(PyObject *myself, Py_ssize_t index)
+/*[clinic end generated code: output=4ae9d566e8038853 input=17943427cd04ed08]*/
 {
     CDataObject *self = _CDataObject_CAST(myself);
     _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
@@ -5617,21 +5629,6 @@ Pointer_item_lock_held(PyObject *myself, Py_ssize_t 
index)
                        index, size, (char *)((char *)deref + offset));
 }
 
-static PyObject *
-Pointer_item(PyObject *self, Py_ssize_t index)
-{
-    PyObject *res;
-    Py_BEGIN_CRITICAL_SECTION(self);
-    res = Pointer_item_lock_held(self, index);
-    Py_END_CRITICAL_SECTION();
-    return res;
-}
-
-/*[clinic input]
-class _ctypes._Pointer "PyObject *" "clinic_state()->PyCPointer_Type"
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=452695db70aa7c3e]*/
-
 /*[clinic input]
 @critical_section
 _ctypes._Pointer.__setitem__ as Pointer_ass_item
@@ -5824,7 +5821,7 @@ copy_pointer_to_list_lock_held(PyObject *myself, PyObject 
*np, Py_ssize_t len,
     Py_ssize_t i;
     size_t cur;
     for (cur = start, i = 0; i < len; cur += step, i++) {
-        PyObject *v = Pointer_item_lock_held(myself, cur);
+        PyObject *v = Pointer_item_impl(myself, cur);
         if (!v) {
             return -1;
         }
diff --git a/Modules/_ctypes/clinic/_ctypes.c.h 
b/Modules/_ctypes/clinic/_ctypes.c.h
index 4eb89baab4b809..adc1a6011b230b 100644
--- a/Modules/_ctypes/clinic/_ctypes.c.h
+++ b/Modules/_ctypes/clinic/_ctypes.c.h
@@ -746,6 +746,36 @@ _ctypes_CFuncPtr_argtypes_get(PyObject *self, void 
*Py_UNUSED(context))
     return return_value;
 }
 
+static PyObject *
+Array_item_impl(PyObject *myself, Py_ssize_t index);
+
+static PyObject *
+Array_item(PyObject *myself, Py_ssize_t index)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(myself);
+    return_value = Array_item_impl(myself, index);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
+static PyObject *
+Array_subscript_impl(PyObject *myself, PyObject *item);
+
+static PyObject *
+Array_subscript(PyObject *myself, PyObject *item)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(myself);
+    return_value = Array_subscript_impl(myself, item);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static int
 Array_ass_item_impl(PyObject *myself, Py_ssize_t index, PyObject *value);
 
@@ -835,6 +865,21 @@ Simple_from_outparm(PyObject *self, PyTypeObject *cls, 
PyObject *const *args, Py
     return Simple_from_outparm_impl(self, cls);
 }
 
+static PyObject *
+Pointer_item_impl(PyObject *myself, Py_ssize_t index);
+
+static PyObject *
+Pointer_item(PyObject *myself, Py_ssize_t index)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(myself);
+    return_value = Pointer_item_impl(myself, index);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static int
 Pointer_ass_item_impl(PyObject *myself, Py_ssize_t index, PyObject *value);
 
@@ -863,4 +908,4 @@ Pointer_ass_item(PyObject *myself, Py_ssize_t index, 
PyObject *value)
 
 #define _CTYPES_SIMPLE_VALUE_GETSETDEF {"value", 
(getter)_ctypes_Simple_value_get, (setter)_ctypes_Simple_value_set, NULL},
 
-/*[clinic end generated code: output=f01123efc29f8ae0 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=8fc24edc31ab60b5 input=a9049054013a1b77]*/
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 7201973bf7f6ba..4e9f7f1e2ccb5c 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -187,12 +187,20 @@ dbm_bool(PyObject *self)
     return result;
 }
 
+/*[clinic input]
+@critical_section
+_dbm.dbm.__getitem__ as dbm_subscript
+    key: object
+    /
+[clinic start generated code]*/
+
 static PyObject *
-dbm_subscript_lock_held(PyObject *self, PyObject *key)
+dbm_subscript_impl(dbmobject *self, PyObject *key)
+/*[clinic end generated code: output=6278465f3ff37eaa input=e748b684a0870527]*/
 {
     datum drec, krec;
     Py_ssize_t tmp_size;
-    dbmobject *dp = dbmobject_CAST(self);
+    dbmobject *dp = self;
     _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
     assert(state != NULL);
     if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size)) {
@@ -214,16 +222,6 @@ dbm_subscript_lock_held(PyObject *self, PyObject *key)
     return PyBytes_FromStringAndSize(drec.dptr, drec.dsize);
 }
 
-static PyObject *
-dbm_subscript(PyObject *self, PyObject *key)
-{
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(self);
-    result = dbm_subscript_lock_held(self, key);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 /*[clinic input]
 @critical_section
 _dbm.dbm.__setitem__ as dbm_ass_sub
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index 69bad7e137e24a..e730645cfac9e6 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -250,12 +250,20 @@ parse_datum(PyObject *o, datum *d, const char *failmsg)
     return 1;
 }
 
+/*[clinic input]
+@critical_section
+_gdbm.gdbm.__getitem__ as gdbm_subscript
+    key: object
+    /
+[clinic start generated code]*/
+
 static PyObject *
-gdbm_subscript_lock_held(PyObject *op, PyObject *key)
+gdbm_subscript_impl(gdbmobject *self, PyObject *key)
+/*[clinic end generated code: output=e96388d53678e967 input=8324d90d97ae98f0]*/
 {
     PyObject *v;
     datum drec, krec;
-    gdbmobject *dp = _gdbmobject_CAST(op);
+    gdbmobject *dp = self;
     _gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
 
     if (!parse_datum(key, &krec, NULL)) {
@@ -276,16 +284,6 @@ gdbm_subscript_lock_held(PyObject *op, PyObject *key)
     return v;
 }
 
-static PyObject *
-gdbm_subscript(PyObject *op, PyObject *key)
-{
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    result = gdbm_subscript_lock_held(op, key);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 /*[clinic input]
 _gdbm.gdbm.get
 
diff --git a/Modules/clinic/_collectionsmodule.c.h 
b/Modules/clinic/_collectionsmodule.c.h
index a5f4962ccf4cb8..2966d68aa3813b 100644
--- a/Modules/clinic/_collectionsmodule.c.h
+++ b/Modules/clinic/_collectionsmodule.c.h
@@ -455,6 +455,21 @@ deque_insert(PyObject *deque, PyObject *const *args, 
Py_ssize_t nargs)
     return return_value;
 }
 
+static PyObject *
+deque_item_impl(dequeobject *deque, Py_ssize_t i);
+
+static PyObject *
+deque_item(PyObject *deque, Py_ssize_t i)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(deque);
+    return_value = deque_item_impl((dequeobject *)deque, i);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 PyDoc_STRVAR(deque_remove__doc__,
 "remove($self, value, /)\n"
 "--\n"
@@ -692,4 +707,4 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, 
PyObject *kwargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=fca551851f7a658e input=a9049054013a1b77]*/
+/*[clinic end generated code: output=de400069cf6f11a4 input=a9049054013a1b77]*/
diff --git a/Modules/clinic/_dbmmodule.c.h b/Modules/clinic/_dbmmodule.c.h
index d71aa1362a4d34..294730c7c90c8f 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 PyObject *
+dbm_subscript_impl(dbmobject *self, PyObject *key);
+
+static PyObject *
+dbm_subscript(PyObject *self, PyObject *key)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = dbm_subscript_impl((dbmobject *)self, key);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static int
 dbm_ass_sub_impl(dbmobject *self, PyObject *v, PyObject *w);
 
@@ -294,4 +309,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t 
nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=6ff4681a893c22ad input=a9049054013a1b77]*/
+/*[clinic end generated code: output=23fc8f92cd569b86 input=a9049054013a1b77]*/
diff --git a/Modules/clinic/_gdbmmodule.c.h b/Modules/clinic/_gdbmmodule.c.h
index 062b6b0374664a..6c3c8329b59bd8 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 PyObject *
+gdbm_subscript_impl(gdbmobject *self, PyObject *key);
+
+static PyObject *
+gdbm_subscript(PyObject *self, PyObject *key)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = gdbm_subscript_impl((gdbmobject *)self, key);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 PyDoc_STRVAR(_gdbm_gdbm_get__doc__,
 "get($self, key, default=None, /)\n"
 "--\n"
@@ -446,4 +461,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t 
nargs)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=10c193b33298877a input=a9049054013a1b77]*/
+/*[clinic end generated code: output=8cc26c8a6790ecac input=a9049054013a1b77]*/
diff --git a/Modules/clinic/mmapmodule.c.h b/Modules/clinic/mmapmodule.c.h
index 04c0aaff020d29..ece08c0fb6007c 100644
--- a/Modules/clinic/mmapmodule.c.h
+++ b/Modules/clinic/mmapmodule.c.h
@@ -892,6 +892,36 @@ mmap_length(PyObject *self)
     return return_value;
 }
 
+static PyObject *
+mmap_item_impl(mmap_object *self, Py_ssize_t i);
+
+static PyObject *
+mmap_item(PyObject *self, Py_ssize_t i)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = mmap_item_impl((mmap_object *)self, i);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
+static PyObject *
+mmap_subscript_impl(mmap_object *self, PyObject *item);
+
+static PyObject *
+mmap_subscript(PyObject *self, PyObject *item)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = mmap_subscript_impl((mmap_object *)self, item);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static int
 mmap_ass_item_impl(mmap_object *self, Py_ssize_t i, PyObject *v);
 
@@ -937,4 +967,4 @@ mmap_ass_subscript(PyObject *self, PyObject *item, PyObject 
*value)
 #ifndef MMAP_MMAP_MADVISE_METHODDEF
     #define MMAP_MMAP_MADVISE_METHODDEF
 #endif /* !defined(MMAP_MMAP_MADVISE_METHODDEF) */
-/*[clinic end generated code: output=fd4738a3d64fcb0a input=a9049054013a1b77]*/
+/*[clinic end generated code: output=90a906cde591ab92 input=a9049054013a1b77]*/
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 0bc959a28f6f71..ce5c59cb021270 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -1498,10 +1498,17 @@ mmap_length_impl(mmap_object *self)
     return self->size;
 }
 
+/*[clinic input]
+@critical_section
+mmap.mmap.__getitem__ as mmap_item
+    i: Py_ssize_t
+    /
+[clinic start generated code]*/
+
 static PyObject *
-mmap_item_lock_held(PyObject *op, Py_ssize_t i)
+mmap_item_impl(mmap_object *self, Py_ssize_t i)
+/*[clinic end generated code: output=70bd231b581a7bc1 input=af6ad504b5fcd499]*/
 {
-    mmap_object *self = mmap_object_CAST(op);
     CHECK_VALID(NULL);
     if (i < 0 || i >= self->size) {
         PyErr_SetString(PyExc_IndexError, "mmap index out of range");
@@ -1515,19 +1522,17 @@ mmap_item_lock_held(PyObject *op, Py_ssize_t i)
     return PyBytes_FromStringAndSize(&dest, 1);
 }
 
-static PyObject *
-mmap_item(PyObject *op, Py_ssize_t i) {
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    result = mmap_item_lock_held(op, i);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
+/*[clinic input]
+@critical_section
+mmap.mmap.__getitem__ as mmap_subscript
+    item: object
+    /
+[clinic start generated code]*/
 
 static PyObject *
-mmap_subscript_lock_held(PyObject *op, PyObject *item)
+mmap_subscript_impl(mmap_object *self, PyObject *item)
+/*[clinic end generated code: output=cd6ccc1eb3399f98 input=72f708669823dbba]*/
 {
-    mmap_object *self = mmap_object_CAST(op);
     CHECK_VALID(NULL);
     if (PyIndex_Check(item)) {
         Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
@@ -1587,16 +1592,6 @@ mmap_subscript_lock_held(PyObject *op, PyObject *item)
     }
 }
 
-static PyObject *
-mmap_subscript(PyObject *op, PyObject *item)
-{
-    PyObject *result;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    result = mmap_subscript_lock_held(op, item);
-    Py_END_CRITICAL_SECTION();
-    return result;
-}
-
 /*[clinic input]
 @critical_section
 mmap.mmap.__setitem__ as mmap_ass_item
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 9c0127ee4751b6..4a2f088a246c3e 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -505,11 +505,18 @@ bytearray_irepeat_impl(PyByteArrayObject *self, 
Py_ssize_t count)
     return Py_NewRef(self);
 }
 
+/*[clinic input]
+@critical_section
+bytearray.__getitem__ as bytearray_getitem
+    i: Py_ssize_t
+    /
+[clinic start generated code]*/
+
 static PyObject *
-bytearray_getitem_lock_held(PyObject *op, Py_ssize_t i)
+bytearray_getitem_impl(PyByteArrayObject *self, Py_ssize_t i)
+/*[clinic end generated code: output=743cb7a5f892f7ed input=f90e2c70f80e2917]*/
 {
-    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
-    PyByteArrayObject *self = _PyByteArray_CAST(op);
+    _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
     if (i < 0 || i >= Py_SIZE(self)) {
         PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
         return NULL;
@@ -517,16 +524,6 @@ bytearray_getitem_lock_held(PyObject *op, Py_ssize_t i)
     return _PyLong_FromUnsignedChar((unsigned char)(self->ob_start[i]));
 }
 
-static PyObject *
-bytearray_getitem(PyObject *op, Py_ssize_t i)
-{
-    PyObject *ret;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    ret = bytearray_getitem_lock_held(op, i);
-    Py_END_CRITICAL_SECTION();
-    return ret;
-}
-
 static PyObject *
 bytearray_subscript_lock_held(PyObject *op, PyObject *index)
 {
diff --git a/Objects/clinic/bytearrayobject.c.h 
b/Objects/clinic/bytearrayobject.c.h
index e130ced76a93fe..e57d71cc398b41 100644
--- a/Objects/clinic/bytearrayobject.c.h
+++ b/Objects/clinic/bytearrayobject.c.h
@@ -56,6 +56,21 @@ bytearray_irepeat(PyObject *self, Py_ssize_t count)
     return return_value;
 }
 
+static PyObject *
+bytearray_getitem_impl(PyByteArrayObject *self, Py_ssize_t i);
+
+static PyObject *
+bytearray_getitem(PyObject *self, Py_ssize_t i)
+{
+    PyObject *return_value = NULL;
+
+    Py_BEGIN_CRITICAL_SECTION(self);
+    return_value = bytearray_getitem_impl((PyByteArrayObject *)self, i);
+    Py_END_CRITICAL_SECTION();
+
+    return return_value;
+}
+
 static int
 bytearray_setitem_impl(PyByteArrayObject *self, Py_ssize_t i,
                        PyObject *value);
@@ -2022,4 +2037,4 @@ bytearray_sizeof(PyObject *self, PyObject 
*Py_UNUSED(ignored))
 {
     return bytearray_sizeof_impl((PyByteArrayObject *)self);
 }
-/*[clinic end generated code: output=f57debf4b0a990ca input=a9049054013a1b77]*/
+/*[clinic end generated code: output=fbd9a012eb61b372 input=a9049054013a1b77]*/
diff --git a/Tools/clinic/libclinic/dsl_parser.py 
b/Tools/clinic/libclinic/dsl_parser.py
index c27a883de36a41..af12c28b9c5045 100644
--- a/Tools/clinic/libclinic/dsl_parser.py
+++ b/Tools/clinic/libclinic/dsl_parser.py
@@ -50,7 +50,6 @@
 __ge__
 __getattr__
 __getattribute__
-__getitem__
 __gt__
 __hash__
 __iand__
diff --git a/Tools/clinic/libclinic/slots.py b/Tools/clinic/libclinic/slots.py
index 2138a6e780b245..8bb9d7a586d1f8 100644
--- a/Tools/clinic/libclinic/slots.py
+++ b/Tools/clinic/libclinic/slots.py
@@ -40,6 +40,7 @@ def make_return_converter(self) -> CReturnConverter:
 SLOTS: Final[dict[str, SlotSpec]] = {
     '__add__': SlotSpec(return_converter='object'),
     '__contains__': SlotSpec(return_converter='int'),
+    '__getitem__': SlotSpec(return_converter='object'),
     '__iadd__': SlotSpec(return_converter='object'),
     '__imul__': SlotSpec(return_converter='object'),
     '__len__': SlotSpec(return_converter='Py_ssize_t'),

_______________________________________________
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