summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-03-02 17:30:18 (GMT)
committerBerker Peksag <berker.peksag@gmail.com>2016-03-02 17:30:18 (GMT)
commit6282e656e994a8722f39db6aea99aad2a826dee6 (patch)
tree7bc4f0399e6f9044787257da18db8f434a2001e2
parentd2dc15b26b03c03df664641fce544efa05588945 (diff)
downloadcpython-6282e656e994a8722f39db6aea99aad2a826dee6.zip
cpython-6282e656e994a8722f39db6aea99aad2a826dee6.tar.gz
cpython-6282e656e994a8722f39db6aea99aad2a826dee6.tar.bz2
Issue #26335: Make mmap.write() return the number of bytes written like
other write methods. Patch by Jakub Stasiak.
-rw-r--r--Doc/library/mmap.rst9
-rw-r--r--Lib/test/test_mmap.py8
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/mmapmodule.c5
4 files changed, 21 insertions, 4 deletions
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst
index 33baf2b..fb24728 100644
--- a/Doc/library/mmap.rst
+++ b/Doc/library/mmap.rst
@@ -263,13 +263,18 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
.. method:: write(bytes)
Write the bytes in *bytes* into memory at the current position of the
- file pointer; the file position is updated to point after the bytes that
- were written. If the mmap was created with :const:`ACCESS_READ`, then
+ file pointer and return the number of bytes written (never less than
+ ``len(bytes)``, since if the write fails, a :exc:`ValueError` will be
+ raised). The file position is updated to point after the bytes that
+ were written. If the mmap was created with :const:`ACCESS_READ`, then
writing to it will raise a :exc:`TypeError` exception.
.. versionchanged:: 3.5
Writable :term:`bytes-like object` is now accepted.
+ .. versionchanged:: 3.6
+ The number of bytes written is now returned.
+
.. method:: write_byte(byte)
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index 0f25742..be2e65a 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -713,6 +713,14 @@ class MmapTests(unittest.TestCase):
gc_collect()
self.assertIs(wr(), None)
+ def test_write_returning_the_number_of_bytes_written(self):
+ mm = mmap.mmap(-1, 16)
+ self.assertEqual(mm.write(b""), 0)
+ self.assertEqual(mm.write(b"x"), 1)
+ self.assertEqual(mm.write(b"yz"), 2)
+ self.assertEqual(mm.write(b"python"), 6)
+
+
class LargeMmapTests(unittest.TestCase):
def setUp(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index 8770705..eea0b33 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -198,6 +198,9 @@ Core and Builtins
Library
-------
+- Issue #26335: Make mmap.write() return the number of bytes written like
+ other write methods. Patch by Jakub Stasiak.
+
- Issue #26457: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length.
Based on patch by Xiang Zhang.
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index bb98a99..50cec24 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -389,6 +389,7 @@ mmap_write_method(mmap_object *self,
PyObject *args)
{
Py_buffer data;
+ PyObject *result;
CHECK_VALID(NULL);
if (!PyArg_ParseTuple(args, "y*:write", &data))
@@ -406,9 +407,9 @@ mmap_write_method(mmap_object *self,
}
memcpy(self->data + self->pos, data.buf, data.len);
self->pos = self->pos + data.len;
+ result = PyLong_FromSsize_t(data.len);
PyBuffer_Release(&data);
- Py_INCREF(Py_None);
- return Py_None;
+ return result;
}
static PyObject *