[Python-checkins] cpython (merge 3.5 -> default): Issue #15068: Avoid creating a reference loop in fileinput.

serhiy.storchaka python-checkins at python.org
Tue Mar 8 16:36:48 EST 2016


https://hg.python.org/cpython/rev/27c9849ba5f3
changeset:   100476:27c9849ba5f3
parent:      100473:a587a40dc010
parent:      100475:a0de41b46aa6
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Tue Mar 08 23:36:25 2016 +0200
summary:
  Issue #15068: Avoid creating a reference loop in fileinput.

files:
  Lib/fileinput.py |  28 +++++++++++++++-------------
  1 files changed, 15 insertions(+), 13 deletions(-)


diff --git a/Lib/fileinput.py b/Lib/fileinput.py
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -209,7 +209,6 @@
         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
@@ -247,15 +246,15 @@
         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():
@@ -279,7 +278,10 @@
         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()
@@ -303,7 +305,7 @@
             self.nextfile()
             # repeat with next file
 
-    def _start_readline(self):
+    def _readline(self):
         if not self._files:
             if 'b' in self._mode:
                 return b''
@@ -358,7 +360,7 @@
                     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):

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list