diff options
| -rw-r--r-- | Lib/test/test_memoryio.py | 11 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Modules/_io/bytesio.c | 12 | 
3 files changed, 26 insertions, 0 deletions
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index 68657aa..007a092 100644 --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -638,6 +638,17 @@ class CBytesIOTest(PyBytesIOTest):          memio.close()          self.assertRaises(ValueError, memio.__setstate__, (b"closed", 0, None)) +    check_sizeof = support.check_sizeof + +    @support.cpython_only +    def test_sizeof(self): +        basesize = support.calcobjsize(b'P2PP2P') +        check = self.check_sizeof +        self.assertEqual(object.__sizeof__(io.BytesIO()), basesize) +        check(io.BytesIO(), basesize ) +        check(io.BytesIO(b'a'), basesize + 1 + 1 ) +        check(io.BytesIO(b'a' * 1000), basesize + 1000 + 1 ) +  class CStringIOTest(PyStringIOTest):      ioclass = io.StringIO @@ -92,6 +92,9 @@ Core and Builtins  Library  ------- +- Issue #15489: Add a __sizeof__ implementation for BytesIO objects. +  Patch by Serhiy Storchaka. +  - Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.    Patch by Serhiy Storchaka. diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 51fad21..ae8c1c1 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -794,6 +794,17 @@ bytesio_init(bytesio *self, PyObject *args, PyObject *kwds)      return 0;  } +static PyObject * +bytesio_sizeof(bytesio *self, void *unused) +{ +    Py_ssize_t res; + +    res = sizeof(bytesio); +    if (self->buf) +        res += self->buf_size; +    return PyLong_FromSsize_t(res); +} +  static int  bytesio_traverse(bytesio *self, visitproc visit, void *arg)  { @@ -835,6 +846,7 @@ static struct PyMethodDef bytesio_methods[] = {      {"truncate",   (PyCFunction)bytesio_truncate,   METH_VARARGS, truncate_doc},      {"__getstate__",  (PyCFunction)bytesio_getstate,  METH_NOARGS, NULL},      {"__setstate__",  (PyCFunction)bytesio_setstate,  METH_O, NULL}, +    {"__sizeof__", (PyCFunction)bytesio_sizeof,     METH_NOARGS, NULL},      {NULL, NULL}        /* sentinel */  };  | 
