Skip to content

Commit c26b19d

Browse files
Expand the PySlice_GetIndicesEx macro. (#1023) (#1044)
(cherry picked from commit b879fe8)
1 parent d0d575a commit c26b19d

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
@@ -4273,11 +4273,10 @@ Array_subscript(PyObject *myself, PyObject *item)
42734273
PyObject *np;
42744274
Py_ssize_t start, stop, step, slicelen, cur, i;
42754275

4276-
if (PySlice_GetIndicesEx(item,
4277-
self->b_length, &start, &stop,
4278-
&step, &slicelen) < 0) {
4276+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
42794277
return NULL;
42804278
}
4279+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
42814280

42824281
stgdict = PyObject_stgdict((PyObject *)self);
42834282
assert(stgdict); /* Cannot be NULL for array object instances */
@@ -4414,11 +4413,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
44144413
else if (PySlice_Check(item)) {
44154414
Py_ssize_t start, stop, step, slicelen, otherlen, i, cur;
44164415

4417-
if (PySlice_GetIndicesEx(item,
4418-
self->b_length, &start, &stop,
4419-
&step, &slicelen) < 0) {
4416+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
44204417
return -1;
44214418
}
4419+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
44224420
if ((step < 0 && start < stop) ||
44234421
(step > 0 && start > stop))
44244422
stop = start;

Modules/_elementtree.c

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

1715-
if (PySlice_GetIndicesEx(item,
1716-
self->extra->length,
1717-
&start, &stop, &step, &slicelen) < 0) {
1715+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
17181716
return NULL;
17191717
}
1718+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1719+
step);
17201720

17211721
if (slicelen <= 0)
17221722
return PyList_New(0);
@@ -1768,11 +1768,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
17681768
return -1;
17691769
}
17701770

1771-
if (PySlice_GetIndicesEx(item,
1772-
self->extra->length,
1773-
&start, &stop, &step, &slicelen) < 0) {
1771+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
17741772
return -1;
17751773
}
1774+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1775+
step);
17761776

17771777
if (value == NULL) {
17781778
/* 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
@@ -2297,10 +2297,11 @@ array_subscr(arrayobject* self, PyObject* item)
22972297
arrayobject* ar;
22982298
int itemsize = self->ob_descr->itemsize;
22992299

2300-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2301-
&start, &stop, &step, &slicelength) < 0) {
2300+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
23022301
return NULL;
23032302
}
2303+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2304+
step);
23042305

23052306
if (slicelength <= 0) {
23062307
return newarrayobject(&Arraytype, 0, self->ob_descr);
@@ -2368,11 +2369,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
23682369
return (*self->ob_descr->setitem)(self, i, value);
23692370
}
23702371
else if (PySlice_Check(item)) {
2371-
if (PySlice_GetIndicesEx(item,
2372-
Py_SIZE(self), &start, &stop,
2373-
&step, &slicelength) < 0) {
2372+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
23742373
return -1;
23752374
}
2375+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2376+
step);
23762377
}
23772378
else {
23782379
PyErr_SetString(PyExc_TypeError,

Modules/mmapmodule.c

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

809-
if (PySlice_GetIndicesEx(item, self->size,
810-
&start, &stop, &step, &slicelen) < 0) {
809+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
811810
return NULL;
812811
}
812+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
813813

814814
if (slicelen <= 0)
815815
return PyBytes_FromStringAndSize("", 0);
@@ -932,11 +932,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
932932
Py_ssize_t start, stop, step, slicelen;
933933
Py_buffer vbuf;
934934

935-
if (PySlice_GetIndicesEx(item,
936-
self->size, &start, &stop,
937-
&step, &slicelen) < 0) {
935+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
938936
return -1;
939937
}
938+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
940939
if (value == NULL) {
941940
PyErr_SetString(PyExc_TypeError,
942941
"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
@@ -2420,10 +2420,11 @@ list_subscript(PyListObject* self, PyObject* item)
24202420
PyObject* it;
24212421
PyObject **src, **dest;
24222422

2423-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2424-
&start, &stop, &step, &slicelength) < 0) {
2423+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24252424
return NULL;
24262425
}
2426+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2427+
step);
24272428

24282429
if (slicelength <= 0) {
24292430
return PyList_New(0);
@@ -2469,10 +2470,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
24692470
else if (PySlice_Check(item)) {
24702471
Py_ssize_t start, stop, step, slicelength;
24712472

2472-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2473-
&start, &stop, &step, &slicelength) < 0) {
2473+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24742474
return -1;
24752475
}
2476+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2477+
step);
24762478

24772479
if (step == 1)
24782480
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
@@ -720,11 +720,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
720720
PyObject* it;
721721
PyObject **src, **dest;
722722

723-
if (PySlice_GetIndicesEx(item,
724-
PyTuple_GET_SIZE(self),
725-
&start, &stop, &step, &slicelength) < 0) {
723+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
726724
return NULL;
727725
}
726+
slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
727+
&stop, step);
728728

729729
if (slicelength <= 0) {
730730
return PyTuple_New(0);

Objects/unicodeobject.c

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

13918-
if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self),
13919-
&start, &stop, &step, &slicelength) < 0) {
13918+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
1392013919
return NULL;
1392113920
}
13921+
slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self),
13922+
&start, &stop, step);
1392213923

1392313924
if (slicelength <= 0) {
1392413925
_Py_RETURN_UNICODE_EMPTY();

0 commit comments

Comments
 (0)