summaryrefslogtreecommitdiffstats
path: root/Lib/_pyio.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-05-27 23:44:21 (GMT)
committerGitHub <noreply@github.com>2019-05-27 23:44:21 (GMT)
commita3568417c49f36860393075b21c93996a5f6799b (patch)
tree14c6fba772dcbbb737a9bad981640613c757efbd /Lib/_pyio.py
parentdf9b032f47e4edaf306d95449370e565ee470018 (diff)
downloadcpython-a3568417c49f36860393075b21c93996a5f6799b.zip
cpython-a3568417c49f36860393075b21c93996a5f6799b.tar.gz
cpython-a3568417c49f36860393075b21c93996a5f6799b.tar.bz2
bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601)
Fix destructor _pyio.BytesIO and _pyio.TextIOWrapper: initialize their _buffer attribute as soon as possible (in the class body), because it's used by __del__() which calls close().
Diffstat (limited to 'Lib/_pyio.py')
-rw-r--r--Lib/_pyio.py11
1 files changed, 10 insertions, 1 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 5baca4d..43c2434 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -873,6 +873,10 @@ class BytesIO(BufferedIOBase):
"""Buffered I/O implementation using an in-memory bytes buffer."""
+ # Initialize _buffer as soon as possible since it's used by __del__()
+ # which calls close()
+ _buffer = None
+
def __init__(self, initial_bytes=None):
buf = bytearray()
if initial_bytes is not None:
@@ -900,7 +904,8 @@ class BytesIO(BufferedIOBase):
return memoryview(self._buffer)
def close(self):
- self._buffer.clear()
+ if self._buffer is not None:
+ self._buffer.clear()
super().close()
def read(self, size=-1):
@@ -1970,6 +1975,10 @@ class TextIOWrapper(TextIOBase):
_CHUNK_SIZE = 2048
+ # Initialize _buffer as soon as possible since it's used by __del__()
+ # which calls close()
+ _buffer = None
+
# The write_through argument has no effect here since this
# implementation always writes through. The argument is present only
# so that the signature can match the signature of the C version.