Expand the PySlice_GetIndicesEx macro. (#1023) (#1045) · python/cpython@fa25f16 (original) (raw)
11 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -4279,11 +4279,10 @@ Array_subscript(PyObject *myself, PyObject *item) | ||
4279 | 4279 | PyObject *np; |
4280 | 4280 | Py_ssize_t start, stop, step, slicelen, cur, i; |
4281 | 4281 | |
4282 | -if (PySlice_GetIndicesEx(item, | |
4283 | -self->b_length, &start, &stop, | |
4284 | -&step, &slicelen) < 0) { | |
4282 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
4285 | 4283 | return NULL; |
4286 | 4284 | } |
4285 | +slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); | |
4287 | 4286 | |
4288 | 4287 | stgdict = PyObject_stgdict((PyObject *)self); |
4289 | 4288 | assert(stgdict); /* Cannot be NULL for array object instances */ |
@@ -4420,11 +4419,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) | ||
4420 | 4419 | else if (PySlice_Check(item)) { |
4421 | 4420 | Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; |
4422 | 4421 | |
4423 | -if (PySlice_GetIndicesEx(item, | |
4424 | -self->b_length, &start, &stop, | |
4425 | -&step, &slicelen) < 0) { | |
4422 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
4426 | 4423 | return -1; |
4427 | 4424 | } |
4425 | +slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); | |
4428 | 4426 | if ((step < 0 && start < stop) | |
4429 | 4427 | (step > 0 && start > stop)) |
4430 | 4428 | stop = start; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1688,11 +1688,11 @@ element_subscr(PyObject* self_, PyObject* item) | ||
1688 | 1688 | if (!self->extra) |
1689 | 1689 | return PyList_New(0); |
1690 | 1690 | |
1691 | -if (PySlice_GetIndicesEx(item, | |
1692 | -self->extra->length, | |
1693 | -&start, &stop, &step, &slicelen) < 0) { | |
1691 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
1694 | 1692 | return NULL; |
1695 | 1693 | } |
1694 | +slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, | |
1695 | +step); | |
1696 | 1696 | |
1697 | 1697 | if (slicelen <= 0) |
1698 | 1698 | return PyList_New(0); |
@@ -1744,11 +1744,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) | ||
1744 | 1744 | return -1; |
1745 | 1745 | } |
1746 | 1746 | |
1747 | -if (PySlice_GetIndicesEx(item, | |
1748 | -self->extra->length, | |
1749 | -&start, &stop, &step, &slicelen) < 0) { | |
1747 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
1750 | 1748 | return -1; |
1751 | 1749 | } |
1750 | +slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, | |
1751 | +step); | |
1752 | 1752 | |
1753 | 1753 | if (value == NULL) { |
1754 | 1754 | /* Delete slice */ |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1714,10 +1714,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) | ||
1714 | 1714 | { |
1715 | 1715 | Py_ssize_t start, stop, step, slicelength; |
1716 | 1716 | |
1717 | -if (PySlice_GetIndicesEx(key, base->shape[dim], | |
1718 | -&start, &stop, &step, &slicelength) < 0) { | |
1717 | +if (PySlice_Unpack(key, &start, &stop, &step) < 0) { | |
1719 | 1718 | return -1; |
1720 | 1719 | } |
1720 | +slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); | |
1721 | 1721 | |
1722 | 1722 | |
1723 | 1723 | if (base->suboffsets == NULL | |
@@ -1934,9 +1934,10 @@ slice_indices(PyObject *self, PyObject *args) | ||
1934 | 1934 | "first argument must be a slice object"); |
1935 | 1935 | return NULL; |
1936 | 1936 | } |
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) { | |
1938 | 1938 | return NULL; |
1939 | 1939 | } |
1940 | +s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]); | |
1940 | 1941 | |
1941 | 1942 | ret = PyTuple_New(4); |
1942 | 1943 | if (ret == NULL) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2343,10 +2343,11 @@ array_subscr(arrayobject* self, PyObject* item) | ||
2343 | 2343 | arrayobject* ar; |
2344 | 2344 | int itemsize = self->ob_descr->itemsize; |
2345 | 2345 | |
2346 | -if (PySlice_GetIndicesEx(item, Py_SIZE(self), | |
2347 | -&start, &stop, &step, &slicelength) < 0) { | |
2346 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
2348 | 2347 | return NULL; |
2349 | 2348 | } |
2349 | +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, | |
2350 | +step); | |
2350 | 2351 | |
2351 | 2352 | if (slicelength <= 0) { |
2352 | 2353 | return newarrayobject(&Arraytype, 0, self->ob_descr); |
@@ -2414,11 +2415,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) | ||
2414 | 2415 | return (*self->ob_descr->setitem)(self, i, value); |
2415 | 2416 | } |
2416 | 2417 | 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) { | |
2420 | 2419 | return -1; |
2421 | 2420 | } |
2421 | +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, | |
2422 | +step); | |
2422 | 2423 | } |
2423 | 2424 | else { |
2424 | 2425 | PyErr_SetString(PyExc_TypeError, |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -807,10 +807,10 @@ mmap_subscript(mmap_object *self, PyObject *item) | ||
807 | 807 | else if (PySlice_Check(item)) { |
808 | 808 | Py_ssize_t start, stop, step, slicelen; |
809 | 809 | |
810 | -if (PySlice_GetIndicesEx(item, self->size, | |
811 | -&start, &stop, &step, &slicelen) < 0) { | |
810 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
812 | 811 | return NULL; |
813 | 812 | } |
813 | +slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); | |
814 | 814 | |
815 | 815 | if (slicelen <= 0) |
816 | 816 | return PyBytes_FromStringAndSize("", 0); |
@@ -933,11 +933,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) | ||
933 | 933 | Py_ssize_t start, stop, step, slicelen; |
934 | 934 | Py_buffer vbuf; |
935 | 935 | |
936 | -if (PySlice_GetIndicesEx(item, | |
937 | -self->size, &start, &stop, | |
938 | -&step, &slicelen) < 0) { | |
936 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
939 | 937 | return -1; |
940 | 938 | } |
939 | +slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); | |
941 | 940 | if (value == NULL) { |
942 | 941 | PyErr_SetString(PyExc_TypeError, |
943 | 942 | "mmap object doesn't support slice deletion"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -427,11 +427,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index) | ||
427 | 427 | } |
428 | 428 | else if (PySlice_Check(index)) { |
429 | 429 | 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) { | |
433 | 431 | return NULL; |
434 | 432 | } |
433 | +slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), | |
434 | +&start, &stop, step); | |
435 | 435 | |
436 | 436 | if (slicelength <= 0) |
437 | 437 | return PyByteArray_FromStringAndSize("", 0); |
@@ -657,11 +657,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu | ||
657 | 657 | } |
658 | 658 | } |
659 | 659 | 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) { | |
663 | 661 | return -1; |
664 | 662 | } |
663 | +slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start, | |
664 | +&stop, step); | |
665 | 665 | } |
666 | 666 | else { |
667 | 667 | PyErr_Format(PyExc_TypeError, |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1534,11 +1534,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item) | ||
1534 | 1534 | char* result_buf; |
1535 | 1535 | PyObject* result; |
1536 | 1536 | |
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) { | |
1540 | 1538 | return NULL; |
1541 | 1539 | } |
1540 | +slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start, | |
1541 | +&stop, step); | |
1542 | 1542 | |
1543 | 1543 | if (slicelength <= 0) { |
1544 | 1544 | return PyBytes_FromStringAndSize("", 0); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2421,10 +2421,11 @@ list_subscript(PyListObject* self, PyObject* item) | ||
2421 | 2421 | PyObject* it; |
2422 | 2422 | PyObject **src, **dest; |
2423 | 2423 | |
2424 | -if (PySlice_GetIndicesEx(item, Py_SIZE(self), | |
2425 | -&start, &stop, &step, &slicelength) < 0) { | |
2424 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
2426 | 2425 | return NULL; |
2427 | 2426 | } |
2427 | +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, | |
2428 | +step); | |
2428 | 2429 | |
2429 | 2430 | if (slicelength <= 0) { |
2430 | 2431 | return PyList_New(0); |
@@ -2470,10 +2471,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) | ||
2470 | 2471 | else if (PySlice_Check(item)) { |
2471 | 2472 | Py_ssize_t start, stop, step, slicelength; |
2472 | 2473 | |
2473 | -if (PySlice_GetIndicesEx(item, Py_SIZE(self), | |
2474 | -&start, &stop, &step, &slicelength) < 0) { | |
2474 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
2475 | 2475 | return -1; |
2476 | 2476 | } |
2477 | +slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, | |
2478 | +step); | |
2477 | 2479 | |
2478 | 2480 | if (step == 1) |
2479 | 2481 | return list_ass_slice(self, start, stop, value); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2311,10 +2311,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) | ||
2311 | 2311 | { |
2312 | 2312 | Py_ssize_t start, stop, step, slicelength; |
2313 | 2313 | |
2314 | -if (PySlice_GetIndicesEx(key, base->shape[dim], | |
2315 | -&start, &stop, &step, &slicelength) < 0) { | |
2314 | +if (PySlice_Unpack(key, &start, &stop, &step) < 0) { | |
2316 | 2315 | return -1; |
2317 | 2316 | } |
2317 | +slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); | |
2318 | 2318 | |
2319 | 2319 | |
2320 | 2320 | if (base->suboffsets == NULL | |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -713,11 +713,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item) | ||
713 | 713 | PyObject* it; |
714 | 714 | PyObject **src, **dest; |
715 | 715 | |
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) { | |
719 | 717 | return NULL; |
720 | 718 | } |
719 | +slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start, | |
720 | +&stop, step); | |
721 | 721 | |
722 | 722 | if (slicelength <= 0) { |
723 | 723 | return PyTuple_New(0); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -13804,10 +13804,11 @@ unicode_subscript(PyObject* self, PyObject* item) | ||
13804 | 13804 | int src_kind, dest_kind; |
13805 | 13805 | Py_UCS4 ch, max_char, kind_limit; |
13806 | 13806 | |
13807 | -if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), | |
13808 | -&start, &stop, &step, &slicelength) < 0) { | |
13807 | +if (PySlice_Unpack(item, &start, &stop, &step) < 0) { | |
13809 | 13808 | return NULL; |
13810 | 13809 | } |
13810 | +slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self), | |
13811 | +&start, &stop, step); | |
13811 | 13812 | |
13812 | 13813 | if (slicelength <= 0) { |
13813 | 13814 | _Py_RETURN_UNICODE_EMPTY(); |