[Python-checkins] r67291 - in python/trunk: Lib/test/test_bytes.py Misc/NEWS Objects/bytearrayobject.c

benjamin.peterson python-checkins at python.org
Wed Nov 19 22:49:09 CET 2008


Author: benjamin.peterson
Date: Wed Nov 19 22:49:09 2008
New Revision: 67291
Log:
make sure that bytearray methods return a new bytearray even if there is no change
Fixes #4348
Reviewed by Brett
Modified:
 python/trunk/Lib/test/test_bytes.py
 python/trunk/Misc/NEWS
 python/trunk/Objects/bytearrayobject.c
Modified: python/trunk/Lib/test/test_bytes.py
==============================================================================
--- python/trunk/Lib/test/test_bytes.py	(original)
+++ python/trunk/Lib/test/test_bytes.py	Wed Nov 19 22:49:09 2008
@@ -721,6 +721,16 @@
 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"")
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Nov 19 22:49:09 2008
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #4348: Some bytearray methods returned that didn't cause any change to
+ the bytearray, returned the same bytearray instead of a copy.
+
 - Issue #4317: Fixed a crash in the imageop.rgb2rgb8() function.
 
 - Issue #4230: If ``__getattr__`` is a descriptor, it now functions correctly.
Modified: python/trunk/Objects/bytearrayobject.c
==============================================================================
--- python/trunk/Objects/bytearrayobject.c	(original)
+++ python/trunk/Objects/bytearrayobject.c	Wed Nov 19 22:49:09 2008
@@ -1423,7 +1423,7 @@
 {
 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;
@@ -1469,14 +1469,8 @@
 /* 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;
 }
 
@@ -1491,13 +1485,6 @@
 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)
@@ -1526,15 +1513,10 @@
 !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)
 {
- if (PyByteArray_CheckExact(self)) {
- Py_INCREF(self);
- return (PyByteArrayObject *)self;
- }
 return (PyByteArrayObject *)PyByteArray_FromStringAndSize(
 PyByteArray_AS_STRING(self),
 PyByteArray_GET_SIZE(self));


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /