Skip to content

Commit 796b26b

Browse files
gh-114258: Use Argument Clinic for __setitem__ (GH-160048)
1 parent 8f3243d commit 796b26b

16 files changed

Lines changed: 289 additions & 132 deletions

‎Modules/_collectionsmodule.c‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,8 +1499,19 @@ deque_remove_impl(dequeobject *deque, PyObject *value)
14991499
Py_RETURN_NONE;
15001500
}
15011501

1502+
/*[clinic input]
1503+
@critical_section
1504+
_collections.deque.__setitem__ as deque_ass_item
1505+
1506+
deque: dequeobject
1507+
i: Py_ssize_t
1508+
v: object
1509+
/
1510+
[clinic start generated code]*/
1511+
15021512
static int
1503-
deque_ass_item_lock_held(dequeobject *deque, Py_ssize_t i, PyObject *v)
1513+
deque_ass_item_impl(dequeobject *deque, Py_ssize_t i, PyObject *v)
1514+
/*[clinic end generated code: output=28739a830dc69ab1 input=b767e1a4972fa537]*/
15041515
{
15051516
block *b;
15061517
Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
@@ -1531,17 +1542,6 @@ deque_ass_item_lock_held(dequeobject *deque, Py_ssize_t i, PyObject *v)
15311542
return 0;
15321543
}
15331544

1534-
static int
1535-
deque_ass_item(PyObject *self, Py_ssize_t i, PyObject *v)
1536-
{
1537-
dequeobject *deque = dequeobject_CAST(self);
1538-
int result;
1539-
Py_BEGIN_CRITICAL_SECTION(deque);
1540-
result = deque_ass_item_lock_held(deque, i, v);
1541-
Py_END_CRITICAL_SECTION();
1542-
return result;
1543-
}
1544-
15451545
static void
15461546
deque_dealloc(PyObject *self)
15471547
{

‎Modules/_ctypes/_ctypes.c‎

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4983,8 +4983,11 @@ static PyType_Spec pycunion_spec = {
49834983
/*
49844984
PyCArray_Type
49854985
*/
4986-
static int Array_ass_item_lock_held(PyObject *, Py_ssize_t, PyObject *);
4987-
static int Array_ass_subscript(PyObject *, PyObject *, PyObject *);
4986+
4987+
/*[clinic input]
4988+
class _ctypes.Array "PyObject *" "clinic_state()->PyCArray_Type"
4989+
[clinic start generated code]*/
4990+
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b2d780e2e2dc6e8a]*/
49884991

49894992
static int
49904993
Array_init(PyObject *self, PyObject *args, PyObject *kw)
@@ -5008,7 +5011,7 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
50085011
for (i = 0; result >= 0 && i < n; ++i) {
50095012
PyObject *v = PyTuple_GET_ITEM(args, i);
50105013
assert(v != NULL);
5011-
result = Array_ass_item_lock_held(self, i, v);
5014+
result = Array_ass_item_impl(self, i, v);
50125015
}
50135016
Py_END_CRITICAL_SECTION();
50145017
return result;
@@ -5192,8 +5195,19 @@ Array_subscript(PyObject *myself, PyObject *item)
51925195
return result;
51935196
}
51945197

5198+
/*[clinic input]
5199+
@critical_section
5200+
_ctypes.Array.__setitem__ as Array_ass_item
5201+
5202+
myself: self
5203+
index: Py_ssize_t
5204+
value: object
5205+
/
5206+
[clinic start generated code]*/
5207+
51955208
static int
5196-
Array_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
5209+
Array_ass_item_impl(PyObject *myself, Py_ssize_t index, PyObject *value)
5210+
/*[clinic end generated code: output=8fb1fd51b5b45da8 input=8b6ddb53d6377b96]*/
51975211
{
51985212
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
51995213

@@ -5227,19 +5241,19 @@ Array_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
52275241
index, size, ptr);
52285242
}
52295243

5230-
static int
5231-
Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
5232-
{
5233-
int result;
5234-
Py_BEGIN_CRITICAL_SECTION(myself);
5235-
result = Array_ass_item_lock_held(myself, index, value);
5236-
Py_END_CRITICAL_SECTION();
5237-
return result;
5238-
}
5244+
/*[clinic input]
5245+
@critical_section
5246+
_ctypes.Array.__setitem__ as Array_ass_subscript
52395247
5248+
myself: self
5249+
item: object
5250+
value: object
5251+
/
5252+
[clinic start generated code]*/
52405253

52415254
static int
5242-
Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
5255+
Array_ass_subscript_impl(PyObject *myself, PyObject *item, PyObject *value)
5256+
/*[clinic end generated code: output=cb9a138e4e40c5ac input=4b7aedebbb357853]*/
52435257
{
52445258
CDataObject *self = _CDataObject_CAST(myself);
52455259

@@ -5256,7 +5270,7 @@ Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
52565270
return -1;
52575271
if (i < 0)
52585272
i += self->b_length;
5259-
return Array_ass_item_lock_held(myself, i, value);
5273+
return Array_ass_item_impl(myself, i, value);
52605274
}
52615275
else if (PySlice_Check(item)) {
52625276
Py_ssize_t start, stop, step, slicelen, otherlen, i;
@@ -5281,7 +5295,7 @@ Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
52815295
int result;
52825296
if (item == NULL)
52835297
return -1;
5284-
result = Array_ass_item_lock_held(myself, cur, item);
5298+
result = Array_ass_item_impl(myself, cur, item);
52855299
Py_DECREF(item);
52865300
if (result == -1)
52875301
return -1;
@@ -5295,17 +5309,6 @@ Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
52955309
}
52965310
}
52975311

