issue #477: explicitly populate Py2.4 linecache from Importer.

This commit is contained in:
David Wilson 2019-01-23 12:44:08 +00:00
parent 97a96f5dd8
commit 3afd667136
1 changed files with 24 additions and 1 deletions

View File

@ -37,6 +37,7 @@ import encodings.latin_1
import errno
import fcntl
import itertools
import linecache
import logging
import pickle as py_pickle
import os
@ -128,6 +129,7 @@ except NameError:
BaseException = Exception
IS_WSL = 'Microsoft' in os.uname()[2]
PY24 = sys.version_info < (2, 5)
PY3 = sys.version_info > (3,)
if PY3:
b = str.encode
@ -1091,15 +1093,31 @@ class Importer(object):
self._callbacks = {}
self._cache = {}
if core_src:
self._update_linecache('x/mitogen/core.py', core_src)
self._cache['mitogen.core'] = (
'mitogen.core',
None,
'mitogen/core.py',
'x/mitogen/core.py',
zlib.compress(core_src, 9),
[],
)
self._install_handler(router)
def _update_linecache(self, path, data):
"""
The Python 2.4 linecache module, used to fetch source code for
tracebacks and :func:`inspect.getsource`, does not support PEP-302,
meaning it needs extra help to for Mitogen-loaded modules. Directly
populate its cache if a loaded module belongs to the Mitogen package.
"""
if PY24 and 'mitogen' in path:
linecache.cache[path] = (
len(data),
0.0,
data.splitlines(),
path,
)
def _install_handler(self, router):
router.add_handler(
fn=self._on_load_module,
@ -1214,6 +1232,11 @@ class Importer(object):
self._lock.acquire()
try:
self._cache[fullname] = tup
if tup[2] is not None and PY24:
self._update_linecache(
path='master:' + tup[2],
data=zlib.decompress(tup[3])
)
callbacks = self._callbacks.pop(fullname, [])
finally:
self._lock.release()