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(); |