1 """Disassembler of Python byte code into mnemonics."""
6 __all__ = [
"dis",
"disassemble",
"distb",
"disco",
"opname",
"cmp_op",
7 "hasconst",
"hasname",
"hasjrel",
"hasjabs",
"haslocal",
8 "hascompare",
"hasfree"]
11 """Disassemble classes, methods, functions, or code.
13 With no argument, disassemble the last traceback.
19 if type(x)
is types.InstanceType:
21 if hasattr(x,
'im_func'):
23 if hasattr(x,
'func_code'):
25 if hasattr(x,
'__dict__'):
26 items = x.__dict__.items()
28 for name, x1
in items:
29 if type(x1)
in (types.MethodType,
32 print "Disassembly of %s:" % name
35 except TypeError, msg:
38 elif hasattr(x,
'co_code'):
42 "don't know how to disassemble %s objects" % \
46 """Disassemble a traceback (default: last traceback)."""
49 tb = sys.last_traceback
50 except AttributeError:
51 raise RuntimeError,
"no last traceback to disassemble"
52 while tb.tb_next: tb = tb.tb_next
56 """Disassemble a code object."""
66 if op == SET_LINENO
and i > 0:
print
67 if i == lasti:
print '-->',
69 if i
in labels:
print '>>',
72 print opname[op].
ljust(20),
74 if op >= HAVE_ARGUMENT:
75 oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg
78 if op == EXTENDED_ARG:
79 extended_arg = oparg*65536L
80 print `oparg`.
rjust(5),
82 print '(' + `co.co_consts[oparg]` +
')',
84 print '(' + co.co_names[oparg] +
')',
86 print '(to ' + `i + oparg` +
')',
88 print '(' + co.co_varnames[oparg] +
')',
89 elif op
in hascompare:
90 print '(' + cmp_op[oparg] +
')',
93 free = co.co_cellvars + co.co_freevars
94 print '(' + free[oparg] +
')',
100 """Detect all offsets in a byte code which are jump targets.
102 Return the list of offsets.
112 if op >= HAVE_ARGUMENT:
113 oparg = ord(code[i]) + ord(code[i+1])*256
121 if label
not in labels:
125 cmp_op = (
'<',
'<=',
'==',
'!=',
'>',
'>=',
'in',
'not in',
'is',
126 'is not',
'exception match',
'BAD')
137 for op
in range(256): opname[op] =
'<' + `op` +
'>'
163 def_op(
'UNARY_POSITIVE', 10)
164 def_op(
'UNARY_NEGATIVE', 11)
166 def_op(
'UNARY_CONVERT', 13)
168 def_op(
'UNARY_INVERT', 15)
170 def_op(
'BINARY_POWER', 19)
172 def_op(
'BINARY_MULTIPLY', 20)
173 def_op(
'BINARY_DIVIDE', 21)
174 def_op(
'BINARY_MODULO', 22)
176 def_op(
'BINARY_SUBTRACT', 24)
177 def_op(
'BINARY_SUBSCR', 25)
178 def_op(
'BINARY_FLOOR_DIVIDE', 26)
179 def_op(
'BINARY_TRUE_DIVIDE', 27)
180 def_op(
'INPLACE_FLOOR_DIVIDE', 28)
181 def_op(
'INPLACE_TRUE_DIVIDE', 29)
188 def_op(
'STORE_SLICE+0', 40)
189 def_op(
'STORE_SLICE+1', 41)
190 def_op(
'STORE_SLICE+2', 42)
191 def_op(
'STORE_SLICE+3', 43)
193 def_op(
'DELETE_SLICE+0', 50)
194 def_op(
'DELETE_SLICE+1', 51)
195 def_op(
'DELETE_SLICE+2', 52)
196 def_op(
'DELETE_SLICE+3', 53)
199 def_op(
'INPLACE_SUBTRACT', 56)
200 def_op(
'INPLACE_MULTIPLY', 57)
201 def_op(
'INPLACE_DIVIDE', 58)
202 def_op(
'INPLACE_MODULO', 59)
203 def_op(
'STORE_SUBSCR', 60)
204 def_op(
'DELETE_SUBSCR', 61)
206 def_op(
'BINARY_LSHIFT', 62)
207 def_op(
'BINARY_RSHIFT', 63)
211 def_op(
'INPLACE_POWER', 67)
216 def_op(
'PRINT_NEWLINE', 72)
217 def_op(
'PRINT_ITEM_TO', 73)
218 def_op(
'PRINT_NEWLINE_TO', 74)
219 def_op(
'INPLACE_LSHIFT', 75)
220 def_op(
'INPLACE_RSHIFT', 76)
227 def_op(
'RETURN_VALUE', 83)
240 def_op(
'UNPACK_SEQUENCE', 92)
251 def_op(
'BUILD_TUPLE', 102)
256 hascompare.append(106)
277 def_op(
'DELETE_FAST', 126)
283 def_op(
'RAISE_VARARGS', 130)
284 def_op(
'CALL_FUNCTION', 131)
285 def_op(
'MAKE_FUNCTION', 132)
286 def_op(
'BUILD_SLICE', 133)
288 def_op(
'MAKE_CLOSURE', 134)
289 def_op(
'LOAD_CLOSURE', 135)
293 def_op(
'STORE_DEREF', 137)
296 def_op(
'CALL_FUNCTION_VAR', 140)
297 def_op(
'CALL_FUNCTION_KW', 141)
298 def_op(
'CALL_FUNCTION_VAR_KW', 142)
300 def_op(
'EXTENDED_ARG', 143)
304 """Simple test program to disassemble a file."""
307 sys.stderr.write(
"usage: python dis.py [-|file]\n")
310 if not fn
or fn ==
"-":
323 code =
compile(source, fn,
"exec")
326 if __name__ ==
"__main__":