From: Serhiy Storchaka Date: Mon, 16 May 2016 19:15:57 +0000 (+0300) Subject: Issue #27039: Fixed bytearray.remove() for values greater than 127. X-Git-Tag: v2.7.12rc1~65 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c742dff16a8dd6979a7857948f63f99f391bb369;p=thirdparty%2FPython%2Fcpython.git Issue #27039: Fixed bytearray.remove() for values greater than 127. Patch by Joe Jevnik. --- diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 8e33b52c9b78..4a70b33bc0b9 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -723,6 +723,13 @@ class ByteArrayTest(BaseBytesTest): b.remove(Indexable(ord('e'))) self.assertEqual(b, b'') + # test values outside of the ascii range: (0, 127) + c = bytearray([126, 127, 128, 129]) + c.remove(127) + self.assertEqual(c, bytearray([126, 128, 129])) + c.remove(129) + self.assertEqual(c, bytearray([126, 128])) + def test_pop(self): b = bytearray(b'world') self.assertEqual(b.pop(), ord('d')) diff --git a/Misc/ACKS b/Misc/ACKS index eaee3343c84d..df9ee4a4bd51 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -652,6 +652,7 @@ Philip Jenvey MunSic Jeong Chris Jerdonek Dmitry Jeremov +Joe Jevnik Jim Jewett Pedro Diaz Jimenez Orjan Johansen diff --git a/Misc/NEWS b/Misc/NEWS index 342540336937..e825a2ee9e68 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 2.7.12? Core and Builtins ----------------- +- Issue #27039: Fixed bytearray.remove() for values greater than 127. Patch by + Joe Jevnik. + - Issue #4806: Avoid masking the original TypeError exception when using star (*) unpacking and the exception was raised from a generator. Based on patch by Hagen Fürstenau. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 3db35917026d..a90bdebb162c 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2395,23 +2395,21 @@ static PyObject * bytearray_remove(PyByteArrayObject *self, PyObject *arg) { int value; - Py_ssize_t where, n = Py_SIZE(self); + Py_ssize_t n = Py_SIZE(self); + char *where; if (! _getbytevalue(arg, &value)) return NULL; - for (where = 0; where < n; where++) { - if (self->ob_bytes[where] == value) - break; - } - if (where == n) { + where = memchr(self->ob_bytes, value, n); + if (!where) { PyErr_SetString(PyExc_ValueError, "value not found in bytearray"); return NULL; } if (!_canresize(self)) return NULL; - memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where); + memmove(where, where + 1, self->ob_bytes + n - where); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL;