summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2008-11-19 22:05:52 (GMT)
committerBenjamin Peterson <benjamin@python.org>2008-11-19 22:05:52 (GMT)
commit0f3641ce88025b5e41e80d1cb73d6f5751785e38 (patch)
tree8062d8f299782f99c5794e8c4031ecc550bb7d46
parent9c22aeebe1429b7c7dab703612b83ce9b4d6db1e (diff)
downloadcpython-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.py10
-rw-r--r--Objects/bytearrayobject.c20
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)
{