|
35 | 35 | contexts. |
36 | 36 | """ |
37 | 37 |
|
38 | | -import dis |
39 | 38 | import errno |
40 | 39 | import inspect |
41 | | -import itertools |
42 | 40 | import logging |
43 | 41 | import os |
44 | 42 | import pkgutil |
@@ -83,21 +81,18 @@ def _find_loader(fullname): |
83 | 81 |
|
84 | 82 | import mitogen |
85 | 83 | import mitogen.core |
| 84 | +import mitogen.imports |
86 | 85 | import mitogen.minify |
87 | 86 | import mitogen.parent |
88 | 87 |
|
89 | 88 | from mitogen.core import any |
90 | 89 | from mitogen.core import b |
91 | 90 | from mitogen.core import IOLOG |
92 | 91 | from mitogen.core import LOG |
93 | | -from mitogen.core import next |
94 | 92 | from mitogen.core import str_partition |
95 | 93 | from mitogen.core import str_rpartition |
96 | 94 | from mitogen.core import to_text |
97 | 95 |
|
98 | | -imap = getattr(itertools, 'imap', map) |
99 | | -izip = getattr(itertools, 'izip', zip) |
100 | | - |
101 | 96 | RLOG = logging.getLogger('mitogen.ctx') |
102 | 97 |
|
103 | 98 |
|
@@ -253,80 +248,6 @@ def _get_core_source(): |
253 | 248 | mitogen.parent._get_core_source = _get_core_source |
254 | 249 |
|
255 | 250 |
|
256 | | -LOAD_CONST = dis.opname.index('LOAD_CONST') |
257 | | -IMPORT_NAME = dis.opname.index('IMPORT_NAME') |
258 | | - |
259 | | - |
260 | | -def _getarg(nextb, c): |
261 | | - if c >= dis.HAVE_ARGUMENT: |
262 | | - return nextb() | (nextb() << 8) |
263 | | - |
264 | | - |
265 | | -if sys.version_info < (3, 0): |
266 | | - def iter_opcodes(co): |
267 | | - # Yield `(op, oparg)` tuples from the code object `co`. |
268 | | - ordit = imap(ord, co.co_code) |
269 | | - nextb = ordit.next |
270 | | - return ((c, _getarg(nextb, c)) for c in ordit) |
271 | | -elif sys.version_info < (3, 6): |
272 | | - def iter_opcodes(co): |
273 | | - # Yield `(op, oparg)` tuples from the code object `co`. |
274 | | - ordit = iter(co.co_code) |
275 | | - nextb = ordit.__next__ |
276 | | - return ((c, _getarg(nextb, c)) for c in ordit) |
277 | | -else: |
278 | | - def iter_opcodes(co): |
279 | | - # Yield `(op, oparg)` tuples from the code object `co`. |
280 | | - ordit = iter(co.co_code) |
281 | | - nextb = ordit.__next__ |
282 | | - # https://github.com/abarnert/cpython/blob/c095a32f/Python/wordcode.md |
283 | | - return ((c, nextb()) for c in ordit) |
284 | | - |
285 | | - |
286 | | -def scan_code_imports(co): |
287 | | - """ |
288 | | - Given a code object `co`, scan its bytecode yielding any ``IMPORT_NAME`` |
289 | | - and associated prior ``LOAD_CONST`` instructions representing an `Import` |
290 | | - statement or `ImportFrom` statement. |
291 | | -
|
292 | | - :return: |
293 | | - Generator producing `(level, modname, namelist)` tuples, where: |
294 | | -
|
295 | | - * `level`: -1 for normal import, 0, for absolute import, and >0 for |
296 | | - relative import. |
297 | | - * `modname`: Name of module to import, or from where `namelist` names |
298 | | - are imported. |
299 | | - * `namelist`: for `ImportFrom`, the list of names to be imported from |
300 | | - `modname`. |
301 | | - """ |
302 | | - opit = iter_opcodes(co) |
303 | | - opit, opit2, opit3 = itertools.tee(opit, 3) |
304 | | - |
305 | | - try: |
306 | | - next(opit2) |
307 | | - next(opit3) |
308 | | - next(opit3) |
309 | | - except StopIteration: |
310 | | - return |
311 | | - |
312 | | - if sys.version_info >= (2, 5): |
313 | | - for oparg1, oparg2, (op3, arg3) in izip(opit, opit2, opit3): |
314 | | - if op3 == IMPORT_NAME: |
315 | | - op2, arg2 = oparg2 |
316 | | - op1, arg1 = oparg1 |
317 | | - if op1 == op2 == LOAD_CONST: |
318 | | - yield (co.co_consts[arg1], |
319 | | - co.co_names[arg3], |
320 | | - co.co_consts[arg2] or ()) |
321 | | - else: |
322 | | - # Python 2.4 did not yet have 'level', so stack format differs. |
323 | | - for oparg1, (op2, arg2) in izip(opit, opit2): |
324 | | - if op2 == IMPORT_NAME: |
325 | | - op1, arg1 = oparg1 |
326 | | - if op1 == LOAD_CONST: |
327 | | - yield (-1, co.co_names[arg2], co.co_consts[arg1] or ()) |
328 | | - |
329 | | - |
330 | 251 | class ThreadWatcher(object): |
331 | 252 | """ |
332 | 253 | Manage threads that wait for another thread to shut down, before invoking |
@@ -1029,7 +950,7 @@ def find_related_imports(self, fullname): |
1029 | 950 | maybe_names = list(self.generate_parent_names(fullname)) |
1030 | 951 |
|
1031 | 952 | co = compile(src, modpath, 'exec') |
1032 | | - for level, modname, namelist in scan_code_imports(co): |
| 953 | + for level, modname, namelist in mitogen.imports.codeobj_imports(co): |
1033 | 954 | if level == -1: |
1034 | 955 | modnames = [modname, '%s.%s' % (fullname, modname)] |
1035 | 956 | else: |
|
0 commit comments