Issue #15343: A lot more than just unicode decoding can go wrong when retrieving a source file

This commit is contained in:
Nick Coghlan 2012-07-15 22:12:14 +10:00
parent 8ecf50474c
commit 2824cb507d
3 changed files with 2157 additions and 2129 deletions

View File

@ -845,12 +845,21 @@ class SourceLoader(_LoaderBasics):
path = self.get_filename(fullname)
try:
source_bytes = self.get_data(path)
except IOError:
except IOError as exc:
raise ImportError("source not available through get_data()",
name=fullname)
encoding = tokenize.detect_encoding(_io.BytesIO(source_bytes).readline)
name=fullname) from exc
readsource = _io.BytesIO(source_bytes).readline
try:
encoding = tokenize.detect_encoding(readsource)
except SyntaxError as exc:
raise ImportError("Failed to detect encoding",
name=fullname) from exc
newline_decoder = _io.IncrementalNewlineDecoder(None, True)
return newline_decoder.decode(source_bytes.decode(encoding[0]))
try:
return newline_decoder.decode(source_bytes.decode(encoding[0]))
except UnicodeDecodeError as exc:
raise ImportError("Failed to decode source file",
name=fullname) from exc
def get_code(self, fullname):
"""Concrete implementation of InspectLoader.get_code.

View File

@ -2048,7 +2048,7 @@ class ModuleScanner:
if hasattr(loader, 'get_source'):
try:
source = loader.get_source(modname)
except UnicodeDecodeError:
except Exception:
if onerror:
onerror(modname)
continue

File diff suppressed because it is too large Load Diff