Kaydet (Commit) 3cd1e42d authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue 3301: Bisect functions behaved badly when lo was negative.

üst d2cd86dd
...@@ -9,6 +9,8 @@ def insort_right(a, x, lo=0, hi=None): ...@@ -9,6 +9,8 @@ def insort_right(a, x, lo=0, hi=None):
slice of a to be searched. slice of a to be searched.
""" """
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None: if hi is None:
hi = len(a) hi = len(a)
while lo < hi: while lo < hi:
...@@ -30,6 +32,8 @@ def bisect_right(a, x, lo=0, hi=None): ...@@ -30,6 +32,8 @@ def bisect_right(a, x, lo=0, hi=None):
slice of a to be searched. slice of a to be searched.
""" """
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None: if hi is None:
hi = len(a) hi = len(a)
while lo < hi: while lo < hi:
...@@ -49,6 +53,8 @@ def insort_left(a, x, lo=0, hi=None): ...@@ -49,6 +53,8 @@ def insort_left(a, x, lo=0, hi=None):
slice of a to be searched. slice of a to be searched.
""" """
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None: if hi is None:
hi = len(a) hi = len(a)
while lo < hi: while lo < hi:
...@@ -69,6 +75,8 @@ def bisect_left(a, x, lo=0, hi=None): ...@@ -69,6 +75,8 @@ def bisect_left(a, x, lo=0, hi=None):
slice of a to be searched. slice of a to be searched.
""" """
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None: if hi is None:
hi = len(a) hi = len(a)
while lo < hi: while lo < hi:
......
...@@ -114,6 +114,14 @@ class TestBisect(unittest.TestCase): ...@@ -114,6 +114,14 @@ class TestBisect(unittest.TestCase):
self.assertEqual(func(data, elem), expected) self.assertEqual(func(data, elem), expected)
self.assertEqual(func(UserList(data), elem), expected) self.assertEqual(func(UserList(data), elem), expected)
def test_negative_lo(self):
# Issue 3301
mod = self.module
self.assertRaises(ValueError, mod.bisect_left, [1, 2, 3], 5, -1, 3),
self.assertRaises(ValueError, mod.bisect_right, [1, 2, 3], 5, -1, 3),
self.assertRaises(ValueError, mod.insort_left, [1, 2, 3], 5, -1, 3),
self.assertRaises(ValueError, mod.insort_right, [1, 2, 3], 5, -1, 3),
def test_random(self, n=25): def test_random(self, n=25):
from random import randrange from random import randrange
for i in xrange(n): for i in xrange(n):
......
...@@ -10,6 +10,7 @@ What's New in Python 2.6 beta 2? ...@@ -10,6 +10,7 @@ What's New in Python 2.6 beta 2?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #2517: Allow unicode messages in Exceptions again by correctly - Issue #2517: Allow unicode messages in Exceptions again by correctly
bypassing the instance dictionary when looking up __unicode__ on bypassing the instance dictionary when looking up __unicode__ on
new-style classes. new-style classes.
...@@ -40,6 +41,8 @@ Core and Builtins ...@@ -40,6 +41,8 @@ Core and Builtins
Library Library
------- -------
- Issue #3301: Bisect module modules behaved badly when lo was negative.
- Issue #839496: SimpleHTTPServer used to open text files in text mode. This is - Issue #839496: SimpleHTTPServer used to open text files in text mode. This is
both unnecessary (HTTP allows text content to be sent in several forms) and both unnecessary (HTTP allows text content to be sent in several forms) and
wrong because the actual transmitted size could differ with the wrong because the actual transmitted size could differ with the
......
...@@ -11,6 +11,10 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t ...@@ -11,6 +11,10 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t
PyObject *litem; PyObject *litem;
Py_ssize_t mid, res; Py_ssize_t mid, res;
if (lo < 0) {
PyErr_SetString(PyExc_ValueError, "lo must be non-negative");
return -1;
}
if (hi == -1) { if (hi == -1) {
hi = PySequence_Size(list); hi = PySequence_Size(list);
if (hi < 0) if (hi < 0)
...@@ -108,6 +112,10 @@ internal_bisect_left(PyObject *list, PyObject *item, int lo, int hi) ...@@ -108,6 +112,10 @@ internal_bisect_left(PyObject *list, PyObject *item, int lo, int hi)
PyObject *litem; PyObject *litem;
int mid, res; int mid, res;
if (lo < 0) {
PyErr_SetString(PyExc_ValueError, "lo must be non-negative");
return -1;
}
if (hi == -1) { if (hi == -1) {
hi = PySequence_Size(list); hi = PySequence_Size(list);
if (hi < 0) if (hi < 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment