summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-06-11 00:49:06 (GMT)
committerGitHub <noreply@github.com>2019-06-11 00:49:06 (GMT)
commit4f6f7c5a611905fb6b81671547f268c226bc646a (patch)
treed5c62b12768c6450f7537fb28a9b87e1bee6f9ea
parent8a8b59c9794674b50b2242698c29038034f4864c (diff)
downloadcpython-4f6f7c5a611905fb6b81671547f268c226bc646a.zip
cpython-4f6f7c5a611905fb6b81671547f268c226bc646a.tar.gz
cpython-4f6f7c5a611905fb6b81671547f268c226bc646a.tar.bz2
bpo-18748: Fix _pyio.IOBase destructor (closed case) (GH-13952)
_pyio.IOBase destructor now does nothing if getting the closed attribute fails to better mimick _io.IOBase finalizer.
-rw-r--r--Lib/_pyio.py10
-rw-r--r--Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst2
2 files changed, 12 insertions, 0 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 43c2434..0b6493b 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -405,6 +405,16 @@ class IOBase(metaclass=abc.ABCMeta):
def __del__(self):
"""Destructor. Calls close()."""
+ try:
+ closed = self.closed
+ except Exception:
+ # If getting closed fails, then the object is probably
+ # in an unusable state, so ignore.
+ return
+
+ if closed:
+ return
+
if _IOBASE_EMITS_UNRAISABLE:
self.close()
else:
diff --git a/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst
new file mode 100644
index 0000000..295ddeb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst
@@ -0,0 +1,2 @@
+:class:`_pyio.IOBase` destructor now does nothing if getting the ``closed``
+attribute fails to better mimick :class:`_io.IOBase` finalizer.