Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.

Patch by Serhiy Storchaka.
This commit is contained in:
Antoine Pitrou 2012-07-29 19:02:46 +02:00
parent c02e1e65c4
commit bff5df0d1c
3 changed files with 35 additions and 4 deletions

View File

@ -748,6 +748,20 @@ class CommonBufferedTests:
buf.raw = x buf.raw = x
class SizeofTest:
@support.cpython_only
def test_sizeof(self):
bufsize1 = 4096
bufsize2 = 8192
rawio = self.MockRawIO()
bufio = self.tp(rawio, buffer_size=bufsize1)
size = sys.getsizeof(bufio) - bufsize1
rawio = self.MockRawIO()
bufio = self.tp(rawio, buffer_size=bufsize2)
self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
read_mode = "rb" read_mode = "rb"
@ -931,7 +945,7 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
"failed for {}: {} != 0".format(n, rawio._extraneous_reads)) "failed for {}: {} != 0".format(n, rawio._extraneous_reads))
class CBufferedReaderTest(BufferedReaderTest): class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
tp = io.BufferedReader tp = io.BufferedReader
def test_constructor(self): def test_constructor(self):
@ -1194,7 +1208,7 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
self.tp(self.MockRawIO(), 8, 12) self.tp(self.MockRawIO(), 8, 12)
class CBufferedWriterTest(BufferedWriterTest): class CBufferedWriterTest(BufferedWriterTest, SizeofTest):
tp = io.BufferedWriter tp = io.BufferedWriter
def test_constructor(self): def test_constructor(self):
@ -1582,8 +1596,8 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
f.flush() f.flush()
self.assertEqual(raw.getvalue(), b'1b\n2def\n3\n') self.assertEqual(raw.getvalue(), b'1b\n2def\n3\n')
class CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest,
class CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest, BufferedRandomTest): BufferedRandomTest, SizeofTest):
tp = io.BufferedRandom tp = io.BufferedRandom
def test_constructor(self): def test_constructor(self):

View File

@ -92,6 +92,9 @@ Core and Builtins
Library Library
------- -------
- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Patch by Serhiy Storchaka.
- Issue #15402: An issue in the struct module that caused sys.getsizeof to - Issue #15402: An issue in the struct module that caused sys.getsizeof to
return incorrect results for struct.Struct instances has been fixed. return incorrect results for struct.Struct instances has been fixed.
Initial patch by Serhiy Storchaka. Initial patch by Serhiy Storchaka.

View File

@ -386,6 +386,17 @@ buffered_dealloc(buffered *self)
Py_TYPE(self)->tp_free((PyObject *)self); Py_TYPE(self)->tp_free((PyObject *)self);
} }
static PyObject *
buffered_sizeof(buffered *self, void *unused)
{
Py_ssize_t res;
res = sizeof(buffered);
if (self->buffer)
res += self->buffer_size;
return PyLong_FromSsize_t(res);
}
static int static int
buffered_traverse(buffered *self, visitproc visit, void *arg) buffered_traverse(buffered *self, visitproc visit, void *arg)
{ {
@ -1560,6 +1571,7 @@ static PyMethodDef bufferedreader_methods[] = {
{"seek", (PyCFunction)buffered_seek, METH_VARARGS}, {"seek", (PyCFunction)buffered_seek, METH_VARARGS},
{"tell", (PyCFunction)buffered_tell, METH_NOARGS}, {"tell", (PyCFunction)buffered_tell, METH_NOARGS},
{"truncate", (PyCFunction)buffered_truncate, METH_VARARGS}, {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS},
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
{NULL, NULL} {NULL, NULL}
}; };
@ -1952,6 +1964,7 @@ static PyMethodDef bufferedwriter_methods[] = {
{"flush", (PyCFunction)buffered_flush, METH_NOARGS}, {"flush", (PyCFunction)buffered_flush, METH_NOARGS},
{"seek", (PyCFunction)buffered_seek, METH_VARARGS}, {"seek", (PyCFunction)buffered_seek, METH_VARARGS},
{"tell", (PyCFunction)buffered_tell, METH_NOARGS}, {"tell", (PyCFunction)buffered_tell, METH_NOARGS},
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
{NULL, NULL} {NULL, NULL}
}; };
@ -2347,6 +2360,7 @@ static PyMethodDef bufferedrandom_methods[] = {
{"readline", (PyCFunction)buffered_readline, METH_VARARGS}, {"readline", (PyCFunction)buffered_readline, METH_VARARGS},
{"peek", (PyCFunction)buffered_peek, METH_VARARGS}, {"peek", (PyCFunction)buffered_peek, METH_VARARGS},
{"write", (PyCFunction)bufferedwriter_write, METH_VARARGS}, {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS},
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
{NULL, NULL} {NULL, NULL}
}; };