]> granicus.if.org Git - python/commitdiff
Some days, I think my comment of
authorMichael W. Hudson <mwh@python.net>
Tue, 5 Nov 2002 15:28:51 +0000 (15:28 +0000)
committerMichael W. Hudson <mwh@python.net>
Tue, 5 Nov 2002 15:28:51 +0000 (15:28 +0000)
/* 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!).

Lib/test/test_slice.py
Objects/sliceobject.c

index 7b3ee067bad660b809a7066a77e20e941c260fc8..49ed20eb7063700d915ba029c7102b089ecc543b 100644 (file)
@@ -1,6 +1,7 @@
 # tests for slice objects; in particular the indices method.
 
 from test.test_support import vereq
+import sys
 
 vereq(slice(None           ).indices(10), (0, 10,  1))
 vereq(slice(None,  None,  2).indices(10), (0, 10,  2))
@@ -11,3 +12,5 @@ vereq(slice(3,     None, -2).indices(10), (3, -1, -2))
 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(-100L, 100L, 2L).indices(10), (0, 10,  2))
+
+vereq(range(10)[::sys.maxint - 1], [0])
index 21426a761a1a17ab461044bbc58c0754a8ffcb52..a035e5faf01262b9e5367f50fc11119829e8a600 100644 (file)
@@ -114,11 +114,13 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
                     int *start, int *stop, int *step, int *slicelength)
 {
        /* this is harder to get right than you might think */
+
        int defstart, defstop;
 
        if (r->step == Py_None) {
                *step = 1;
-       } else {
+       } 
+       else {
                *step = PyInt_AsLong(r->step);
                if (*step == -1 && PyErr_Occurred()) {
                        return -1;
@@ -135,7 +137,8 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
 
        if (r->start == Py_None) {
                *start = defstart;
-       } else {
+       }
+       else {
                if (!_PyEval_SliceIndex(r->start, start)) return -1;
                if (*start < 0) *start += length;
                if (*start < 0) *start = (*step < 0) ? -1 : 0;
@@ -145,19 +148,22 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
 
        if (r->stop == Py_None) {
                *stop = defstop;
-       } else {
+       }
+       else {
                if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
                if (*stop < 0) *stop += length;
                if (*stop < 0) *stop = -1;
                if (*stop > length) *stop = length;
        }
-       
-       if ((*stop - *start)*(*step) <= 0) {
+
+       if ((*step < 0 && *stop >= *start) 
+           || (*step > 0 && *start >= *stop)) {
                *slicelength = 0;
        }
        else if (*step < 0) {
                *slicelength = (*stop-*start+1)/(*step)+1;
-       } else {
+       }
+       else {
                *slicelength = (*stop-*start-1)/(*step)+1;
        }