Skip to content

Commit e41390a

Browse files
bpo-27867: Expand the PySlice_GetIndicesEx macro. (#1023) (#1046)
(cherry picked from commit b879fe8)
1 parent 7f85947 commit e41390a

File tree

12 files changed

+49
-46
lines changed

12 files changed

+49
-46
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4613,11 +4613,10 @@ Array_ass_subscript(PyObject *_self, PyObject *item, PyObject *value)
46134613
else if (PySlice_Check(item)) {
46144614
Py_ssize_t start, stop, step, slicelen, otherlen, i, cur;
46154615

4616-
if (PySlice_GetIndicesEx((PySliceObject *)item,
4617-
self->b_length, &start, &stop,
4618-
&step, &slicelen) < 0) {
4616+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
46194617
return -1;
46204618
}
4619+
slicelen = _PySlice_AdjustIndices(self->b_length, &start, &stop, step);
46214620
if ((step < 0 && start < stop) ||
46224621
(step > 0 && start > stop))
46234622
stop = start;

Modules/_elementtree.c

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

1337-
if (PySlice_GetIndicesEx((PySliceObject *)item,
1338-
self->extra->length,
1339-
&start, &stop, &step, &slicelen) < 0) {
1337+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
13401338
return NULL;
13411339
}
1340+
slicelen = _PySlice_AdjustIndices(self->extra->length, &start, &stop,
1341+
step);
13421342

13431343
if (slicelen <= 0)
13441344
return PyList_New(0);
@@ -1393,11 +1393,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
13931393
if (!self->extra)
13941394
element_new_extra(self, NULL);
13951395

1396-
if (PySlice_GetIndicesEx((PySliceObject *)item,
1397-
self->extra->length,
1398-
&start, &stop, &step, &slicelen) < 0) {
1396+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
13991397
return -1;
14001398
}
1399+
slicelen = _PySlice_AdjustIndices(self->extra->length, &start, &stop,
1400+
step);
14011401
assert(slicelen <= self->extra->length);
14021402

14031403
if (value == NULL)

Modules/arraymodule.c

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

1704-
if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
1705-
&start, &stop, &step, &slicelength) < 0) {
1704+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
17061705
return NULL;
17071706
}
1707+
slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
1708+
step);
17081709

17091710
if (slicelength <= 0) {
17101711
return newarrayobject(&Arraytype, 0, self->ob_descr);
@@ -1772,11 +1773,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
17721773
return (*self->ob_descr->setitem)(self, i, value);
17731774
}
17741775
else if (PySlice_Check(item)) {
1775-
if (PySlice_GetIndicesEx((PySliceObject *)item,
1776-
Py_SIZE(self), &start, &stop,
1777-
&step, &slicelength) < 0) {
1776+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
17781777
return -1;
17791778
}
1779+
slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
1780+
step);
17801781
}
17811782
else {
17821783
PyErr_SetString(PyExc_TypeError,

Modules/mmapmodule.c

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

787-
if (PySlice_GetIndicesEx((PySliceObject *)item, self->size,
788-
&start, &stop, &step, &slicelen) < 0) {
787+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
789788
return NULL;
790789
}
790+
slicelen = _PySlice_AdjustIndices(self->size, &start, &stop, step);
791791

792792
if (slicelen <= 0)
793793
return PyString_FromStringAndSize("", 0);
@@ -939,11 +939,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
939939
else if (PySlice_Check(item)) {
940940
Py_ssize_t start, stop, step, slicelen;
941941

942-
if (PySlice_GetIndicesEx((PySliceObject *)item,
943-
self->size, &start, &stop,
944-
&step, &slicelen) < 0) {
942+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
945943
return -1;
946944
}
945+
slicelen = _PySlice_AdjustIndices(self->size, &start, &stop, step);
947946
if (value == NULL) {
948947
PyErr_SetString(PyExc_TypeError,
949948
"mmap object doesn't support slice deletion");

Objects/bytearrayobject.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
435435
}
436436
else if (PySlice_Check(index)) {
437437
Py_ssize_t start, stop, step, slicelength, cur, i;
438-
if (PySlice_GetIndicesEx((PySliceObject *)index,
439-
PyByteArray_GET_SIZE(self),
440-
&start, &stop, &step, &slicelength) < 0) {
438+
if (_PySlice_Unpack((PySliceObject *)index, &start, &stop, &step) < 0) {
441439
return NULL;
442440
}
441+
slicelength = _PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
442+
&start, &stop, step);
443443

444444
if (slicelength <= 0)
445445
return PyByteArray_FromStringAndSize("", 0);
@@ -619,11 +619,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
619619
}
620620
}
621621
else if (PySlice_Check(index)) {
622-
if (PySlice_GetIndicesEx((PySliceObject *)index,
623-
PyByteArray_GET_SIZE(self),
624-
&start, &stop, &step, &slicelen) < 0) {
622+
if (_PySlice_Unpack((PySliceObject *)index, &start, &stop, &step) < 0) {
625623
return -1;
626624
}
625+
slicelen = _PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
626+
&stop, step);
627627
}
628628
else {
629629
PyErr_SetString(PyExc_TypeError, "bytearray indices must be integer");

Objects/listobject.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2562,10 +2562,11 @@ list_subscript(PyListObject* self, PyObject* item)
25622562
PyObject* it;
25632563
PyObject **src, **dest;
25642564

2565-
if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2566-
&start, &stop, &step, &slicelength) < 0) {
2565+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
25672566
return NULL;
25682567
}
2568+
slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2569+
step);
25692570

25702571
if (slicelength <= 0) {
25712572
return PyList_New(0);
@@ -2611,10 +2612,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
26112612
else if (PySlice_Check(item)) {
26122613
Py_ssize_t start, stop, step, slicelength;
26132614

2614-
if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
2615-
&start, &stop, &step, &slicelength) < 0) {
2615+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
26162616
return -1;
26172617
}
2618+
slicelength = _PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2619+
step);
26182620

26192621
if (step == 1)
26202622
return list_ass_slice(self, start, stop, value);

Objects/memoryobject.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -584,10 +584,11 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
584584
else if (PySlice_Check(key)) {
585585
Py_ssize_t start, stop, step, slicelength;
586586

587-
if (PySlice_GetIndicesEx((PySliceObject*)key, get_shape0(view),
588-
&start, &stop, &step, &slicelength) < 0) {
587+
if (_PySlice_Unpack((PySliceObject *)key, &start, &stop, &step) < 0) {
589588
return NULL;
590589
}
590+
slicelength = _PySlice_AdjustIndices(get_shape0(view), &start, &stop,
591+
step);
591592

592593
if (step == 1 && view->ndim == 1) {
593594
Py_buffer newview;
@@ -662,10 +663,10 @@ memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value)
662663
else if (PySlice_Check(key)) {
663664
Py_ssize_t stop, step;
664665

665-
if (PySlice_GetIndicesEx((PySliceObject*)key, get_shape0(view),
666-
&start, &stop, &step, &len) < 0) {
666+
if (_PySlice_Unpack((PySliceObject *)key, &start, &stop, &step) < 0) {
667667
return -1;
668668
}
669+
len = _PySlice_AdjustIndices(get_shape0(view), &start, &stop, step);
669670
if (step != 1) {
670671
PyErr_SetNone(PyExc_NotImplementedError);
671672
return -1;

Objects/sliceobject.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,10 +294,10 @@ slice_indices(PySliceObject* self, PyObject* len)
294294
return NULL;
295295
}
296296

297-
if (PySlice_GetIndicesEx(self, ilen, &start, &stop,
298-
&step, &slicelength) < 0) {
297+
if (_PySlice_Unpack(self, &start, &stop, &step) < 0) {
299298
return NULL;
300299
}
300+
slicelength = _PySlice_AdjustIndices(ilen, &start, &stop, step);
301301

302302
return Py_BuildValue("(nnn)", start, stop, step);
303303
}

Objects/stringobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,11 +1310,11 @@ string_subscript(PyStringObject* self, PyObject* item)
13101310
char* result_buf;
13111311
PyObject* result;
13121312

1313-
if (PySlice_GetIndicesEx((PySliceObject*)item,
1314-
PyString_GET_SIZE(self),
1315-
&start, &stop, &step, &slicelength) < 0) {
1313+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
13161314
return NULL;
13171315
}
1316+
slicelength = _PySlice_AdjustIndices(PyString_GET_SIZE(self), &start,
1317+
&stop, step);
13181318

13191319
if (slicelength <= 0) {
13201320
return PyString_FromStringAndSize("", 0);

Objects/structseq.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ structseq_subscript(PyStructSequence *self, PyObject *item)
114114
Py_ssize_t start, stop, step, slicelen, cur, i;
115115
PyObject *result;
116116

117-
if (PySlice_GetIndicesEx((PySliceObject *)item,
118-
VISIBLE_SIZE(self), &start, &stop,
119-
&step, &slicelen) < 0) {
117+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
120118
return NULL;
121119
}
120+
slicelen = _PySlice_AdjustIndices(VISIBLE_SIZE(self), &start, &stop,
121+
step);
122122
if (slicelen <= 0)
123123
return PyTuple_New(0);
124124
result = PyTuple_New(slicelen);

Objects/tupleobject.c

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

718-
if (PySlice_GetIndicesEx((PySliceObject*)item,
719-
PyTuple_GET_SIZE(self),
720-
&start, &stop, &step, &slicelength) < 0) {
718+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
721719
return NULL;
722720
}
721+
slicelength = _PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
722+
&stop, step);
723723

724724
if (slicelength <= 0) {
725725
return PyTuple_New(0);

Objects/unicodeobject.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8008,10 +8008,11 @@ unicode_subscript(PyUnicodeObject* self, PyObject* item)
80088008
Py_UNICODE* result_buf;
80098009
PyObject* result;
80108010

8011-
if (PySlice_GetIndicesEx((PySliceObject*)item, PyUnicode_GET_SIZE(self),
8012-
&start, &stop, &step, &slicelength) < 0) {
8011+
if (_PySlice_Unpack((PySliceObject *)item, &start, &stop, &step) < 0) {
80138012
return NULL;
80148013
}
8014+
slicelength = _PySlice_AdjustIndices(PyUnicode_GET_SIZE(self), &start,
8015+
&stop, step);
80158016

80168017
if (slicelength <= 0) {
80178018
return PyUnicode_FromUnicode(NULL, 0);

0 commit comments

Comments
 (0)