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

returns None.
This commit is contained in:
Victor Stinner 2011-05-25 22:49:15 +02:00
commit 988512cfd7
4 changed files with 23 additions and 6 deletions

View File

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

View File

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

View File

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

View File

@ -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);