Ignore:
Timestamp:
07/23/17 13:06:08 (7 years ago)
Author:
obi
Message:

update python stuff

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/mediathek/localhoster/lib/python2.7/modulefinder.py

    r40094 r40658  
    11"""Find modules used by a script, using introspection."""
    2 # This module should be kept compatible with Python 2.2, see PEP 291.
    32
    43from __future__ import generators
     
    1413    READ_MODE = "U"  # universal line endings
    1514else:
    16     # remain compatible with Python  < 2.3
     15    # Python < 2.3 compatibility, no longer strictly required
    1716    READ_MODE = "r"
    1817
    19 LOAD_CONST = chr(dis.opname.index('LOAD_CONST'))
    20 IMPORT_NAME = chr(dis.opname.index('IMPORT_NAME'))
    21 STORE_NAME = chr(dis.opname.index('STORE_NAME'))
    22 STORE_GLOBAL = chr(dis.opname.index('STORE_GLOBAL'))
    23 STORE_OPS = [STORE_NAME, STORE_GLOBAL]
    24 HAVE_ARGUMENT = chr(dis.HAVE_ARGUMENT)
     18LOAD_CONST = dis.opmap['LOAD_CONST']
     19IMPORT_NAME = dis.opmap['IMPORT_NAME']
     20STORE_NAME = dis.opmap['STORE_NAME']
     21STORE_GLOBAL = dis.opmap['STORE_GLOBAL']
     22STORE_OPS = STORE_NAME, STORE_GLOBAL
     23HAVE_ARGUMENT = dis.HAVE_ARGUMENT
     24EXTENDED_ARG = dis.EXTENDED_ARG
     25
     26def _unpack_opargs(code):
     27    # enumerate() is not an option, since we sometimes process
     28    # multiple elements on a single pass through the loop
     29    extended_arg = 0
     30    n = len(code)
     31    i = 0
     32    while i < n:
     33        op = ord(code[i])
     34        offset = i
     35        i = i+1
     36        arg = None
     37        if op >= HAVE_ARGUMENT:
     38            arg = ord(code[i]) + ord(code[i+1])*256 + extended_arg
     39            extended_arg = 0
     40            i = i+2
     41            if op == EXTENDED_ARG:
     42                extended_arg = arg*65536
     43        yield (offset, op, arg)
    2544
    2645# Modulefinder does a good job at simulating Python's, but it can not
     
    345364        names = co.co_names
    346365        consts = co.co_consts
    347         while code:
    348             c = code[0]
     366        opargs = [(op, arg) for _, op, arg in _unpack_opargs(code)
     367                  if op != EXTENDED_ARG]
     368        for i, (op, oparg) in enumerate(opargs):
    349369            if c in STORE_OPS:
    350                 oparg, = unpack('<H', code[1:3])
    351370                yield "store", (names[oparg],)
    352                 code = code[3:]
    353371                continue
    354             if c == LOAD_CONST and code[3] == IMPORT_NAME:
    355                 oparg_1, oparg_2 = unpack('<xHxH', code[:6])
    356                 yield "import", (consts[oparg_1], names[oparg_2])
    357                 code = code[6:]
     372            if (op == IMPORT_NAME and i >= 1
     373                    and opargs[i-1][0] == LOAD_CONST):
     374                fromlist = consts[opargs[i-1][1]]
     375                yield "import", (fromlist, names[oparg])
    358376                continue
    359             if c >= HAVE_ARGUMENT:
    360                 code = code[3:]
    361             else:
    362                 code = code[1:]
    363 
    364     def scan_opcodes_25(self, co,
    365                      unpack = struct.unpack):
     377
     378    def scan_opcodes_25(self, co):
    366379        # Scan the code, and yield 'interesting' opcode combinations
    367         # Python 2.5 version (has absolute and relative imports)
    368380        code = co.co_code
    369381        names = co.co_names
    370382        consts = co.co_consts
    371         LOAD_LOAD_AND_IMPORT = LOAD_CONST + LOAD_CONST + IMPORT_NAME
    372         while code:
    373             c = code[0]
    374             if c in STORE_OPS:
    375                 oparg, = unpack('<H', code[1:3])
     383        opargs = [(op, arg) for _, op, arg in _unpack_opargs(code)
     384                  if op != EXTENDED_ARG]
     385        for i, (op, oparg) in enumerate(opargs):
     386            if op in STORE_OPS:
    376387                yield "store", (names[oparg],)
    377                 code = code[3:]
    378388                continue
    379             if code[:9:3] == LOAD_LOAD_AND_IMPORT:
    380                 oparg_1, oparg_2, oparg_3 = unpack('<xHxHxH', code[:9])
    381                 level = consts[oparg_1]
     389            if (op == IMPORT_NAME and i >= 2
     390                    and opargs[i-1][0] == opargs[i-2][0] == LOAD_CONST):
     391                level = consts[opargs[i-2][1]]
     392                fromlist = consts[opargs[i-1][1]]
    382393                if level == -1: # normal import
    383                     yield "import", (consts[oparg_2], names[oparg_3])
     394                    yield "import", (fromlist, names[oparg])
    384395                elif level == 0: # absolute import
    385                     yield "absolute_import", (consts[oparg_2], names[oparg_3])
     396                    yield "absolute_import", (fromlist, names[oparg])
    386397                else: # relative import
    387                     yield "relative_import", (level, consts[oparg_2], names[oparg_3])
    388                 code = code[9:]
     398                    yield "relative_import", (level, fromlist, names[oparg])
    389399                continue
    390             if c >= HAVE_ARGUMENT:
    391                 code = code[3:]
    392             else:
    393                 code = code[1:]
    394400
    395401    def scan_code(self, co, m):
Note: See TracChangeset for help on using the changeset viewer.