diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-11-19 22:05:52 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-11-19 22:05:52 (GMT) |
commit | 0f3641ce88025b5e41e80d1cb73d6f5751785e38 (patch) | |
tree | 8062d8f299782f99c5794e8c4031ecc550bb7d46 | |
parent | 9c22aeebe1429b7c7dab703612b83ce9b4d6db1e (diff) | |
download | cpython-0f3641ce88025b5e41e80d1cb73d6f5751785e38.zip cpython-0f3641ce88025b5e41e80d1cb73d6f5751785e38.tar.gz cpython-0f3641ce88025b5e41e80d1cb73d6f5751785e38.tar.bz2 |
Merged revisions 67291 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67291 | benjamin.peterson | 2008-11-19 15:49:09 -0600 (Wed, 19 Nov 2008) | 5 lines
make sure that bytearray methods return a new bytearray even if there is no change
Fixes #4348
Reviewed by Brett
........
-rw-r--r-- | Lib/test/test_bytes.py | 10 | ||||
-rw-r--r-- | Objects/bytearrayobject.c | 20 |
2 files changed, 13 insertions, 17 deletions
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index c4a3e51..7b2a0bd 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -738,6 +738,16 @@ class ByteArrayTest(BaseBytesTest): b.insert(0, Indexable(ord('A'))) self.assertEqual(b, b'A') + def test_copied(self): + # Issue 4348. Make sure that operations that don't mutate the array + # copy the bytes. + b = bytearray(b'abc') + #self.assertFalse(b is b.replace(b'abc', b'cde', 0)) + + t = bytearray([i for i in range(256)]) + x = bytearray(b'') + self.assertFalse(x is x.translate(t)) + def test_partition_bytearray_doesnt_share_nullstring(self): a, b, c = bytearray(b"x").partition(b"y") self.assertEqual(b, b"") diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 997a835..707c844 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1351,7 +1351,7 @@ bytes_translate(PyByteArrayObject *self, PyObject *args) { register char *input, *output; register const char *table; - register Py_ssize_t i, c, changed = 0; + register Py_ssize_t i, c; PyObject *input_obj = (PyObject*)self; const char *output_start; Py_ssize_t inlen; @@ -1397,14 +1397,8 @@ bytes_translate(PyByteArrayObject *self, PyObject *args) /* If no deletions are required, use faster code */ for (i = inlen; --i >= 0; ) { c = Py_CHARMASK(*input++); - if (Py_CHARMASK((*output++ = table[c])) != c) - changed = 1; + *output++ = table[c]; } - if (changed || !PyByteArray_CheckExact(input_obj)) - goto done; - Py_DECREF(result); - Py_INCREF(input_obj); - result = input_obj; goto done; } @@ -1419,13 +1413,6 @@ bytes_translate(PyByteArrayObject *self, PyObject *args) if (trans_table[c] != -1) if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c) continue; - changed = 1; - } - if (!changed && PyByteArray_CheckExact(input_obj)) { - Py_DECREF(result); - Py_INCREF(input_obj); - result = input_obj; - goto done; } /* Fix the size of the resulting string */ if (inlen > 0) @@ -1454,8 +1441,7 @@ done: !memcmp(target+offset+1, pattern+1, length-2) ) -/* Bytes ops must return a string. */ -/* If the object is subclass of bytes, create a copy */ +/* Bytes ops must return a string, create a copy */ Py_LOCAL(PyByteArrayObject *) return_self(PyByteArrayObject *self) { |