diff -r f2f5d1c928eb Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py Sun Jun 28 11:15:13 2015 -0400 +++ b/Lib/test/test_bytes.py Sun Jun 28 22:26:20 2015 +0300 @@ -1098,9 +1098,27 @@ class ByteArrayTest(BaseBytesTest, unitt for i in range(100): b += b"x" alloc = b.__alloc__() - self.assertTrue(alloc >= len(b)) + self.assertGreater(alloc, len(b)) # including trailing null byte if alloc not in seq: seq.append(alloc) + print(seq) + + def test_init_alloc(self): + b = bytearray() + def g(): + for i in range(1, 100): + yield i + a = list(b) + self.assertEqual(a, list(range(1, len(a)+1))) + self.assertEqual(len(b), len(a)) + self.assertLessEqual(len(b), i) + alloc = b.__alloc__() + self.assertGreater(alloc, len(b)) # including trailing null byte + b.__init__(g()) + self.assertEqual(list(b), list(range(1, 100))) + self.assertEqual(len(b), 99) + alloc = b.__alloc__() + self.assertGreater(alloc, len(b)) def test_extend(self): orig = b'hello' diff -r f2f5d1c928eb Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c Sun Jun 28 11:15:13 2015 -0400 +++ b/Objects/bytearrayobject.c Sun Jun 28 22:26:20 2015 +0300 @@ -891,8 +891,10 @@ bytearray_init(PyByteArrayObject *self, goto error; /* Append the byte */ - if (Py_SIZE(self) < self->ob_alloc) + if (Py_SIZE(self) + 1 < self->ob_alloc) { Py_SIZE(self)++; + PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; + } else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) goto error; PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;