summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python/src/Lib/linecache.py
diff options
context:
space:
mode:
authorthegeorg <[email protected]>2024-03-15 23:28:02 +0300
committerthegeorg <[email protected]>2024-03-15 23:38:24 +0300
commit6635e51dd2fc4c8fbc3e510cd31c9c9102b7cfda (patch)
treed51d048d3eb5d7a24ec6e4302b589513a3b97de3 /contrib/tools/python/src/Lib/linecache.py
parente894914751eea93bb23102a533c8d481b80c2560 (diff)
Store generated list of frozen modules for contrib/tools/python
a94357bf8071b16879eeabac1f52f54e278c03ed
Diffstat (limited to 'contrib/tools/python/src/Lib/linecache.py')
-rw-r--r--contrib/tools/python/src/Lib/linecache.py151
1 files changed, 0 insertions, 151 deletions
diff --git a/contrib/tools/python/src/Lib/linecache.py b/contrib/tools/python/src/Lib/linecache.py
deleted file mode 100644
index cadbbf60e3b..00000000000
--- a/contrib/tools/python/src/Lib/linecache.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""Cache lines from files.
-
-This is intended to read lines from modules imported -- hence if a filename
-is not found, it will look down the module search path for a file by
-that name.
-"""
-
-import sys
-import os
-
-__all__ = ["getline", "clearcache", "checkcache"]
-
-def getline(filename, lineno, module_globals=None):
- lines = getlines(filename, module_globals)
- if 1 <= lineno <= len(lines):
- return lines[lineno-1]
- else:
- return ''
-
-
-# The cache
-
-cache = {} # The cache
-
-
-def clearcache():
- """Clear the cache entirely."""
-
- global cache
- cache = {}
-
-
-def getlines(filename, module_globals=None):
- """Get the lines for a file from the cache.
- Update the cache if it doesn't contain an entry for this file already."""
-
- if filename in cache:
- return cache[filename][2]
-
- try:
- return updatecache(filename, module_globals)
- except MemoryError:
- clearcache()
- return []
-
-
-def checkcache(filename=None):
- """Discard cache entries that are out of date.
- (This is not checked upon each call!)"""
-
- if filename is None:
- filenames = cache.keys()
- else:
- if filename in cache:
- filenames = [filename]
- else:
- return
-
- for filename in filenames:
- size, mtime, lines, fullname = cache[filename]
- if mtime is None:
- continue # no-op for files loaded via a __loader__
- try:
- stat = os.stat(fullname)
- except os.error:
- del cache[filename]
- continue
- if size != stat.st_size or mtime != stat.st_mtime:
- del cache[filename]
-
-
-def updatecache(filename, module_globals=None):
- """Update a cache entry and return its list of lines.
- If something's wrong, print a message, discard the cache entry,
- and return an empty list."""
-
- if filename in cache:
- del cache[filename]
- if not filename or (filename.startswith('<') and filename.endswith('>')):
- return []
-
- if not os.path.isabs(filename):
- # mod.__loader__.get_source works, but when mod fails to import
- # mod.__loader__ and other mod globals are already None.
- import __res
- key = __res.importer.file_source(filename)
- if key:
- data = __res.find(key)
- assert data is not None, filename
- lines = [line + '\n' for line in data.splitlines()]
- cache[filename] = (len(data), None, lines, filename)
- return cache[filename][2]
-
- fullname = filename
- try:
- stat = os.stat(fullname)
- except OSError:
- basename = filename
-
- # Try for a __loader__, if available
- if module_globals and '__loader__' in module_globals:
- name = module_globals.get('__name__')
- loader = module_globals['__loader__']
- get_source = getattr(loader, 'get_source', None)
-
- if name and get_source:
- try:
- data = get_source(name)
- except (ImportError, IOError):
- pass
- else:
- if data is None:
- # No luck, the PEP302 loader cannot find the source
- # for this module.
- return []
- cache[filename] = (
- len(data), None,
- [line+'\n' for line in data.splitlines()], fullname
- )
- return cache[filename][2]
-
- # Try looking through the module search path, which is only useful
- # when handling a relative filename.
- if os.path.isabs(filename):
- return []
-
- for dirname in sys.path:
- # When using imputil, sys.path may contain things other than
- # strings; ignore them when it happens.
- try:
- fullname = os.path.join(dirname, basename)
- except (TypeError, AttributeError):
- # Not sufficiently string-like to do anything useful with.
- continue
- try:
- stat = os.stat(fullname)
- break
- except os.error:
- pass
- else:
- return []
- try:
- with open(fullname, 'rU') as fp:
- lines = fp.readlines()
- except IOError:
- return []
- if lines and not lines[-1].endswith('\n'):
- lines[-1] += '\n'
- size, mtime = stat.st_size, stat.st_mtime
- cache[filename] = size, mtime, lines, fullname
- return lines