mirror of https://github.com/python/cpython.git
Some days, I think my comment of
/* this is harder to get right than you might think */ angered some God somewhere. After noticing >>> range(5000000)[slice(96360, None, 439)] [] I found that my cute test for the slice being empty failed due to overflow. Fixed, and added simple test (not the above!).
This commit is contained in:
parent
d7c14c6c9b
commit
173f11da5d
|
@ -1,6 +1,7 @@
|
||||||
# tests for slice objects; in particular the indices method.
|
# tests for slice objects; in particular the indices method.
|
||||||
|
|
||||||
from test.test_support import vereq
|
from test.test_support import vereq
|
||||||
|
import sys
|
||||||
|
|
||||||
vereq(slice(None ).indices(10), (0, 10, 1))
|
vereq(slice(None ).indices(10), (0, 10, 1))
|
||||||
vereq(slice(None, None, 2).indices(10), (0, 10, 2))
|
vereq(slice(None, None, 2).indices(10), (0, 10, 2))
|
||||||
|
@ -11,3 +12,5 @@
|
||||||
vereq(slice(-100, 100 ).indices(10), slice(None).indices(10))
|
vereq(slice(-100, 100 ).indices(10), slice(None).indices(10))
|
||||||
vereq(slice(100, -100, -1).indices(10), slice(None, None, -1).indices(10))
|
vereq(slice(100, -100, -1).indices(10), slice(None, None, -1).indices(10))
|
||||||
vereq(slice(-100L, 100L, 2L).indices(10), (0, 10, 2))
|
vereq(slice(-100L, 100L, 2L).indices(10), (0, 10, 2))
|
||||||
|
|
||||||
|
vereq(range(10)[::sys.maxint - 1], [0])
|
||||||
|
|
|
@ -114,11 +114,13 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
|
||||||
int *start, int *stop, int *step, int *slicelength)
|
int *start, int *stop, int *step, int *slicelength)
|
||||||
{
|
{
|
||||||
/* this is harder to get right than you might think */
|
/* this is harder to get right than you might think */
|
||||||
|
|
||||||
int defstart, defstop;
|
int defstart, defstop;
|
||||||
|
|
||||||
if (r->step == Py_None) {
|
if (r->step == Py_None) {
|
||||||
*step = 1;
|
*step = 1;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
*step = PyInt_AsLong(r->step);
|
*step = PyInt_AsLong(r->step);
|
||||||
if (*step == -1 && PyErr_Occurred()) {
|
if (*step == -1 && PyErr_Occurred()) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -135,7 +137,8 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
|
||||||
|
|
||||||
if (r->start == Py_None) {
|
if (r->start == Py_None) {
|
||||||
*start = defstart;
|
*start = defstart;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (!_PyEval_SliceIndex(r->start, start)) return -1;
|
if (!_PyEval_SliceIndex(r->start, start)) return -1;
|
||||||
if (*start < 0) *start += length;
|
if (*start < 0) *start += length;
|
||||||
if (*start < 0) *start = (*step < 0) ? -1 : 0;
|
if (*start < 0) *start = (*step < 0) ? -1 : 0;
|
||||||
|
@ -145,19 +148,22 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
|
||||||
|
|
||||||
if (r->stop == Py_None) {
|
if (r->stop == Py_None) {
|
||||||
*stop = defstop;
|
*stop = defstop;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
|
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
|
||||||
if (*stop < 0) *stop += length;
|
if (*stop < 0) *stop += length;
|
||||||
if (*stop < 0) *stop = -1;
|
if (*stop < 0) *stop = -1;
|
||||||
if (*stop > length) *stop = length;
|
if (*stop > length) *stop = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*stop - *start)*(*step) <= 0) {
|
if ((*step < 0 && *stop >= *start)
|
||||||
|
|| (*step > 0 && *start >= *stop)) {
|
||||||
*slicelength = 0;
|
*slicelength = 0;
|
||||||
}
|
}
|
||||||
else if (*step < 0) {
|
else if (*step < 0) {
|
||||||
*slicelength = (*stop-*start+1)/(*step)+1;
|
*slicelength = (*stop-*start+1)/(*step)+1;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
*slicelength = (*stop-*start-1)/(*step)+1;
|
*slicelength = (*stop-*start-1)/(*step)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue