Cache source by both module name and filename. Fixes #101

This commit is contained in:
Alex Hall 2019-05-08 12:58:06 +02:00 committed by Ram Rachum
parent 21f64e753b
commit 313b22f30c
1 changed files with 10 additions and 18 deletions

View File

@ -29,24 +29,19 @@ class UnavailableSource(object):
return u'SOURCE IS UNAVAILABLE'
source_cache_by_module_name = {}
source_cache_by_file_name = {}
source_cache = {}
def get_source_from_frame(frame):
module_name = (frame.f_globals or {}).get('__name__') or ''
if module_name:
try:
return source_cache_by_module_name[module_name]
except KeyError:
pass
globs = frame.f_globals or {}
module_name = globs.get('__name__')
file_name = frame.f_code.co_filename
if file_name:
try:
return source_cache_by_file_name[file_name]
except KeyError:
pass
loader = (frame.f_globals or {}).get('__loader__')
cache_key = (module_name, file_name)
try:
return source_cache[cache_key]
except KeyError:
pass
loader = globs.get('__loader__')
source = None
if hasattr(loader, 'get_source'):
@ -92,10 +87,7 @@ def get_source_from_frame(frame):
source = [six.text_type(sline, encoding, 'replace') for sline in
source]
if module_name:
source_cache_by_module_name[module_name] = source
if file_name:
source_cache_by_file_name[file_name] = source
source_cache[cache_key] = source
return source