Issue #21802: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().
This commit is contained in:
commit
8be6be427d
|
@ -1291,8 +1291,10 @@ class BufferedRWPair(BufferedIOBase):
|
|||
return self.writer.flush()
|
||||
|
||||
def close(self):
|
||||
self.writer.close()
|
||||
self.reader.close()
|
||||
try:
|
||||
self.writer.close()
|
||||
finally:
|
||||
self.reader.close()
|
||||
|
||||
def isatty(self):
|
||||
return self.reader.isatty() or self.writer.isatty()
|
||||
|
|
|
@ -1649,6 +1649,53 @@ class BufferedRWPairTest(unittest.TestCase):
|
|||
pair.close()
|
||||
self.assertTrue(pair.closed)
|
||||
|
||||
def test_reader_close_error_on_close(self):
|
||||
def reader_close():
|
||||
reader_non_existing
|
||||
reader = self.MockRawIO()
|
||||
reader.close = reader_close
|
||||
writer = self.MockRawIO()
|
||||
pair = self.tp(reader, writer)
|
||||
with self.assertRaises(NameError) as err:
|
||||
pair.close()
|
||||
self.assertIn('reader_non_existing', str(err.exception))
|
||||
self.assertTrue(pair.closed)
|
||||
self.assertFalse(reader.closed)
|
||||
self.assertTrue(writer.closed)
|
||||
|
||||
def test_writer_close_error_on_close(self):
|
||||
def writer_close():
|
||||
writer_non_existing
|
||||
reader = self.MockRawIO()
|
||||
writer = self.MockRawIO()
|
||||
writer.close = writer_close
|
||||
pair = self.tp(reader, writer)
|
||||
with self.assertRaises(NameError) as err:
|
||||
pair.close()
|
||||
self.assertIn('writer_non_existing', str(err.exception))
|
||||
self.assertFalse(pair.closed)
|
||||
self.assertTrue(reader.closed)
|
||||
self.assertFalse(writer.closed)
|
||||
|
||||
def test_reader_writer_close_error_on_close(self):
|
||||
def reader_close():
|
||||
reader_non_existing
|
||||
def writer_close():
|
||||
writer_non_existing
|
||||
reader = self.MockRawIO()
|
||||
reader.close = reader_close
|
||||
writer = self.MockRawIO()
|
||||
writer.close = writer_close
|
||||
pair = self.tp(reader, writer)
|
||||
with self.assertRaises(NameError) as err:
|
||||
pair.close()
|
||||
self.assertIn('reader_non_existing', str(err.exception))
|
||||
self.assertIsInstance(err.exception.__context__, NameError)
|
||||
self.assertIn('writer_non_existing', str(err.exception.__context__))
|
||||
self.assertFalse(pair.closed)
|
||||
self.assertFalse(reader.closed)
|
||||
self.assertFalse(writer.closed)
|
||||
|
||||
def test_isatty(self):
|
||||
class SelectableIsAtty(MockRawIO):
|
||||
def __init__(self, isatty):
|
||||
|
|
|
@ -30,6 +30,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #21802: The reader in BufferedRWPair now is closed even when closing
|
||||
writer failed in BufferedRWPair.close().
|
||||
|
||||
- Issue #23622: Unknown escapes in regular expressions that consist of ``'\'``
|
||||
and ASCII letter now raise a deprecation warning and will be forbidden in
|
||||
Python 3.6.
|
||||
|
|
|
@ -2413,12 +2413,18 @@ bufferedrwpair_writable(rwpair *self, PyObject *args)
|
|||
static PyObject *
|
||||
bufferedrwpair_close(rwpair *self, PyObject *args)
|
||||
{
|
||||
PyObject *exc = NULL, *val, *tb;
|
||||
PyObject *ret = _forward_call(self->writer, &PyId_close, args);
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
Py_DECREF(ret);
|
||||
|
||||
return _forward_call(self->reader, &PyId_close, args);
|
||||
PyErr_Fetch(&exc, &val, &tb);
|
||||
else
|
||||
Py_DECREF(ret);
|
||||
ret = _forward_call(self->reader, &PyId_close, args);
|
||||
if (exc != NULL) {
|
||||
_PyErr_ChainExceptions(exc, val, tb);
|
||||
Py_CLEAR(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
Loading…
Reference in New Issue