changeset: 100476:27c9849ba5f3 parent: 100473:a587a40dc010 parent: 100475:a0de41b46aa6 user: Serhiy Storchaka date: Tue Mar 08 23:36:25 2016 +0200 files: Lib/fileinput.py description: Issue #15068: Avoid creating a reference loop in fileinput. diff -r a587a40dc010 -r 27c9849ba5f3 Lib/fileinput.py --- a/Lib/fileinput.py Tue Mar 08 13:10:46 2016 -0800 +++ b/Lib/fileinput.py Tue Mar 08 23:36:25 2016 +0200 @@ -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):