mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
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
This commit is contained in:
parent
b78637a5bc
commit
e503cf9b0e
2 changed files with 18 additions and 3 deletions
|
@ -272,6 +272,12 @@ class BaseTest(unittest.TestCase):
|
||||||
a,
|
a,
|
||||||
array.array(self.typecode, self.example[::-1]+2*self.example)
|
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())
|
b = array.array(self.badtypecode())
|
||||||
self.assertRaises(TypeError, a.__add__, b)
|
self.assertRaises(TypeError, a.__add__, b)
|
||||||
|
@ -667,6 +673,13 @@ class BaseTest(unittest.TestCase):
|
||||||
array.array(self.typecode, self.example+self.example[::-1])
|
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())
|
b = array.array(self.badtypecode())
|
||||||
self.assertRaises(TypeError, a.extend, b)
|
self.assertRaises(TypeError, a.extend, b)
|
||||||
|
|
||||||
|
|
|
@ -810,8 +810,8 @@ array_iter_extend(arrayobject *self, PyObject *bb)
|
||||||
static int
|
static int
|
||||||
array_do_extend(arrayobject *self, PyObject *bb)
|
array_do_extend(arrayobject *self, PyObject *bb)
|
||||||
{
|
{
|
||||||
Py_ssize_t size, oldsize;
|
Py_ssize_t size, oldsize, bbsize;
|
||||||
|
|
||||||
if (!array_Check(bb))
|
if (!array_Check(bb))
|
||||||
return array_iter_extend(self, bb);
|
return array_iter_extend(self, bb);
|
||||||
#define b ((arrayobject *)bb)
|
#define b ((arrayobject *)bb)
|
||||||
|
@ -826,11 +826,13 @@ array_do_extend(arrayobject *self, PyObject *bb)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
oldsize = Py_SIZE(self);
|
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);
|
size = oldsize + Py_SIZE(b);
|
||||||
if (array_resize(self, size) == -1)
|
if (array_resize(self, size) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
|
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;
|
return 0;
|
||||||
#undef b
|
#undef b
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue