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