From c742dff16a8dd6979a7857948f63f99f391bb369 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 16 May 2016 22:15:57 +0300 Subject: [PATCH] Issue #27039: Fixed bytearray.remove() for values greater than 127. Patch by Joe Jevnik. --- Lib/test/test_bytes.py | 7 +++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Objects/bytearrayobject.c | 12 +++++------- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 8e33b52c9b..4a70b33bc0 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 eaee3343c8..df9ee4a4bd 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 3425403369..e825a2ee9e 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 3db3591702..a90bdebb16 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; -- 2.50.1