]> granicus.if.org Git - python/commitdiff
Fix array.extend and array.__iadd__ to handle the case where an array
authorAlexandre Vassalotti <alexandre@peadrop.com>
Sun, 5 Jul 2009 06:25:14 +0000 (06:25 +0000)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Sun, 5 Jul 2009 06:25:14 +0000 (06:25 +0000)
is extended with itself.

This bug is specific the py3k version of arraymodule.c

Lib/test/test_array.py
Modules/arraymodule.c

index 79e11999596c49c52dee796819781b23f7aac695..3dd4f6df3b574e2bd7fc15c3adfbbf0259daba2a 100755 (executable)
@@ -272,6 +272,12 @@ class BaseTest(unittest.TestCase):
             a,
             array.array(self.typecode, self.example[::-1]+2*self.example)
         )
+        a = array.array(self.typecode, self.example)
+        a += a
+        self.assertEqual(
+            a,
+            array.array(self.typecode, self.example + self.example)
+        )
 
         b = array.array(self.badtypecode())
         self.assertRaises(TypeError, a.__add__, b)
@@ -667,6 +673,13 @@ class BaseTest(unittest.TestCase):
             array.array(self.typecode, self.example+self.example[::-1])
         )
 
+        a = array.array(self.typecode, self.example)
+        a.extend(a)
+        self.assertEqual(
+            a,
+            array.array(self.typecode, self.example+self.example)
+        )
+
         b = array.array(self.badtypecode())
         self.assertRaises(TypeError, a.extend, b)
 
index 256bcd8edc96b96d468f232229fc642c7eec380e..1dbe9181af5322c2f4428865c90368021dd63ead 100644 (file)
@@ -810,8 +810,8 @@ array_iter_extend(arrayobject *self, PyObject *bb)
 static int
 array_do_extend(arrayobject *self, PyObject *bb)
 {
-       Py_ssize_t size, oldsize;
-
+       Py_ssize_t size, oldsize, bbsize;
+       
        if (!array_Check(bb))
                return array_iter_extend(self, bb);
 #define b ((arrayobject *)bb)
@@ -826,11 +826,13 @@ array_do_extend(arrayobject *self, PyObject *bb)
                return -1;
        }
        oldsize = Py_SIZE(self);
+       /* Get the size of bb before resizing the array since bb could be self. */
+       bbsize = Py_SIZE(bb);
        size = oldsize + Py_SIZE(b);
        if (array_resize(self, size) == -1)
                return -1;
        memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
-               b->ob_item, Py_SIZE(b) * b->ob_descr->itemsize);
+               b->ob_item, bbsize * b->ob_descr->itemsize);
 
        return 0;
 #undef b