Expand the PySlice_GetIndicesEx macro. (#1023) (#1044) · python/cpython@c26b19d (original) (raw)

11 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -4273,11 +4273,10 @@ Array_subscript(PyObject *myself, PyObject *item)
4273 4273 PyObject *np;
4274 4274 Py_ssize_t start, stop, step, slicelen, cur, i;
4275 4275
4276 -if (PySlice_GetIndicesEx(item,
4277 -self->b_length, &start, &stop,
4278 -&step, &slicelen) < 0) {
4276 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
4279 4277 return NULL;
4280 4278 }
4279 +slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
4281 4280
4282 4281 stgdict = PyObject_stgdict((PyObject *)self);
4283 4282 assert(stgdict); /* Cannot be NULL for array object instances */
@@ -4414,11 +4413,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
4414 4413 else if (PySlice_Check(item)) {
4415 4414 Py_ssize_t start, stop, step, slicelen, otherlen, i, cur;
4416 4415
4417 -if (PySlice_GetIndicesEx(item,
4418 -self->b_length, &start, &stop,
4419 -&step, &slicelen) < 0) {
4416 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
4420 4417 return -1;
4421 4418 }
4419 +slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step);
4422 4420 if ((step < 0 && start < stop) |
4423 4421 (step > 0 && start > stop))
4424 4422 stop = start;
Original file line number Diff line number Diff line change
@@ -1712,11 +1712,11 @@ element_subscr(PyObject* self_, PyObject* item)
1712 1712 if (!self->extra)
1713 1713 return PyList_New(0);
1714 1714
1715 -if (PySlice_GetIndicesEx(item,
1716 -self->extra->length,
1717 -&start, &stop, &step, &slicelen) < 0) {
1715 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
1718 1716 return NULL;
1719 1717 }
1718 +slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1719 +step);
1720 1720
1721 1721 if (slicelen <= 0)
1722 1722 return PyList_New(0);
@@ -1768,11 +1768,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
1768 1768 return -1;
1769 1769 }
1770 1770
1771 -if (PySlice_GetIndicesEx(item,
1772 -self->extra->length,
1773 -&start, &stop, &step, &slicelen) < 0) {
1771 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
1774 1772 return -1;
1775 1773 }
1774 +slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop,
1775 +step);
1776 1776
1777 1777 if (value == NULL) {
1778 1778 /* Delete slice */
Original file line number Diff line number Diff line change
@@ -1715,10 +1715,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim)
1715 1715 {
1716 1716 Py_ssize_t start, stop, step, slicelength;
1717 1717
1718 -if (PySlice_GetIndicesEx(key, base->shape[dim],
1719 -&start, &stop, &step, &slicelength) < 0) {
1718 +if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
1720 1719 return -1;
1721 1720 }
1721 +slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
1722 1722
1723 1723
1724 1724 if (base->suboffsets == NULL |
@@ -1935,9 +1935,10 @@ slice_indices(PyObject *self, PyObject *args)
1935 1935 "first argument must be a slice object");
1936 1936 return NULL;
1937 1937 }
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) {
1939 1939 return NULL;
1940 1940 }
1941 +s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]);
1941 1942
1942 1943 ret = PyTuple_New(4);
1943 1944 if (ret == NULL)
Original file line number Diff line number Diff line change
@@ -2297,10 +2297,11 @@ array_subscr(arrayobject* self, PyObject* item)
2297 2297 arrayobject* ar;
2298 2298 int itemsize = self->ob_descr->itemsize;
2299 2299
2300 -if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2301 -&start, &stop, &step, &slicelength) < 0) {
2300 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2302 2301 return NULL;
2303 2302 }
2303 +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2304 +step);
2304 2305
2305 2306 if (slicelength <= 0) {
2306 2307 return newarrayobject(&Arraytype, 0, self->ob_descr);
@@ -2368,11 +2369,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2368 2369 return (*self->ob_descr->setitem)(self, i, value);
2369 2370 }
2370 2371 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) {
2374 2373 return -1;
2375 2374 }
2375 +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2376 +step);
2376 2377 }
2377 2378 else {
2378 2379 PyErr_SetString(PyExc_TypeError,
Original file line number Diff line number Diff line change
@@ -806,10 +806,10 @@ mmap_subscript(mmap_object *self, PyObject *item)
806 806 else if (PySlice_Check(item)) {
807 807 Py_ssize_t start, stop, step, slicelen;
808 808
809 -if (PySlice_GetIndicesEx(item, self->size,
810 -&start, &stop, &step, &slicelen) < 0) {
809 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
811 810 return NULL;
812 811 }
812 +slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
813 813
814 814 if (slicelen <= 0)
815 815 return PyBytes_FromStringAndSize("", 0);
@@ -932,11 +932,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
932 932 Py_ssize_t start, stop, step, slicelen;
933 933 Py_buffer vbuf;
934 934
935 -if (PySlice_GetIndicesEx(item,
936 -self->size, &start, &stop,
937 -&step, &slicelen) < 0) {
935 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
938 936 return -1;
939 937 }
938 +slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step);
940 939 if (value == NULL) {
941 940 PyErr_SetString(PyExc_TypeError,
942 941 "mmap object doesn't support slice deletion");
Original file line number Diff line number Diff line change
@@ -400,11 +400,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index)
400 400 }
401 401 else if (PySlice_Check(index)) {
402 402 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) {
406 404 return NULL;
407 405 }
406 +slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
407 +&start, &stop, step);
408 408
409 409 if (slicelength <= 0)
410 410 return PyByteArray_FromStringAndSize("", 0);
@@ -630,11 +630,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu
630 630 }
631 631 }
632 632 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) {
636 634 return -1;
637 635 }
636 +slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
637 +&stop, step);
638 638 }
639 639 else {
640 640 PyErr_Format(PyExc_TypeError,
Original file line number Diff line number Diff line change
@@ -1683,11 +1683,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item)
1683 1683 char* result_buf;
1684 1684 PyObject* result;
1685 1685
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) {
1689 1687 return NULL;
1690 1688 }
1689 +slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start,
1690 +&stop, step);
1691 1691
1692 1692 if (slicelength <= 0) {
1693 1693 return PyBytes_FromStringAndSize("", 0);
Original file line number Diff line number Diff line change
@@ -2420,10 +2420,11 @@ list_subscript(PyListObject* self, PyObject* item)
2420 2420 PyObject* it;
2421 2421 PyObject **src, **dest;
2422 2422
2423 -if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2424 -&start, &stop, &step, &slicelength) < 0) {
2423 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2425 2424 return NULL;
2426 2425 }
2426 +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2427 +step);
2427 2428
2428 2429 if (slicelength <= 0) {
2429 2430 return PyList_New(0);
@@ -2469,10 +2470,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
2469 2470 else if (PySlice_Check(item)) {
2470 2471 Py_ssize_t start, stop, step, slicelength;
2471 2472
2472 -if (PySlice_GetIndicesEx(item, Py_SIZE(self),
2473 -&start, &stop, &step, &slicelength) < 0) {
2473 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
2474 2474 return -1;
2475 2475 }
2476 +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
2477 +step);
2476 2478
2477 2479 if (step == 1)
2478 2480 return list_ass_slice(self, start, stop, value);
Original file line number Diff line number Diff line change
@@ -2285,10 +2285,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim)
2285 2285 {
2286 2286 Py_ssize_t start, stop, step, slicelength;
2287 2287
2288 -if (PySlice_GetIndicesEx(key, base->shape[dim],
2289 -&start, &stop, &step, &slicelength) < 0) {
2288 +if (PySlice_Unpack(key, &start, &stop, &step) < 0) {
2290 2289 return -1;
2291 2290 }
2291 +slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step);
2292 2292
2293 2293
2294 2294 if (base->suboffsets == NULL |
Original file line number Diff line number Diff line change
@@ -720,11 +720,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item)
720 720 PyObject* it;
721 721 PyObject **src, **dest;
722 722
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) {
726 724 return NULL;
727 725 }
726 +slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
727 +&stop, step);
728 728
729 729 if (slicelength <= 0) {
730 730 return PyTuple_New(0);
Original file line number Diff line number Diff line change
@@ -13915,10 +13915,11 @@ unicode_subscript(PyObject* self, PyObject* item)
13915 13915 int src_kind, dest_kind;
13916 13916 Py_UCS4 ch, max_char, kind_limit;
13917 13917
13918 -if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self),
13919 -&start, &stop, &step, &slicelength) < 0) {
13918 +if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
13920 13919 return NULL;
13921 13920 }
13921 +slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self),
13922 +&start, &stop, step);
13922 13923
13923 13924 if (slicelength <= 0) {
13924 13925 _Py_RETURN_UNICODE_EMPTY();