Browse Source

Issue #15696: Add a __sizeof__ implementation for mmap objects on Windows.

pull/9921/head
Serhiy Storchaka 12 years ago
parent
commit
ef1a79799f
  1. 11
      Lib/test/test_mmap.py
  2. 2
      Misc/NEWS
  3. 16
      Modules/mmapmodule.c

11
Lib/test/test_mmap.py

@ -1,5 +1,5 @@
from test.support import (TESTFN, run_unittest, import_module, unlink,
requires, _2G, _4G, gc_collect)
requires, _2G, _4G, gc_collect, cpython_only)
import unittest
import os
import re
@ -639,6 +639,15 @@ class MmapTests(unittest.TestCase):
m2.close()
m1.close()
@cpython_only
@unittest.skipUnless(os.name == 'nt', 'requires Windows')
def test_sizeof(self):
m1 = mmap.mmap(-1, 100)
tagname = "foo"
m2 = mmap.mmap(-1, 100, tagname=tagname)
self.assertEqual(sys.getsize(m2),
sys.getsize(m1) + len(tagname) + 1)
@unittest.skipUnless(os.name == 'nt', 'requires Windows')
def test_crasher_on_windows(self):
# Should not crash (Issue 1733986)

2
Misc/NEWS

@ -121,6 +121,8 @@ Core and Builtins
Library
-------
- Issue #15696: Add a __sizeof__ implementation for mmap objects on Windows.
- Issue #22068: Avoided reference loops with Variables and Fonts in Tkinter.
- Issue #22165: SimpleHTTPRequestHandler now supports undecodable file names.

16
Modules/mmapmodule.c

@ -709,6 +709,19 @@ mmap__exit__method(PyObject *self, PyObject *args)
return _PyObject_CallMethodId(self, &PyId_close, NULL);
}
#ifdef MS_WINDOWS
static PyObject *
mmap__sizeof__method(mmap_object *self, void *unused)
{
Py_ssize_t res;
res = sizeof(mmap_object);
if (self->tagname)
res += strlen(self->tagname) + 1;
return PyLong_FromSsize_t(res);
}
#endif
static struct PyMethodDef mmap_object_methods[] = {
{"close", (PyCFunction) mmap_close_method, METH_NOARGS},
{"find", (PyCFunction) mmap_find_method, METH_VARARGS},
@ -726,6 +739,9 @@ static struct PyMethodDef mmap_object_methods[] = {
{"write_byte", (PyCFunction) mmap_write_byte_method, METH_VARARGS},
{"__enter__", (PyCFunction) mmap__enter__method, METH_NOARGS},
{"__exit__", (PyCFunction) mmap__exit__method, METH_VARARGS},
#ifdef MS_WINDOWS
{"__sizeof__", (PyCFunction) mmap__sizeof__method, METH_NOARGS},
#endif
{NULL, NULL} /* sentinel */
};

Loading…
Cancel
Save