Issue #26335: Make mmap.write() return the number of bytes written like

other write methods.

Patch by Jakub Stasiak.
This commit is contained in:
Berker Peksag 2016-03-02 19:30:18 +02:00
parent d2dc15b26b
commit 6282e656e9
4 changed files with 21 additions and 4 deletions

View 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)

View 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):

View File

@ -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.

View 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 *