# HG changeset patch # User Thomas Jollans # Date 1277240335 -7200 # Branch py3k # Node ID 6e13d49884855bfb75e0f7455fe9145dcf0facb6 # Parent 9dd5dc3e8fb5faaeb0cc98867fd9724b93355217 imported patch array.diff diff -r 9dd5dc3e8fb5 -r 6e13d4988485 Lib/test/test_array.py --- a/Lib/test/test_array.py Tue Jun 22 22:34:34 2010 +0200 +++ b/Lib/test/test_array.py Tue Jun 22 22:58:55 2010 +0200 @@ -362,9 +362,11 @@ self.assertRaises(TypeError, b.fromstring) self.assertRaises(TypeError, b.fromstring, 42) b.fromstring(a.tostring()) + c = array.array(self.typecode, bytearray(a.tostring())) self.assertEqual(a, b) + self.assertEqual(a, c) if a.itemsize>1: - self.assertRaises(ValueError, b.fromstring, "x") + self.assertRaises(ValueError, b.fromstring, b"x") def test_repr(self): a = array.array(self.typecode, 2*self.example) @@ -1099,6 +1101,23 @@ upper = int(pow(2, a.itemsize * 8)) - 1 self.check_overflow(lower, upper) + def test_bytes_extend(self): + s = bytes(self.example) + + a = array.array(self.typecode, self.example) + a.extend(s) + self.assertEqual( + a, + array.array(self.typecode, self.example+self.example) + ) + + a = array.array(self.typecode, self.example) + a.extend(bytearray(reversed(s))) + self.assertEqual( + a, + array.array(self.typecode, self.example+self.example[::-1]) + ) + class ByteTest(SignedNumberTest): typecode = 'b' diff -r 9dd5dc3e8fb5 -r 6e13d4988485 Modules/arraymodule.c --- a/Modules/arraymodule.c Tue Jun 22 22:34:34 2010 +0200 +++ b/Modules/arraymodule.c Tue Jun 22 22:58:55 2010 +0200 @@ -1335,12 +1335,21 @@ static PyObject * array_fromstring(arrayobject *self, PyObject *args) { + Py_buffer buffer; char *str; Py_ssize_t n; int itemsize = self->ob_descr->itemsize; - if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n)) + if (!PyArg_ParseTuple(args, "y*:fromstring", &buffer)) return NULL; + if (buffer.itemsize != 1) { + PyBuffer_Release(&buffer); + PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required."); + return NULL; + } + str = buffer.buf; + n = buffer.len; if (n % itemsize != 0) { + PyBuffer_Release(&buffer); PyErr_SetString(PyExc_ValueError, "string length not a multiple of item size"); return NULL; @@ -1350,13 +1359,17 @@ Py_ssize_t old_size = Py_SIZE(self); if ((n > PY_SSIZE_T_MAX - old_size) || ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) { + PyBuffer_Release(&buffer); return PyErr_NoMemory(); } - if (array_resize(self, old_size + n) == -1) + if (array_resize(self, old_size + n) == -1) { + PyBuffer_Release(&buffer); return NULL; + } memcpy(self->ob_item + old_size * itemsize, str, n * itemsize); } + PyBuffer_Release(&buffer); Py_INCREF(Py_None); return Py_None; }