Commit bff5df0d authored by Antoine Pitrou's avatar Antoine Pitrou

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

Patch by Serhiy Storchaka.
parent c02e1e65
...@@ -748,6 +748,20 @@ class CommonBufferedTests: ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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):
......
...@@ -92,6 +92,9 @@ Core and Builtins ...@@ -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.
......
...@@ -386,6 +386,17 @@ buffered_dealloc(buffered *self) ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment