/
opt
/
alt
/
python35
/
lib64
/
python3.5
/
/opt/alt/python35/lib64/python3.5
mkdir
upload
Name
Size
Mode
Actions
asyncio/
-
0755
rm
collections/
-
0755
rm
concurrent/
-
0755
rm
config-3.5m/
-
0755
rm
ctypes/
-
0755
rm
curses/
-
0755
rm
dbm/
-
0755
rm
distutils/
-
0755
rm
email/
-
0755
rm
encodings/
-
0755
rm
ensurepip/
-
0755
rm
html/
-
0755
rm
http/
-
0755
rm
idlelib/
-
0755
rm
importlib/
-
0755
rm
json/
-
0755
rm
lib-dynload/
-
0755
rm
lib2to3/
-
0755
rm
logging/
-
0755
rm
multiprocessing/
-
0755
rm
plat-linux/
-
0755
rm
pydoc_data/
-
0755
rm
site-packages/
-
0755
rm
sqlite3/
-
0755
rm
test/
-
0755
rm
unittest/
-
0755
rm
urllib/
-
0755
rm
venv/
-
0755
rm
wsgiref/
-
0755
rm
xml/
-
0755
rm
xmlrpc/
-
0755
rm
__pycache__/
-
0755
rm
abc.py
8628
0644
edit
dl
rm
aifc.py
31967
0644
edit
dl
rm
antigravity.py
476
0644
edit
dl
rm
argparse.py
90138
0644
edit
dl
rm
ast.py
12001
0644
edit
dl
rm
asynchat.py
11971
0644
edit
dl
rm
asyncore.py
20104
0644
edit
dl
rm
base64.py
20522
0755
edit
dl
rm
bdb.py
23354
0644
edit
dl
rm
binhex.py
13954
0644
edit
dl
rm
bisect.py
2595
0644
edit
dl
rm
bz2.py
12424
0644
edit
dl
rm
calendar.py
22998
0644
edit
dl
rm
cgi.py
36046
0755
edit
dl
rm
cgitb.py
12023
0644
edit
dl
rm
chunk.py
5425
0644
edit
dl
rm
cmd.py
14860
0644
edit
dl
rm
code.py
10118
0644
edit
dl
rm
codecs.py
36231
0644
edit
dl
rm
codeop.py
5994
0644
edit
dl
rm
colorsys.py
4064
0644
edit
dl
rm
compileall.py
11711
0644
edit
dl
rm
configparser.py
53452
0644
edit
dl
rm
contextlib.py
12451
0644
edit
dl
rm
copy.py
8946
0644
edit
dl
rm
copyreg.py
6833
0644
edit
dl
rm
cProfile.py
5324
0755
edit
dl
rm
crypt.py
1879
0644
edit
dl
rm
csv.py
16128
0644
edit
dl
rm
datetime.py
75899
0644
edit
dl
rm
decimal.py
320
0644
edit
dl
rm
difflib.py
84204
0644
edit
dl
rm
dis.py
17350
0644
edit
dl
rm
doctest.py
104036
0644
edit
dl
rm
dummy_threading.py
2815
0644
edit
dl
rm
enum.py
22226
0644
edit
dl
rm
filecmp.py
9830
0644
edit
dl
rm
fileinput.py
14259
0644
edit
dl
rm
fnmatch.py
3163
0644
edit
dl
rm
formatter.py
15143
0644
edit
dl
rm
fractions.py
24612
0644
edit
dl
rm
ftplib.py
34951
0644
edit
dl
rm
functools.py
28944
0644
edit
dl
rm
genericpath.py
4364
0644
edit
dl
rm
getopt.py
7489
0644
edit
dl
rm
getpass.py
5994
0644
edit
dl
rm
gettext.py
21530
0644
edit
dl
rm
glob.py
5072
0644
edit
dl
rm
gzip.py
20260
0644
edit
dl
rm
hashlib.py
7979
0644
edit
dl
rm
heapq.py
22929
0644
edit
dl
rm
hmac.py
5063
0644
edit
dl
rm
imaplib.py
52183
0644
edit
dl
rm
imghdr.py
3758
0644
edit
dl
rm
imp.py
10676
0644
edit
dl
rm
inspect.py
114199
0644
edit
dl
rm
io.py
3396
0644
edit
dl
rm
ipaddress.py
75733
0644
edit
dl
rm
keyword.py
2222
0755
edit
dl
rm
linecache.py
5312
0644
edit
dl
rm
locale.py
74713
0644
edit
dl
rm
lzma.py
12925
0644
edit
dl
rm
macpath.py
5907
0644
edit
dl
rm
macurl2path.py
2732
0644
edit
dl
rm
mailbox.py
78418
0644
edit
dl
rm
mailcap.py
8104
0644
edit
dl
rm
mimetypes.py
20847
0644
edit
dl
rm
modulefinder.py
23085
0644
edit
dl
rm
netrc.py
5748
0644
edit
dl
rm
nntplib.py
43078
0644
edit
dl
rm
ntpath.py
22793
0644
edit
dl
rm
nturl2path.py
2444
0644
edit
dl
rm
numbers.py
10243
0644
edit
dl
rm
opcode.py
5885
0644
edit
dl
rm
operator.py
10863
0644
edit
dl
rm
optparse.py
60344
0644
edit
dl
rm
os.py
37033
0644
edit
dl
rm
pathlib.py
47001
0644
edit
dl
rm
pdb.py
61149
0755
edit
dl
rm
pickle.py
56176
0644
edit
dl
rm
pickletools.py
91761
0644
edit
dl
rm
pipes.py
8916
0644
edit
dl
rm
pkgutil.py
21355
0644
edit
dl
rm
platform.py
46147
0755
edit
dl
rm
plistlib.py
31810
0644
edit
dl
rm
poplib.py
14717
0644
edit
dl
rm
posixpath.py
14911
0644
edit
dl
rm
pprint.py
20860
0644
edit
dl
rm
profile.py
22032
0755
edit
dl
rm
pstats.py
26564
0644
edit
dl
rm
pty.py
4763
0644
edit
dl
rm
pyclbr.py
13564
0644
edit
dl
rm
pydoc.py
103652
0755
edit
dl
rm
py_compile.py
7181
0644
edit
dl
rm
queue.py
8780
0644
edit
dl
rm
quopri.py
7265
0755
edit
dl
rm
random.py
26463
0644
edit
dl
rm
re.py
15501
0644
edit
dl
rm
reprlib.py
5336
0644
edit
dl
rm
rlcompleter.py
6307
0644
edit
dl
rm
runpy.py
11959
0644
edit
dl
rm
sched.py
6216
0644
edit
dl
rm
selectors.py
19438
0644
edit
dl
rm
shelve.py
8528
0644
edit
dl
rm
shlex.py
11448
0644
edit
dl
rm
shutil.py
40048
0644
edit
dl
rm
signal.py
2123
0644
edit
dl
rm
site.py
21509
0644
edit
dl
rm
smtpd.py
35373
0755
edit
dl
rm
smtplib.py
43635
0755
edit
dl
rm
sndhdr.py
6418
0644
edit
dl
rm
socket.py
27135
0644
edit
dl
rm
socketserver.py
24666
0644
edit
dl
rm
sre_compile.py
18410
0644
edit
dl
rm
sre_constants.py
6821
0644
edit
dl
rm
sre_parse.py
35117
0644
edit
dl
rm
ssl.py
42352
0644
edit
dl
rm
stat.py
5038
0644
edit
dl
rm
statistics.py
19533
0644
edit
dl
rm
string.py
11854
0644
edit
dl
rm
stringprep.py
12917
0644
edit
dl
rm
struct.py
257
0644
edit
dl
rm
subprocess.py
58912
0644
edit
dl
rm
sunau.py
18095
0644
edit
dl
rm
symbol.py
2106
0755
edit
dl
rm
symtable.py
7191
0644
edit
dl
rm
sysconfig.py
24462
0644
edit
dl
rm
tabnanny.py
11414
0755
edit
dl
rm
tarfile.py
93070
0755
edit
dl
rm
telnetlib.py
23016
0644
edit
dl
rm
tempfile.py
26636
0644
edit
dl
rm
textwrap.py
19558
0644
edit
dl
rm
this.py
1003
0644
edit
dl
rm
threading.py
49027
0644
edit
dl
rm
timeit.py
12403
0755
edit
dl
rm
token.py
3075
0644
edit
dl
rm
tokenize.py
27790
0644
edit
dl
rm
trace.py
31553
0755
edit
dl
rm
traceback.py
22175
0644
edit
dl
rm
tracemalloc.py
15641
0644
edit
dl
rm
tty.py
879
0644
edit
dl
rm
types.py
8799
0644
edit
dl
rm
typing.py
80135
0644
edit
dl
rm
uu.py
6766
0755
edit
dl
rm
uuid.py
23261
0644
edit
dl
rm
warnings.py
15850
0644
edit
dl
rm
wave.py
17682
0644
edit
dl
rm
weakref.py
20466
0644
edit
dl
rm
webbrowser.py
21828
0755
edit
dl
rm
xdrlib.py
5913
0644
edit
dl
rm
zipapp.py
7157
0644
edit
dl
rm
zipfile.py
73672
0644
edit
dl
rm
_bootlocale.py
1301
0644
edit
dl
rm
_collections_abc.py
24794
0644
edit
dl
rm
_compat_pickle.py
8556
0644
edit
dl
rm
_compression.py
5340
0644
edit
dl
rm
_dummy_thread.py
5118
0644
edit
dl
rm
_markupbase.py
14598
0644
edit
dl
rm
_osx_support.py
19115
0644
edit
dl
rm
_pydecimal.py
228628
0644
edit
dl
rm
_pyio.py
87968
0644
edit
dl
rm
_sitebuiltins.py
3115
0644
edit
dl
rm
_strptime.py
22185
0644
edit
dl
rm
_sysconfigdata.py
24273
0644
edit
dl
rm
_threading_local.py
7410
0644
edit
dl
rm
_weakrefset.py
5705
0644
edit
dl
rm
__future__.py
4841
0644
edit
dl
rm
__phello__.foo.py
64
0644
edit
dl
rm
Edit:
/opt/alt/python35/lib64/python3.5/dis.py
(17350B)
"""Disassembler of Python byte code into mnemonics.""" import sys import types import collections import io from opcode import * from opcode import __all__ as _opcodes_all __all__ = ["code_info", "dis", "disassemble", "distb", "disco", "findlinestarts", "findlabels", "show_code", "get_instructions", "Instruction", "Bytecode"] + _opcodes_all del _opcodes_all _have_code = (types.MethodType, types.FunctionType, types.CodeType, classmethod, staticmethod, type) def _try_compile(source, name): """Attempts to compile the given source, first as an expression and then as a statement if the first approach fails. Utility function to accept strings in functions that otherwise expect code objects """ try: c = compile(source, name, 'eval') except SyntaxError: c = compile(source, name, 'exec') return c def dis(x=None, *, file=None): """Disassemble classes, methods, functions, generators, or code. With no argument, disassemble the last traceback. """ if x is None: distb(file=file) return if hasattr(x, '__func__'): # Method x = x.__func__ if hasattr(x, '__code__'): # Function x = x.__code__ if hasattr(x, 'gi_code'): # Generator x = x.gi_code if hasattr(x, '__dict__'): # Class or module items = sorted(x.__dict__.items()) for name, x1 in items: if isinstance(x1, _have_code): print("Disassembly of %s:" % name, file=file) try: dis(x1, file=file) except TypeError as msg: print("Sorry:", msg, file=file) print(file=file) elif hasattr(x, 'co_code'): # Code object disassemble(x, file=file) elif isinstance(x, (bytes, bytearray)): # Raw bytecode _disassemble_bytes(x, file=file) elif isinstance(x, str): # Source code _disassemble_str(x, file=file) else: raise TypeError("don't know how to disassemble %s objects" % type(x).__name__) def distb(tb=None, *, file=None): """Disassemble a traceback (default: last traceback).""" if tb is None: try: tb = sys.last_traceback except AttributeError: raise RuntimeError("no last traceback to disassemble") while tb.tb_next: tb = tb.tb_next disassemble(tb.tb_frame.f_code, tb.tb_lasti, file=file) # The inspect module interrogates this dictionary to build its # list of CO_* constants. It is also used by pretty_flags to # turn the co_flags field into a human readable list. COMPILER_FLAG_NAMES = { 1: "OPTIMIZED", 2: "NEWLOCALS", 4: "VARARGS", 8: "VARKEYWORDS", 16: "NESTED", 32: "GENERATOR", 64: "NOFREE", 128: "COROUTINE", 256: "ITERABLE_COROUTINE", } def pretty_flags(flags): """Return pretty representation of code flags.""" names = [] for i in range(32): flag = 1<<i if flags & flag: names.append(COMPILER_FLAG_NAMES.get(flag, hex(flag))) flags ^= flag if not flags: break else: names.append(hex(flags)) return ", ".join(names) def _get_code_object(x): """Helper to handle methods, functions, generators, strings and raw code objects""" if hasattr(x, '__func__'): # Method x = x.__func__ if hasattr(x, '__code__'): # Function x = x.__code__ if hasattr(x, 'gi_code'): # Generator x = x.gi_code if isinstance(x, str): # Source code x = _try_compile(x, "<disassembly>") if hasattr(x, 'co_code'): # Code object return x raise TypeError("don't know how to disassemble %s objects" % type(x).__name__) def code_info(x): """Formatted details of methods, functions, or code.""" return _format_code_info(_get_code_object(x)) def _format_code_info(co): lines = [] lines.append("Name: %s" % co.co_name) lines.append("Filename: %s" % co.co_filename) lines.append("Argument count: %s" % co.co_argcount) lines.append("Kw-only arguments: %s" % co.co_kwonlyargcount) lines.append("Number of locals: %s" % co.co_nlocals) lines.append("Stack size: %s" % co.co_stacksize) lines.append("Flags: %s" % pretty_flags(co.co_flags)) if co.co_consts: lines.append("Constants:") for i_c in enumerate(co.co_consts): lines.append("%4d: %r" % i_c) if co.co_names: lines.append("Names:") for i_n in enumerate(co.co_names): lines.append("%4d: %s" % i_n) if co.co_varnames: lines.append("Variable names:") for i_n in enumerate(co.co_varnames): lines.append("%4d: %s" % i_n) if co.co_freevars: lines.append("Free variables:") for i_n in enumerate(co.co_freevars): lines.append("%4d: %s" % i_n) if co.co_cellvars: lines.append("Cell variables:") for i_n in enumerate(co.co_cellvars): lines.append("%4d: %s" % i_n) return "\n".join(lines) def show_code(co, *, file=None): """Print details of methods, functions, or code to *file*. If *file* is not provided, the output is printed on stdout. """ print(code_info(co), file=file) _Instruction = collections.namedtuple("_Instruction", "opname opcode arg argval argrepr offset starts_line is_jump_target") class Instruction(_Instruction): """Details for a bytecode operation Defined fields: opname - human readable name for operation opcode - numeric code for operation arg - numeric argument to operation (if any), otherwise None argval - resolved arg value (if known), otherwise same as arg argrepr - human readable description of operation argument offset - start index of operation within bytecode sequence starts_line - line started by this opcode (if any), otherwise None is_jump_target - True if other code jumps to here, otherwise False """ def _disassemble(self, lineno_width=3, mark_as_current=False): """Format instruction details for inclusion in disassembly output *lineno_width* sets the width of the line number field (0 omits it) *mark_as_current* inserts a '-->' marker arrow as part of the line """ fields = [] # Column: Source code line number if lineno_width: if self.starts_line is not None: lineno_fmt = "%%%dd" % lineno_width fields.append(lineno_fmt % self.starts_line) else: fields.append(' ' * lineno_width) # Column: Current instruction indicator if mark_as_current: fields.append('-->') else: fields.append(' ') # Column: Jump target marker if self.is_jump_target: fields.append('>>') else: fields.append(' ') # Column: Instruction offset from start of code sequence fields.append(repr(self.offset).rjust(4)) # Column: Opcode name fields.append(self.opname.ljust(20)) # Column: Opcode argument if self.arg is not None: fields.append(repr(self.arg).rjust(5)) # Column: Opcode argument details if self.argrepr: fields.append('(' + self.argrepr + ')') return ' '.join(fields).rstrip() def get_instructions(x, *, first_line=None): """Iterator for the opcodes in methods, functions or code Generates a series of Instruction named tuples giving the details of each operations in the supplied code. If *first_line* is not None, it indicates the line number that should be reported for the first source line in the disassembled code. Otherwise, the source line information (if any) is taken directly from the disassembled code object. """ co = _get_code_object(x) cell_names = co.co_cellvars + co.co_freevars linestarts = dict(findlinestarts(co)) if first_line is not None: line_offset = first_line - co.co_firstlineno else: line_offset = 0 return _get_instructions_bytes(co.co_code, co.co_varnames, co.co_names, co.co_consts, cell_names, linestarts, line_offset) def _get_const_info(const_index, const_list): """Helper to get optional details about const references Returns the dereferenced constant and its repr if the constant list is defined. Otherwise returns the constant index and its repr(). """ argval = const_index if const_list is not None: argval = const_list[const_index] return argval, repr(argval) def _get_name_info(name_index, name_list): """Helper to get optional details about named references Returns the dereferenced name as both value and repr if the name list is defined. Otherwise returns the name index and its repr(). """ argval = name_index if name_list is not None: argval = name_list[name_index] argrepr = argval else: argrepr = repr(argval) return argval, argrepr def _get_instructions_bytes(code, varnames=None, names=None, constants=None, cells=None, linestarts=None, line_offset=0): """Iterate over the instructions in a bytecode string. Generates a sequence of Instruction namedtuples giving the details of each opcode. Additional information about the code's runtime environment (e.g. variable names, constants) can be specified using optional arguments. """ labels = findlabels(code) starts_line = None free = None for offset, op, arg in _unpack_opargs(code): if linestarts is not None: starts_line = linestarts.get(offset, None) if starts_line is not None: starts_line += line_offset is_jump_target = offset in labels argval = None argrepr = '' if arg is not None: # Set argval to the dereferenced value of the argument when # available, and argrepr to the string representation of argval. # _disassemble_bytes needs the string repr of the # raw name index for LOAD_GLOBAL, LOAD_CONST, etc. argval = arg if op in hasconst: argval, argrepr = _get_const_info(arg, constants) elif op in hasname: argval, argrepr = _get_name_info(arg, names) elif op in hasjrel: argval = offset + 3 + arg argrepr = "to " + repr(argval) elif op in haslocal: argval, argrepr = _get_name_info(arg, varnames) elif op in hascompare: argval = cmp_op[arg] argrepr = argval elif op in hasfree: argval, argrepr = _get_name_info(arg, cells) elif op in hasnargs: argrepr = "%d positional, %d keyword pair" % (arg%256, arg//256) yield Instruction(opname[op], op, arg, argval, argrepr, offset, starts_line, is_jump_target) def disassemble(co, lasti=-1, *, file=None): """Disassemble a code object.""" cell_names = co.co_cellvars + co.co_freevars linestarts = dict(findlinestarts(co)) _disassemble_bytes(co.co_code, lasti, co.co_varnames, co.co_names, co.co_consts, cell_names, linestarts, file=file) def _disassemble_bytes(code, lasti=-1, varnames=None, names=None, constants=None, cells=None, linestarts=None, *, file=None, line_offset=0): # Omit the line number column entirely if we have no line number info show_lineno = linestarts is not None # TODO?: Adjust width upwards if max(linestarts.values()) >= 1000? lineno_width = 3 if show_lineno else 0 for instr in _get_instructions_bytes(code, varnames, names, constants, cells, linestarts, line_offset=line_offset): new_source_line = (show_lineno and instr.starts_line is not None and instr.offset > 0) if new_source_line: print(file=file) is_current_instr = instr.offset == lasti print(instr._disassemble(lineno_width, is_current_instr), file=file) def _disassemble_str(source, *, file=None): """Compile the source string, then disassemble the code object.""" disassemble(_try_compile(source, '<dis>'), file=file) disco = disassemble # XXX For backwards compatibility def _unpack_opargs(code): # enumerate() is not an option, since we sometimes process # multiple elements on a single pass through the loop extended_arg = 0 n = len(code) i = 0 while i < n: op = code[i] offset = i i = i+1 arg = None if op >= HAVE_ARGUMENT: arg = code[i] + code[i+1]*256 + extended_arg extended_arg = 0 i = i+2 if op == EXTENDED_ARG: extended_arg = arg*65536 yield (offset, op, arg) def findlabels(code): """Detect all offsets in a byte code which are jump targets. Return the list of offsets. """ labels = [] for offset, op, arg in _unpack_opargs(code): if arg is not None: label = -1 if op in hasjrel: label = offset + 3 + arg elif op in hasjabs: label = arg if label >= 0: if label not in labels: labels.append(label) return labels def findlinestarts(code): """Find the offsets in a byte code which are start of lines in the source. Generate pairs (offset, lineno) as described in Python/compile.c. """ byte_increments = list(code.co_lnotab[0::2]) line_increments = list(code.co_lnotab[1::2]) lastlineno = None lineno = code.co_firstlineno addr = 0 for byte_incr, line_incr in zip(byte_increments, line_increments): if byte_incr: if lineno != lastlineno: yield (addr, lineno) lastlineno = lineno addr += byte_incr lineno += line_incr if lineno != lastlineno: yield (addr, lineno) class Bytecode: """The bytecode operations of a piece of code Instantiate this with a function, method, string of code, or a code object (as returned by compile()). Iterating over this yields the bytecode operations as Instruction instances. """ def __init__(self, x, *, first_line=None, current_offset=None): self.codeobj = co = _get_code_object(x) if first_line is None: self.first_line = co.co_firstlineno self._line_offset = 0 else: self.first_line = first_line self._line_offset = first_line - co.co_firstlineno self._cell_names = co.co_cellvars + co.co_freevars self._linestarts = dict(findlinestarts(co)) self._original_object = x self.current_offset = current_offset def __iter__(self): co = self.codeobj return _get_instructions_bytes(co.co_code, co.co_varnames, co.co_names, co.co_consts, self._cell_names, self._linestarts, line_offset=self._line_offset) def __repr__(self): return "{}({!r})".format(self.__class__.__name__, self._original_object) @classmethod def from_traceback(cls, tb): """ Construct a Bytecode from the given traceback """ while tb.tb_next: tb = tb.tb_next return cls(tb.tb_frame.f_code, current_offset=tb.tb_lasti) def info(self): """Return formatted information about the code object.""" return _format_code_info(self.codeobj) def dis(self): """Return a formatted view of the bytecode operations.""" co = self.codeobj if self.current_offset is not None: offset = self.current_offset else: offset = -1 with io.StringIO() as output: _disassemble_bytes(co.co_code, varnames=co.co_varnames, names=co.co_names, constants=co.co_consts, cells=self._cell_names, linestarts=self._linestarts, line_offset=self._line_offset, file=output, lasti=offset) return output.getvalue() def _test(): """Simple test program to disassemble a file.""" import argparse parser = argparse.ArgumentParser() parser.add_argument('infile', type=argparse.FileType(), nargs='?', default='-') args = parser.parse_args() with args.infile as infile: source = infile.read() code = compile(source, args.infile.name, "exec") dis(code) if __name__ == "__main__": _test()
Save
cmd:
run