Skip to content

Commit 86299d7

Browse files
committed
Implement None-cache as LRU
Constrain size of cache to avoid endless growth edge case.
1 parent 582b4a4 commit 86299d7

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

Lib/inspect.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -974,7 +974,22 @@ def getabsfile(object, _filename=None):
974974

975975
modulesbyfile = {}
976976
_filesbymodname = {}
977-
_moduleless = defaultdict(set)
977+
_moduleless = OrderedDict()
978+
_NONE_CACHE_SIZE = 1024
979+
980+
def _is_cached_none(code):
981+
if hashcode := _moduleless.get(id(code)):
982+
if hash(code) == hashcode:
983+
_moduleless.move_to_end(id(code), last=True)
984+
return True
985+
return False
986+
987+
def _cache_none(code):
988+
if not code:
989+
return
990+
_moduleless[id(code)] = hash(code)
991+
if len(_moduleless) > _NONE_CACHE_SIZE:
992+
_moduleless.popitem(last=False)
978993

979994
def getmodule(object, _filename=None):
980995
"""Return the module an object was defined in, or None if not found."""
@@ -987,19 +1002,16 @@ def getmodule(object, _filename=None):
9871002
return sys.modules.get(modulesbyfile[_filename])
9881003
# Check for moduleless objects
9891004
code = _getcode(object)
990-
if hashes := _moduleless.get(id(code)):
991-
if hash(code) in hashes:
992-
return None
1005+
if _is_cached_none(code):
1006+
return None
9931007
# Try the cache again with the absolute file name
9941008
try:
9951009
file = getabsfile(object, _filename)
9961010
except (TypeError, FileNotFoundError):
997-
if code:
998-
_moduleless[id(code)].add(hash(code))
1011+
_cache_none(code)
1012+
return None
1013+
if _is_cached_none(code):
9991014
return None
1000-
if hashes := _moduleless.get(id(code)):
1001-
if hash(code) in hashes:
1002-
return None
10031015
if file in modulesbyfile:
10041016
return sys.modules.get(modulesbyfile[file])
10051017
_update_module_file_name_cache()
@@ -1008,8 +1020,7 @@ def getmodule(object, _filename=None):
10081020
# Check the main module
10091021
main = sys.modules['__main__']
10101022
if not hasattr(object, '__name__'):
1011-
if code:
1012-
_moduleless[id(code)].add(hash(code))
1023+
_cache_none(code)
10131024
return None
10141025
if hasattr(main, object.__name__):
10151026
mainobject = getattr(main, object.__name__)
@@ -1021,8 +1032,7 @@ def getmodule(object, _filename=None):
10211032
builtinobject = getattr(builtin, object.__name__)
10221033
if builtinobject is object:
10231034
return builtin
1024-
if code:
1025-
_moduleless[id(code)].add(hash(code))
1035+
_cache_none(code)
10261036
return None
10271037

10281038
def _update_module_file_name_cache():

0 commit comments

Comments
 (0)