5298-
static int
5299-
Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5300-
{
5301-
int result;
5302-
Py_BEGIN_CRITICAL_SECTION(myself);
5303-
result = Array_ass_subscript_lock_held(myself, item, value);
5304-
Py_END_CRITICAL_SECTION();
5305-
return result;
5306-
}
5307-
5308-
53095312
static Py_ssize_t
53105313
Array_length(PyObject *myself)
53115314
{
@@ -5624,8 +5627,24 @@ Pointer_item(PyObject *self, Py_ssize_t index)
56245627
return res;
56255628
}
56265629

5630+
/*[clinic input]
5631+
class _ctypes._Pointer "PyObject *" "clinic_state()->PyCPointer_Type"
5632+
[clinic start generated code]*/
5633+
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=452695db70aa7c3e]*/
5634+
5635+
/*[clinic input]
5636+
@critical_section
5637+
_ctypes._Pointer.__setitem__ as Pointer_ass_item
5638+
5639+
myself: self
5640+
index: Py_ssize_t
5641+
value: object
5642+
/
5643+
[clinic start generated code]*/
5644+
56275645
static int
5628-
Pointer_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
5646+
Pointer_ass_item_impl(PyObject *myself, Py_ssize_t index, PyObject *value)
5647+
/*[clinic end generated code: output=4503430bd55b6c69 input=344ad19b3094558c]*/
56295648
{
56305649
CDataObject *self = _CDataObject_CAST(myself);
56315650
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
@@ -5670,16 +5689,6 @@ Pointer_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
56705689
index, size, ((char *)deref + offset));
56715690
}
56725691

5673-
static int
5674-
Pointer_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
5675-
{
5676-
int res;
5677-
Py_BEGIN_CRITICAL_SECTION(self);
5678-
res = Pointer_ass_item_lock_held(self, index, value);
5679-
Py_END_CRITICAL_SECTION();
5680-
return res;
5681-
}
5682-
56835692
static PyObject *
56845693
Pointer_get_contents_lock_held(PyObject *self, void *closure)
56855694
{

‎Modules/_ctypes/clinic/_ctypes.c.h‎

Lines changed: 46 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Modules/_dbmmodule.c‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,22 @@ dbm_subscript(PyObject *self, PyObject *key)
224224
return result;
225225
}
226226

227+
/*[clinic input]
228+
@critical_section
229+
_dbm.dbm.__setitem__ as dbm_ass_sub
230+
231+
v: object
232+
w: object
233+
/
234+
[clinic start generated code]*/
235+
227236
static int
228-
dbm_ass_sub_lock_held(PyObject *self, PyObject *v, PyObject *w)
237+
dbm_ass_sub_impl(dbmobject *self, PyObject *v, PyObject *w)
238+
/*[clinic end generated code: output=33e861810d1fd44a input=4f10cc93a02142ee]*/
229239
{
230240
datum krec, drec;
231241
Py_ssize_t tmp_size;
232-
dbmobject *dp = dbmobject_CAST(self);
242+
dbmobject *dp = self;
233243

234244
if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
235245
PyErr_SetString(PyExc_TypeError,
@@ -279,16 +289,6 @@ dbm_ass_sub_lock_held(PyObject *self, PyObject *v, PyObject *w)
279289
return 0;
280290
}
281291

282-
static int
283-
dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w)
284-
{
285-
int result;
286-
Py_BEGIN_CRITICAL_SECTION(self);
287-
result = dbm_ass_sub_lock_held(self, v, w);
288-
Py_END_CRITICAL_SECTION();
289-
return result;
290-
}
291-
292292
/*[clinic input]
293293
@critical_section
294294
_dbm.dbm.close

‎Modules/_gdbmmodule.c‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,22 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
310310
return res;
311311
}
312312

313+
/*[clinic input]
314+
@critical_section
315+
_gdbm.gdbm.__setitem__ as gdbm_ass_sub
316+
317+
v: object
318+
w: object
319+
/
320+
[clinic start generated code]*/
321+
313322
static int
314-
gdbm_ass_sub_lock_held(PyObject *op, PyObject *v, PyObject *w)
323+
gdbm_ass_sub_impl(gdbmobject *self, PyObject *v, PyObject *w)
324+
/*[clinic end generated code: output=b46cce6ffa309dab input=fbd980f3b49e2f91]*/
315325
{
316326
datum krec, drec;
317327
const char *failmsg = "gdbm mappings have bytes or string indices only";
318-
gdbmobject *dp = _gdbmobject_CAST(op);
328+
gdbmobject *dp = self;
319329
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
320330

321331
if (!parse_datum(v, &krec, failmsg)) {
@@ -356,16 +366,6 @@ gdbm_ass_sub_lock_held(PyObject *op, PyObject *v, PyObject *w)
356366
return 0;
357367
}
358368

359-
static int
360-
gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w)
361-
{
362-
int result;
363-
Py_BEGIN_CRITICAL_SECTION(op);
364-
result = gdbm_ass_sub_lock_held(op, v, w);
365-
Py_END_CRITICAL_SECTION();
366-
return result;
367-
}
368-
369369
/*[clinic input]
370370
@permit_long_summary
371371
@critical_section

‎Modules/clinic/_collectionsmodule.c.h‎

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Modules/clinic/_dbmmodule.c.h‎

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)