Skip to content

Commit fa25f16

Browse files
Expand the PySlice_GetIndicesEx macro. (#1023) (#1045)
(cherry picked from commit b879fe8)
1 parent ae0915e commit fa25f16

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
@@ -4279,11 +4279,10 @@ Array_subscript(PyObject *myself, PyObject *item)
42794279
PyObject *np;
42804280
Py_ssize_t start, stop, step, slicelen, cur, i;
42814281

4282-
if (PySlice_GetIndicesEx(item,
4283-
self->b_length, &start, &stop,
4284-
&step, &slicelen) < 0) {
4282+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
42854283
return NULL;
42864284
}
4285+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
42874286

42884287
stgdict = PyObject_stgdict((PyObject *)self);
42894288
assert(stgdict); /* Cannot be NULL for array object instances */
@@ -4420,11 +4419,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
44204419
else if (PySlice_Check(item)) {
44214420
Py_ssize_t start, stop, step, slicelen, otherlen, i, cur;
44224421

4423-
if (PySlice_GetIndicesEx(item,
4424-
self->b_length, &start, &stop,
4425-
&step, &slicelen) < 0) {
4422+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
44264423
return -1;
44274424
}
4425+
slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
44284426
if ((step < 0 && start < stop) ||
44294427
(step > 0 && start > stop))
44304428
stop = start;

Modules/_elementtree.c

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

1691-
if (PySlice_GetIndicesEx(item,
1692-
self->extra->length,
1693-
&start, &stop, &step, &slicelen) < 0) {
1691+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
16941692
return NULL;
16951693
}
1694+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1695+
step);
16961696

16971697
if (slicelen <= 0)
16981698
return PyList_New(0);
@@ -1744,11 +1744,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
17441744
return -1;
17451745
}
17461746

1747-
if (PySlice_GetIndicesEx(item,
1748-
self->extra->length,
1749-
&start, &stop, &step, &slicelen) < 0) {
1747+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
17501748
return -1;
17511749
}
1750+
slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1751+
step);
17521752

17531753
if (value == NULL) {
17541754
/* Delete slice */

Modules/_testbuffer.c

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

1717-
if (PySlice_GetIndicesEx(key, base->shape[dim],
1718-
&start, &stop, &step, &slicelength) < 0) {
1717+
if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
17191718
return -1;
17201719
}
1720+
slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
17211721

17221722

17231723
if (base->suboffsets == NULL || dim == 0) {
@@ -1934,9 +1934,10 @@ slice_indices(PyObject *self, PyObject *args)
19341934
"first argument must be a slice object");
19351935
return NULL;
19361936
}
1937-
if (PySlice_GetIndicesEx(key, len, &s[0], &s[1], &s[2], &s[3]) < 0) {
1937+
if (PySlice_Unpack(key, &s[0], &s[1], &s[2]) < 0) {
19381938
return NULL;
19391939
}
1940+
s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]);
19401941

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

Modules/arraymodule.c

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

2346-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2347-
&start, &stop, &step, &slicelength) < 0) {
2346+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
23482347
return NULL;
23492348
}
2349+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2350+
step);
23502351

23512352
if (slicelength <= 0) {
23522353
return newarrayobject(&Arraytype, 0, self->ob_descr);
@@ -2414,11 +2415,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
24142415
return (*self->ob_descr->setitem)(self, i, value);
24152416
}
24162417
else if (PySlice_Check(item)) {
2417-
if (PySlice_GetIndicesEx(item,
2418-
Py_SIZE(self), &start, &stop,
2419-
&step, &slicelength) < 0) {
2418+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24202419
return -1;
24212420
}
2421+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2422+
step);
24222423
}
24232424
else {
24242425
PyErr_SetString(PyExc_TypeError,

Modules/mmapmodule.c

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

810-
if (PySlice_GetIndicesEx(item, self->size,
811-
&start, &stop, &step, &slicelen) < 0) {
810+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
812811
return NULL;
813812
}
813+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
814814

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

936-
if (PySlice_GetIndicesEx(item,
937-
self->size, &start, &stop,
938-
&step, &slicelen) < 0) {
936+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
939937
return -1;
940938
}
939+
slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
941940
if (value == NULL) {
942941
PyErr_SetString(PyExc_TypeError,
943942
"mmap object doesn't support slice deletion");

Objects/bytearrayobject.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
427427
}
428428
else if (PySlice_Check(index)) {
429429
Py_ssize_t start, stop, step, slicelength, cur, i;
430-
if (PySlice_GetIndicesEx(index,
431-
PyByteArray_GET_SIZE(self),
432-
&start, &stop, &step, &slicelength) < 0) {
430+
if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
433431
return NULL;
434432
}
433+
slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
434+
&start, &stop, step);
435435

436436
if (slicelength <= 0)
437437
return PyByteArray_FromStringAndSize("", 0);
@@ -657,11 +657,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
657657
}
658658
}
659659
else if (PySlice_Check(index)) {
660-
if (PySlice_GetIndicesEx(index,
661-
PyByteArray_GET_SIZE(self),
662-
&start, &stop, &step, &slicelen) < 0) {
660+
if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
663661
return -1;
664662
}
663+
slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
664+
&stop, step);
665665
}
666666
else {
667667
PyErr_Format(PyExc_TypeError,

Objects/bytesobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,11 +1534,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item)
15341534
char* result_buf;
15351535
PyObject* result;
15361536

1537-
if (PySlice_GetIndicesEx(item,
1538-
PyBytes_GET_SIZE(self),
1539-
&start, &stop, &step, &slicelength) < 0) {
1537+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
15401538
return NULL;
15411539
}
1540+
slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start,
1541+
&stop, step);
15421542

15431543
if (slicelength <= 0) {
15441544
return PyBytes_FromStringAndSize("", 0);

Objects/listobject.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2421,10 +2421,11 @@ list_subscript(PyListObject* self, PyObject* item)
24212421
PyObject* it;
24222422
PyObject **src, **dest;
24232423

2424-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2425-
&start, &stop, &step, &slicelength) < 0) {
2424+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24262425
return NULL;
24272426
}
2427+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2428+
step);
24282429

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

2473-
if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2474-
&start, &stop, &step, &slicelength) < 0) {
2474+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
24752475
return -1;
24762476
}
2477+
slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2478+
step);
24772479

24782480
if (step == 1)
24792481
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
@@ -2311,10 +2311,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim)
23112311
{
23122312
Py_ssize_t start, stop, step, slicelength;
23132313

2314-
if (PySlice_GetIndicesEx(key, base->shape[dim],
2315-
&start, &stop, &step, &slicelength) < 0) {
2314+
if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
23162315
return -1;
23172316
}
2317+
slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
23182318

23192319

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

Objects/tupleobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,11 +713,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
713713
PyObject* it;
714714
PyObject **src, **dest;
715715

716-
if (PySlice_GetIndicesEx(item,
717-
PyTuple_GET_SIZE(self),
718-
&start, &stop, &step, &slicelength) < 0) {
716+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
719717
return NULL;
720718
}
719+
slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
720+
&stop, step);
721721

722722
if (slicelength <= 0) {
723723
return PyTuple_New(0);

Objects/unicodeobject.c

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

13807-
if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self),
13808-
&start, &stop, &step, &slicelength) < 0) {
13807+
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
1380913808
return NULL;
1381013809
}
13810+
slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self),
13811+
&start, &stop, step);
1381113812

1381213813
if (slicelength <= 0) {
1381313814
_Py_RETURN_UNICODE_EMPTY();

0 commit comments

Comments
 (0)