summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2002-06-11 13:38:42 (GMT)
committerMichael W. Hudson <mwh@python.net>2002-06-11 13:38:42 (GMT)
commit589dc93620656faf80713b50b50d957664cea287 (patch)
tree9d3dcd7814ba7fcc82b26ed7b8dac942899cfa85
parent75a20b19ef6925a5e6df55f4a738961127c25659 (diff)
downloadcpython-589dc93620656faf80713b50b50d957664cea287.zip
cpython-589dc93620656faf80713b50b50d957664cea287.tar.gz
cpython-589dc93620656faf80713b50b50d957664cea287.tar.bz2
Fix for problem reported by Neal Norwitz. Tighten up calculation of
slicelength. Include his test case.
-rw-r--r--Lib/test/test_types.py2
-rw-r--r--Objects/sliceobject.c8
2 files changed, 7 insertions, 3 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 8452cec..71e18c4 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -374,6 +374,8 @@ vereq(a[3::-2], [3,1])
vereq(a[-100:100:], a)
vereq(a[100:-100:-1], a[::-1])
vereq(a[-100L:100L:2L], [0,2,4])
+vereq(a[1000:2000:2], [])
+vereq(a[-1000:-2000:-2], [])
# deletion
del a[::2]
vereq(a, [1,3])
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index 7499d31..9a268b7 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -151,13 +151,15 @@ PySlice_GetIndicesEx(PySliceObject *r, int length,
if (*stop < 0) *stop = -1;
if (*stop > length) *stop = length;
}
-
- if (*step < 0) {
+
+ if ((*stop - *start)*(*step) <= 0) {
+ *slicelength = 0;
+ }
+ else if (*step < 0) {
*slicelength = (*stop-*start+1)/(*step)+1;
} else {
*slicelength = (*stop-*start-1)/(*step)+1;
}
- if (*slicelength < 0) *slicelength = 0;
return 0;
}