]> granicus.if.org Git - python/commitdiff
Issue #26335: Make mmap.write() return the number of bytes written like
authorBerker Peksag <berker.peksag@gmail.com>
Wed, 2 Mar 2016 17:30:18 +0000 (19:30 +0200)
committerBerker Peksag <berker.peksag@gmail.com>
Wed, 2 Mar 2016 17:30:18 +0000 (19:30 +0200)
other write methods.

Patch by Jakub Stasiak.

Doc/library/mmap.rst
Lib/test/test_mmap.py
Misc/NEWS
Modules/mmapmodule.c

index 33baf2bfae23886fececd2a839ce63228ae94b3d..fb247281059cca27f2d683a4d968ad102b3d306d 100644 (file)
@@ -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)
 
index 0f25742c486d2c0863118f53e0e72f1812430126..be2e65adff79929098fe624594d80283bc3fde9f 100644 (file)
@@ -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):
index 87707050a4576235dd8eb106d8caf934cc34ba46..eea0b3309dfe7ea5de9c14de029e913051affafe 100644 (file)
--- 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.
index bb98a9942757b2fab3adb1982d4be82ffbcc1303..50cec2498d834f1c751490d78974036d4af3165b 100644 (file)
@@ -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 *