From: Guido van Rossum Date: Tue, 17 Jun 2003 14:25:14 +0000 (+0000) Subject: Fix sloppy index() implementation: X-Git-Tag: v2.3c1~399 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2743d87d7934535f16a0ea062a28c21ea18e5a24;p=python Fix sloppy index() implementation: - don't use min() and max() - interpret negative start/stop argument like negative slice indices --- diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 9599456a22..61f660b6ff 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 3979006e9e..a70ac5ffa9 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)