Commit e503cf9b authored by Alexandre Vassalotti's avatar Alexandre Vassalotti

Fix array.extend and array.__iadd__ to handle the case where an array

is extended with itself.

This bug is specific the py3k version of arraymodule.c
parent b78637a5
......@@ -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)
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment