changeset: 101378:9acf44b7ff7b branch: 2.7 parent: 101370:789a3f87bde1 user: Serhiy Storchaka date: Mon May 16 22:15:57 2016 +0300 files: Lib/test/test_bytes.py Misc/ACKS Misc/NEWS Objects/bytearrayobject.c description: Issue #27039: Fixed bytearray.remove() for values greater than 127. Patch by Joe Jevnik. diff -r 789a3f87bde1 -r 9acf44b7ff7b Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py Mon May 16 01:07:13 2016 +0000 +++ b/Lib/test/test_bytes.py Mon May 16 22:15:57 2016 +0300 @@ -723,6 +723,13 @@ 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 -r 789a3f87bde1 -r 9acf44b7ff7b Misc/ACKS --- a/Misc/ACKS Mon May 16 01:07:13 2016 +0000 +++ b/Misc/ACKS Mon May 16 22:15:57 2016 +0300 @@ -652,6 +652,7 @@ MunSic Jeong Chris Jerdonek Dmitry Jeremov +Joe Jevnik Jim Jewett Pedro Diaz Jimenez Orjan Johansen diff -r 789a3f87bde1 -r 9acf44b7ff7b Misc/NEWS --- a/Misc/NEWS Mon May 16 01:07:13 2016 +0000 +++ b/Misc/NEWS Mon May 16 22:15:57 2016 +0300 @@ -10,6 +10,9 @@ 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 -r 789a3f87bde1 -r 9acf44b7ff7b Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c Mon May 16 01:07:13 2016 +0000 +++ b/Objects/bytearrayobject.c Mon May 16 22:15:57 2016 +0300 @@ -2395,23 +2395,21 @@ 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;