summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_types.py8
-rw-r--r--Objects/listobject.c14
2 files changed, 18 insertions, 4 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 9599456..61f660b 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -364,18 +364,22 @@ b.insert(-2, "foo")
b.insert(-200, "left")
b.insert(200, "right")
if b != ["left",-2,-1,0,0,"foo",1,2,"right"]: raise TestFailed, 'list insert2'
+# a = [-2,-1,0,0,1,2]
if a.count(0) != 2: raise TestFailed, ' list count'
if a.index(0) != 2: raise TestFailed, 'list index'
if a.index(0,2) != 2: raise TestFailed, 'list index, start argument'
-if a.index(-2,-10) != 0: raise TestFailed, 'list index, negative start argument'
+if a.index(0,-4) != 2: raise TestFailed, 'list index, -start argument'
+if a.index(-2,-10) != 0: raise TestFailed, 'list index, very -start argument'
if a.index(0,3) != 3: raise TestFailed, 'list index, start argument'
+if a.index(0,-3) != 3: raise TestFailed, 'list index, -start argument'
if a.index(0,3,4) != 3: raise TestFailed, 'list index, stop argument'
+if a.index(0,-3,-2) != 3: raise TestFailed, 'list index, -stop argument'
try:
a.index(2,0,-10)
except ValueError:
pass
else:
- raise TestFailed, 'list index, negative stop argument'
+ raise TestFailed, 'list index, very -stop argument'
a.remove(0)
try:
a.index(2,0,4)
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 3979006..a70ac5f 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1834,8 +1834,18 @@ listindex(PyListObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O|ii:index", &v, &start, &stop))
return NULL;
- start = max(0, start);
- stop = max(0, min(self->ob_size, stop));
+ if (start < 0) {
+ start += self->ob_size;
+ if (start < 0)
+ start = 0;
+ }
+ if (stop < 0) {
+ stop += self->ob_size;
+ if (stop < 0)
+ stop = 0;
+ }
+ else if (stop > self->ob_size)
+ stop = self->ob_size;
for (i = start; i < stop; i++) {
int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
if (cmp > 0)