Update linecache from v3.14.2

This commit is contained in:
CPython Developers
2026-01-23 22:24:39 +09:00
committed by Jeong, YunWon
parent ac2729511f
commit dbbd921a53
2 changed files with 35 additions and 2 deletions

24
Lib/linecache.py vendored
View File

@@ -63,6 +63,16 @@ def _getlines_from_code(code):
return []
def _source_unavailable(filename):
"""Return True if the source code is unavailable for such file name."""
return (
not filename
or (filename.startswith('<')
and filename.endswith('>')
and not filename.startswith('<frozen '))
)
def checkcache(filename=None):
"""Discard cache entries that are out of date.
(This is not checked upon each call!)"""
@@ -118,10 +128,20 @@ def updatecache(filename, module_globals=None):
if filename in cache:
if len(cache[filename]) != 1:
cache.pop(filename, None)
if not filename or (filename.startswith('<') and filename.endswith('>')):
if _source_unavailable(filename):
return []
fullname = filename
if filename.startswith('<frozen '):
# This is a frozen module, so we need to use the filename
# from the module globals.
if module_globals is None:
return []
fullname = module_globals.get('__file__')
if fullname is None:
return []
else:
fullname = filename
try:
stat = os.stat(fullname)
except OSError:

View File

@@ -281,6 +281,19 @@ class LineCacheTests(unittest.TestCase):
self.assertEqual(linecache.getlines(filename, module_globals),
['source for x.y.z\n'])
def test_frozen(self):
filename = '<frozen fakemodule>'
module_globals = {'__file__': FILENAME}
empty = linecache.getlines(filename)
self.assertEqual(empty, [])
lines = linecache.getlines(filename, module_globals)
self.assertGreater(len(lines), 0)
lines_cached = linecache.getlines(filename)
self.assertEqual(lines, lines_cached)
linecache.clearcache()
empty = linecache.getlines(filename)
self.assertEqual(empty, [])
def test_invalid_names(self):
for name, desc in [
('\x00', 'NUL bytes filename'),