[Python-3000-checkins] r67292 - in python/branches/py3k: Lib/test/test_bytes.py Objects/bytearrayobject.c

benjamin.peterson python-3000-checkins at python.org
Wed Nov 19 23:05:52 CET 2008


Author: benjamin.peterson
Date: Wed Nov 19 23:05:52 2008
New Revision: 67292

Log:
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
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/test/test_bytes.py
   python/branches/py3k/Objects/bytearrayobject.c

Modified: python/branches/py3k/Lib/test/test_bytes.py
==============================================================================
--- python/branches/py3k/Lib/test/test_bytes.py	(original)
+++ python/branches/py3k/Lib/test/test_bytes.py	Wed Nov 19 23:05:52 2008
@@ -738,6 +738,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/branches/py3k/Objects/bytearrayobject.c
==============================================================================
--- python/branches/py3k/Objects/bytearrayobject.c	(original)
+++ python/branches/py3k/Objects/bytearrayobject.c	Wed Nov 19 23:05:52 2008
@@ -1351,7 +1351,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;
@@ -1397,14 +1397,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;
     }
 
@@ -1419,13 +1413,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)
@@ -1454,8 +1441,7 @@
    !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)
 {


More information about the Python-3000-checkins mailing list