Skip to content

Commit b879fe8

Browse files
Expand the PySlice_GetIndicesEx macro. (#1023)
1 parent 205e00c commit b879fe8

File tree

11 files changed

+47
-45
lines changed

11 files changed

+47
-45
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4277,11 +4277,10 @@ Array_subscript(PyObject *myself, PyObject *item)
42774277
PyObject *np;
42784278
Py_ssize_t start, stop, step, slicelen, cur, i;
42794279

4280-
if (PySlice_GetIndicesEx(item,
4281-
self->b_length, &start, &stop,
4282-
&step, &slicelen) < 0) {
4280+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
42834281
return NULL;
42844282
}
4283+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
42854284

42864285
stgdict = PyObject_stgdict((PyObject *)self);
42874286
assert(stgdict); /* Cannot be NULL for array object instances */
@@ -4418,11 +4417,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
44184417
else if (PySlice_Check(item)) {
44194418
Py_ssize_t start, stop, step, slicelen, otherlen, i, cur;
44204419

4421-
if (PySlice_GetIndicesEx(item,
4422-
self->b_length, &start, &stop,
4423-
&step, &slicelen) < 0) {
4420+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
44244421
return -1;
44254422
}
4423+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
44264424
if ((step < 0 && start < stop) ||
44274425
(step > 0 && start > stop))
44284426
stop = start;

Modules/_elementtree.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,11 +1740,11 @@ element_subscr(PyObject* self_, PyObject* item)
17401740
if (!self->extra)
17411741
return PyList_New(0);
17421742

1743-
if (PySlice_GetIndicesEx(item,
1744-
self->extra->length,
1745-
&start, &stop, &step, &slicelen) < 0) {
1743+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
17461744
return NULL;
17471745
}
1746+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1747+
step);
17481748

17491749
if (slicelen <= 0)
17501750
return PyList_New(0);
@@ -1796,11 +1796,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
17961796
return -1;
17971797
}
17981798

1799-
if (PySlice_GetIndicesEx(item,
1800-
self->extra->length,
1801-
&start, &stop, &step, &slicelen) < 0) {
1799+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
18021800
return -1;
18031801
}
1802+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1803+
step);
18041804

18051805
if (value == NULL) {
18061806
/* Delete slice */

Modules/_testbuffer.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,10 +1715,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim)
17151715
{
17161716
Py_ssize_t start, stop, step, slicelength;
17171717

1718-
if (PySlice_GetIndicesEx(key, base->shape[dim],
1719-
&start, &stop, &step, &slicelength) < 0) {
1718+
if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
17201719
return -1;
17211720
}
1721+
slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
17221722

17231723

17241724
if (base->suboffsets == NULL || dim == 0) {
@@ -1935,9 +1935,10 @@ slice_indices(PyObject *self, PyObject *args)
19351935
"first argument must be a slice object");
19361936
return NULL;
19371937
}
1938-
if (PySlice_GetIndicesEx(key, len, &s[0], &s[1], &s[2], &s[3]) < 0) {
1938+
if (PySlice_Unpack(key, &s[0], &s[1], &s[2]) < 0) {
19391939
return NULL;
19401940
}
1941+
s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]);
19411942

19421943
ret = PyTuple_New(4);
19431944
if (ret == NULL)

Modules/arraymodule.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2289,10 +2289,11 @@ array_subscr(arrayobject* self, PyObject* item)
22892289
arrayobject* ar;
22902290
int itemsize = self->ob_descr->itemsize;
22912291

2292-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2293-
&start, &stop, &step, &slicelength) < 0) {
2292+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
22942293
return NULL;
22952294
}
2295+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2296+
step);
22962297

22972298
if (slicelength <= 0) {
22982299
return newarrayobject(&Arraytype, 0, self->ob_descr);
@@ -2360,11 +2361,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
23602361
return (*self->ob_descr->setitem)(self, i, value);
23612362
}
23622363
else if (PySlice_Check(item)) {
2363-
if (PySlice_GetIndicesEx(item,
2364-
Py_SIZE(self), &start, &stop,
2365-
&step, &slicelength) < 0) {
2364+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
23662365
return -1;
23672366
}
2367+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2368+
step);
23682369
}
23692370
else {
23702371
PyErr_SetString(PyExc_TypeError,

Modules/mmapmodule.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -778,10 +778,10 @@ mmap_subscript(mmap_object *self, PyObject *item)
778778
else if (PySlice_Check(item)) {
779779
Py_ssize_t start, stop, step, slicelen;
780780

781-
if (PySlice_GetIndicesEx(item, self->size,
782-
&start, &stop, &step, &slicelen) < 0) {
781+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
783782
return NULL;
784783
}
784+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
785785

786786
if (slicelen <= 0)
787787
return PyBytes_FromStringAndSize("", 0);
@@ -904,11 +904,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
904904
Py_ssize_t start, stop, step, slicelen;
905905
Py_buffer vbuf;
906906

907-
if (PySlice_GetIndicesEx(item,
908-
self->size, &start, &stop,
909-
&step, &slicelen) < 0) {
907+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
910908
return -1;
911909
}
910+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
912911
if (value == NULL) {
913912
PyErr_SetString(PyExc_TypeError,
914913
"mmap object doesn't support slice deletion");

Objects/bytearrayobject.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -400,11 +400,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
400400
}
401401
else if (PySlice_Check(index)) {
402402
Py_ssize_t start, stop, step, slicelength, cur, i;
403-
if (PySlice_GetIndicesEx(index,
404-
PyByteArray_GET_SIZE(self),
405-
&start, &stop, &step, &slicelength) < 0) {
403+
if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
406404
return NULL;
407405
}
406+
slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
407+
&start, &stop, step);
408408

409409
if (slicelength <= 0)
410410
return PyByteArray_FromStringAndSize("", 0);
@@ -630,11 +630,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
630630
}
631631
}
632632
else if (PySlice_Check(index)) {
633-
if (PySlice_GetIndicesEx(index,
634-
PyByteArray_GET_SIZE(self),
635-
&start, &stop, &step, &slicelen) < 0) {
633+
if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
636634
return -1;
637635
}
636+
slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
637+
&stop, step);
638638
}
639639
else {
640640
PyErr_Format(PyExc_TypeError,

Objects/bytesobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,11 +1683,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item)
16831683
char* result_buf;
16841684
PyObject* result;
16851685

1686-
if (PySlice_GetIndicesEx(item,
1687-
PyBytes_GET_SIZE(self),
1688-
&start, &stop, &step, &slicelength) < 0) {
1686+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
16891687
return NULL;
16901688
}
1689+
slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start,
1690+
&stop, step);
16911691

16921692
if (slicelength <= 0) {
16931693
return PyBytes_FromStringAndSize("", 0);

Objects/listobject.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,10 +2486,11 @@ list_subscript(PyListObject* self, PyObject* item)
24862486
PyObject* it;
24872487
PyObject **src, **dest;
24882488

2489-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2490-
&start, &stop, &step, &slicelength) < 0) {
2489+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24912490
return NULL;
24922491
}
2492+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2493+
step);
24932494

24942495
if (slicelength <= 0) {
24952496
return PyList_New(0);
@@ -2535,10 +2536,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
25352536
else if (PySlice_Check(item)) {
25362537
Py_ssize_t start, stop, step, slicelength;
25372538

2538-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2539-
&start, &stop, &step, &slicelength) < 0) {
2539+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
25402540
return -1;
25412541
}
2542+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2543+
step);
25422544

25432545
if (step == 1)
25442546
return list_ass_slice(self, start, stop, value);

Objects/memoryobject.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,10 +2285,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim)
22852285
{
22862286
Py_ssize_t start, stop, step, slicelength;
22872287

2288-
if (PySlice_GetIndicesEx(key, base->shape[dim],
2289-
&start, &stop, &step, &slicelength) < 0) {
2288+
if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
22902289
return -1;
22912290
}
2291+
slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
22922292

22932293

22942294
if (base->suboffsets == NULL || dim == 0) {

Objects/tupleobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -758,11 +758,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
758758
PyObject* it;
759759
PyObject **src, **dest;
760760

761-
if (PySlice_GetIndicesEx(item,
762-
PyTuple_GET_SIZE(self),
763-
&start, &stop, &step, &slicelength) < 0) {
761+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
764762
return NULL;
765763
}
764+
slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
765+
&stop, step);
766766

767767
if (slicelength <= 0) {
768768
return PyTuple_New(0);

Objects/unicodeobject.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13996,10 +13996,11 @@ unicode_subscript(PyObject* self, PyObject* item)
1399613996
int src_kind, dest_kind;
1399713997
Py_UCS4 ch, max_char, kind_limit;
1399813998

13999-
if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self),
14000-
&start, &stop, &step, &slicelength) < 0) {
13999+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
1400114000
return NULL;
1400214001
}
14002+
slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self),
14003+
&start, &stop, step);
1400314004

1400414005
if (slicelength <= 0) {
1400514006
_Py_RETURN_UNICODE_EMPTY();

0 commit comments

Comments
 (0)