diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-16 19:15:57 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-16 19:15:57 (GMT) |
commit | c742dff16a8dd6979a7857948f63f99f391bb369 (patch) | |
tree | ce6e437720348a246ad3ee677d1f18e980b86198 | |
parent | 3079bbebac4e455bec8e3f2e983daf63503af196 (diff) | |
download | cpython-c742dff16a8dd6979a7857948f63f99f391bb369.zip cpython-c742dff16a8dd6979a7857948f63f99f391bb369.tar.gz cpython-c742dff16a8dd6979a7857948f63f99f391bb369.tar.bz2 |
Issue #27039: Fixed bytearray.remove() for values greater than 127.
Patch by Joe Jevnik.
-rw-r--r-- | Lib/test/test_bytes.py | 7 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | 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 8e33b52..4a70b33 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')) @@ -652,6 +652,7 @@ Philip Jenvey MunSic Jeong Chris Jerdonek Dmitry Jeremov +Joe Jevnik Jim Jewett Pedro Diaz Jimenez Orjan Johansen @@ -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 3db3591..a90bdeb 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; |