Kaydet (Commit) 2c311f93 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #15068: Avoid creating a reference loop in fileinput.

üst b6d633ce
...@@ -207,7 +207,6 @@ class FileInput: ...@@ -207,7 +207,6 @@ class FileInput:
self._startlineno = 0 self._startlineno = 0
self._filelineno = 0 self._filelineno = 0
self._file = None self._file = None
self._readline = self._start_readline
self._isstdin = False self._isstdin = False
self._backupfilename = None self._backupfilename = None
# restrict mode argument to reading modes # restrict mode argument to reading modes
...@@ -234,6 +233,7 @@ class FileInput: ...@@ -234,6 +233,7 @@ class FileInput:
return self return self
def next(self): def next(self):
while 1:
line = self._readline() line = self._readline()
if line: if line:
self._filelineno += 1 self._filelineno += 1
...@@ -241,8 +241,7 @@ class FileInput: ...@@ -241,8 +241,7 @@ class FileInput:
if not self._file: if not self._file:
raise StopIteration raise StopIteration
self.nextfile() self.nextfile()
# Recursive call # repeat with next file
return self.next()
def __getitem__(self, i): def __getitem__(self, i):
if i != self.lineno(): if i != self.lineno():
...@@ -266,7 +265,10 @@ class FileInput: ...@@ -266,7 +265,10 @@ class FileInput:
finally: finally:
file = self._file file = self._file
self._file = None self._file = None
self._readline = self._start_readline try:
del self._readline # restore FileInput._readline
except AttributeError:
pass
try: try:
if file and not self._isstdin: if file and not self._isstdin:
file.close() file.close()
...@@ -290,7 +292,7 @@ class FileInput: ...@@ -290,7 +292,7 @@ class FileInput:
self.nextfile() self.nextfile()
# repeat with next file # repeat with next file
def _start_readline(self): def _readline(self):
if not self._files: if not self._files:
return "" return ""
self._filename = self._files[0] self._filename = self._files[0]
...@@ -336,7 +338,7 @@ class FileInput: ...@@ -336,7 +338,7 @@ class FileInput:
else: else:
self._file = open(self._filename, self._mode) self._file = open(self._filename, self._mode)
self._readline = self._file.readline self._readline = self._file.readline # hide FileInput._readline
return self._readline() return self._readline()
def filename(self): def filename(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment