Commit 988512cf authored by Victor Stinner's avatar Victor Stinner

(Merge 3.1) Issue #12175: RawIOBase.readall() now returns None if read()

returns None.
parents 4767114e a80987f2
...@@ -558,7 +558,11 @@ class RawIOBase(IOBase): ...@@ -558,7 +558,11 @@ class RawIOBase(IOBase):
if not data: if not data:
break break
res += data res += data
return bytes(res) if res:
return bytes(res)
else:
# b'' or None
return data
def readinto(self, b): def readinto(self, b):
"""Read up to len(b) bytes into bytearray b. """Read up to len(b) bytes into bytearray b.
......
...@@ -827,14 +827,17 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): ...@@ -827,14 +827,17 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
# Inject some None's in there to simulate EWOULDBLOCK # Inject some None's in there to simulate EWOULDBLOCK
rawio = self.MockRawIO((b"abc", b"d", None, b"efg", None, None, None)) rawio = self.MockRawIO((b"abc", b"d", None, b"efg", None, None, None))
bufio = self.tp(rawio) bufio = self.tp(rawio)
self.assertEqual(b"abcd", bufio.read(6)) self.assertEqual(b"abcd", bufio.read(6))
self.assertEqual(b"e", bufio.read(1)) self.assertEqual(b"e", bufio.read(1))
self.assertEqual(b"fg", bufio.read()) self.assertEqual(b"fg", bufio.read())
self.assertEqual(b"", bufio.peek(1)) self.assertEqual(b"", bufio.peek(1))
self.assertTrue(None is bufio.read()) self.assertIsNone(bufio.read())
self.assertEqual(b"", bufio.read()) self.assertEqual(b"", bufio.read())
rawio = self.MockRawIO((b"a", None, None))
self.assertEqual(b"a", rawio.readall())
self.assertIsNone(rawio.readall())
def test_read_past_eof(self): def test_read_past_eof(self):
rawio = self.MockRawIO((b"abc", b"d", b"efg")) rawio = self.MockRawIO((b"abc", b"d", b"efg"))
bufio = self.tp(rawio) bufio = self.tp(rawio)
......
...@@ -13,6 +13,11 @@ Core and Builtins ...@@ -13,6 +13,11 @@ Core and Builtins
Library Library
------- -------
- Issue #12175: RawIOBase.readall() now returns None if read() returns None.
- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
if the file is closed.
- Issue #12070: Fix the Makefile parser of the sysconfig module to handle - Issue #12070: Fix the Makefile parser of the sysconfig module to handle
correctly references to "bogus variable" (e.g. "prefix=$/opt/python"). correctly references to "bogus variable" (e.g. "prefix=$/opt/python").
...@@ -731,9 +736,6 @@ Core and Builtins ...@@ -731,9 +736,6 @@ Core and Builtins
Library Library
------- -------
- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
if the file is closed.
- Issue #10916: mmap should not segfault when a file is mapped using 0 as length - Issue #10916: mmap should not segfault when a file is mapped using 0 as length
and a non-zero offset, and an attempt to read past the end of file is made and a non-zero offset, and an attempt to read past the end of file is made
(IndexError is raised instead). Patch by Ross Lagerwall. (IndexError is raised instead). Patch by Ross Lagerwall.
......
...@@ -815,6 +815,14 @@ rawiobase_readall(PyObject *self, PyObject *args) ...@@ -815,6 +815,14 @@ rawiobase_readall(PyObject *self, PyObject *args)
Py_DECREF(chunks); Py_DECREF(chunks);
return NULL; return NULL;
} }
if (data == Py_None) {
if (PyList_GET_SIZE(chunks) == 0) {
Py_DECREF(chunks);
return data;
}
Py_DECREF(data);
break;
}
if (!PyBytes_Check(data)) { if (!PyBytes_Check(data)) {
Py_DECREF(chunks); Py_DECREF(chunks);
Py_DECREF(data); Py_DECREF(data);
......
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