bpo-27867: Expand the PySlice_GetIndicesEx macro. (#1023) (#1046) · python/cpython@e41390a

12 files changed

lines changed

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;

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)

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,

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

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

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

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;

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

}

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

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