summaryrefslogtreecommitdiff
path: root/Lib/fileinput.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-03-08 23:35:35 +0200
committerSerhiy Storchaka <storchaka@gmail.com>2016-03-08 23:35:35 +0200
commit0554d83f0ff7e9da5c021b57820b26a330c09129 (patch)
tree8eb9df1f6380e67119e38782fcdef2cb0f6aa0be /Lib/fileinput.py
parent4a6f4825f4d4de76e73ca15d413089078970f4a2 (diff)
downloadcpython-git-0554d83f0ff7e9da5c021b57820b26a330c09129.tar.gz
Issue #15068: Avoid creating a reference loop in fileinput.
Diffstat (limited to 'Lib/fileinput.py')
-rw-r--r--Lib/fileinput.py28
1 files changed, 15 insertions, 13 deletions
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 9f14762db0..d2b52066d9 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -207,7 +207,6 @@ class FileInput:
self._startlineno = 0
self._filelineno = 0
self._file = None
- self._readline = self._start_readline
self._isstdin = False
self._backupfilename = None
# restrict mode argument to reading modes
@@ -245,15 +244,15 @@ class FileInput:
return self
def __next__(self):
- line = self._readline()
- if line:
- self._filelineno += 1
- return line
- if not self._file:
- raise StopIteration
- self.nextfile()
- # Recursive call
- return self.__next__()
+ while True:
+ line = self._readline()
+ if line:
+ self._filelineno += 1
+ return line
+ if not self._file:
+ raise StopIteration
+ self.nextfile()
+ # repeat with next file
def __getitem__(self, i):
if i != self.lineno():
@@ -277,7 +276,10 @@ class FileInput:
finally:
file = self._file
self._file = None
- self._readline = self._start_readline
+ try:
+ del self._readline # restore FileInput._readline
+ except AttributeError:
+ pass
try:
if file and not self._isstdin:
file.close()
@@ -301,7 +303,7 @@ class FileInput:
self.nextfile()
# repeat with next file
- def _start_readline(self):
+ def _readline(self):
if not self._files:
if 'b' in self._mode:
return b''
@@ -356,7 +358,7 @@ class FileInput:
self._file = self._openhook(self._filename, self._mode)
else:
self._file = open(self._filename, self._mode)
- self._readline = self._file.readline
+ self._readline = self._file.readline # hide FileInput._readline
return self._readline()
def filename(self):