annotate Lib/dis.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents 22dc0a433b0e
children f65b867ce817
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6592
14025a4f793e Added docstrings (contributed by Martin von Loewis).
Guido van Rossum <guido@python.org>
parents: 5475
diff changeset
1 """Disassembler of Python byte code into mnemonics."""
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import sys
5189
bab9196a8f30 Support disassembly of a variety of objects through dis.dis().
Guido van Rossum <guido@python.org>
parents: 4989
diff changeset
4 import types
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
28092
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
6 from opcode import *
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
7 from opcode import __all__ as _opcodes_all
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
8
64604
9faa80d0111f Fix dis.__all__ for new additions to module in 3.2(spotted by Eli Bendersky)
Nick Coghlan <ncoghlan@gmail.com>
parents: 64108
diff changeset
9 __all__ = ["code_info", "dis", "disassemble", "distb", "disco",
64607
c6669f4bf8c5 As per python-dev discussion with Eli, properly document and publish dis.show_code
Nick Coghlan <ncoghlan@gmail.com>
parents: 64606
diff changeset
10 "findlinestarts", "findlabels", "show_code"] + _opcodes_all
28092
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
11 del _opcodes_all
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 16012
diff changeset
12
60331
71779f4a2078 factor out constant
Benjamin Peterson <benjamin@python.org>
parents: 50419
diff changeset
13 _have_code = (types.MethodType, types.FunctionType, types.CodeType, type)
71779f4a2078 factor out constant
Benjamin Peterson <benjamin@python.org>
parents: 50419
diff changeset
14
62712
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
15 def _try_compile(source, name):
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
16 """Attempts to compile the given source, first as an expression and
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
17 then as a statement if the first approach fails.
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
18
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
19 Utility function to accept strings in functions that otherwise
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
20 expect code objects
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
21 """
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
22 try:
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
23 c = compile(source, name, 'eval')
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
24 except SyntaxError:
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
25 c = compile(source, name, 'exec')
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
26 return c
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
27
4988
df385cc0d2e3 More user friedly interface:
Guido van Rossum <guido@python.org>
parents: 4974
diff changeset
28 def dis(x=None):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
29 """Disassemble classes, methods, functions, or code.
6592
14025a4f793e Added docstrings (contributed by Martin von Loewis).
Guido van Rossum <guido@python.org>
parents: 5475
diff changeset
30
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
31 With no argument, disassemble the last traceback.
6592
14025a4f793e Added docstrings (contributed by Martin von Loewis).
Guido van Rossum <guido@python.org>
parents: 5475
diff changeset
32
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
33 """
23611
21b1d742e4a7 Replaced boolean test with 'is None'
Raymond Hettinger <python@rcn.com>
parents: 21924
diff changeset
34 if x is None:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
35 distb()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
36 return
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
37 if hasattr(x, '__func__'): # Method
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 43604
diff changeset
38 x = x.__func__
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
39 if hasattr(x, '__code__'): # Function
40910
eaaee785eb86 Change all the function attributes from func_* -> __*__. This gets rid
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
40 x = x.__code__
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
41 if hasattr(x, '__dict__'): # Class or module
41969
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41910
diff changeset
42 items = sorted(x.__dict__.items())
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
43 for name, x1 in items:
60331
71779f4a2078 factor out constant
Benjamin Peterson <benjamin@python.org>
parents: 50419
diff changeset
44 if isinstance(x1, _have_code):
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
45 print("Disassembly of %s:" % name)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
46 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
47 dis(x1)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 38397
diff changeset
48 except TypeError as msg:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
49 print("Sorry:", msg)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
50 print()
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
51 elif hasattr(x, 'co_code'): # Code object
16012
8e4dfb681689 Checking in a slight variation of Barry's patch 103303.
Guido van Rossum <guido@python.org>
parents: 15867
diff changeset
52 disassemble(x)
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
53 elif isinstance(x, (bytes, bytearray)): # Raw bytecode
62712
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
54 _disassemble_bytes(x)
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
55 elif isinstance(x, str): # Source code
62712
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
56 _disassemble_str(x)
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
57 else:
41969
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41910
diff changeset
58 raise TypeError("don't know how to disassemble %s objects" %
9d02a4adf574 Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41910
diff changeset
59 type(x).__name__)
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
4988
df385cc0d2e3 More user friedly interface:
Guido van Rossum <guido@python.org>
parents: 4974
diff changeset
61 def distb(tb=None):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
62 """Disassemble a traceback (default: last traceback)."""
23611
21b1d742e4a7 Replaced boolean test with 'is None'
Raymond Hettinger <python@rcn.com>
parents: 21924
diff changeset
63 if tb is None:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
64 try:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
65 tb = sys.last_traceback
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
66 except AttributeError:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 41986
diff changeset
67 raise RuntimeError("no last traceback to disassemble")
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
68 while tb.tb_next: tb = tb.tb_next
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
69 disassemble(tb.tb_frame.f_code, tb.tb_lasti)
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
64108
5fce01a51aa5 Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
Nick Coghlan <ncoghlan@gmail.com>
parents: 64103
diff changeset
71 # The inspect module interrogates this dictionary to build its
5fce01a51aa5 Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
Nick Coghlan <ncoghlan@gmail.com>
parents: 64103
diff changeset
72 # list of CO_* constants. It is also used by pretty_flags to
5fce01a51aa5 Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
Nick Coghlan <ncoghlan@gmail.com>
parents: 64103
diff changeset
73 # turn the co_flags field into a human readable list.
5fce01a51aa5 Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
Nick Coghlan <ncoghlan@gmail.com>
parents: 64103
diff changeset
74 COMPILER_FLAG_NAMES = {
41910
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
75 1: "OPTIMIZED",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
76 2: "NEWLOCALS",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
77 4: "VARARGS",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
78 8: "VARKEYWORDS",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
79 16: "NESTED",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
80 32: "GENERATOR",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
81 64: "NOFREE",
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
82 }
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
83
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
84 def pretty_flags(flags):
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
85 """Return pretty representation of code flags."""
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
86 names = []
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
87 for i in range(32):
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
88 flag = 1<<i
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
89 if flags & flag:
64108
5fce01a51aa5 Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
Nick Coghlan <ncoghlan@gmail.com>
parents: 64103
diff changeset
90 names.append(COMPILER_FLAG_NAMES.get(flag, hex(flag)))
41910
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
91 flags ^= flag
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
92 if not flags:
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
93 break
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
94 else:
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
95 names.append(hex(flags))
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
96 return ", ".join(names)
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
97
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
98 def code_info(x):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
99 """Formatted details of methods, functions, or code."""
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
100 if hasattr(x, '__func__'): # Method
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
101 x = x.__func__
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
102 if hasattr(x, '__code__'): # Function
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
103 x = x.__code__
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
104 if isinstance(x, str): # Source code
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
105 x = _try_compile(x, "<code_info>")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
106 if hasattr(x, 'co_code'): # Code object
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
107 return _format_code_info(x)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
108 else:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
109 raise TypeError("don't know how to disassemble %s objects" %
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
110 type(x).__name__)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
111
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
112 def _format_code_info(co):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
113 lines = []
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
114 lines.append("Name: %s" % co.co_name)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
115 lines.append("Filename: %s" % co.co_filename)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
116 lines.append("Argument count: %s" % co.co_argcount)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
117 lines.append("Kw-only arguments: %s" % co.co_kwonlyargcount)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
118 lines.append("Number of locals: %s" % co.co_nlocals)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
119 lines.append("Stack size: %s" % co.co_stacksize)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
120 lines.append("Flags: %s" % pretty_flags(co.co_flags))
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
121 if co.co_consts:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
122 lines.append("Constants:")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
123 for i_c in enumerate(co.co_consts):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
124 lines.append("%4d: %r" % i_c)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
125 if co.co_names:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
126 lines.append("Names:")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
127 for i_n in enumerate(co.co_names):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
128 lines.append("%4d: %s" % i_n)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
129 if co.co_varnames:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
130 lines.append("Variable names:")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
131 for i_n in enumerate(co.co_varnames):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
132 lines.append("%4d: %s" % i_n)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
133 if co.co_freevars:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
134 lines.append("Free variables:")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
135 for i_n in enumerate(co.co_freevars):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
136 lines.append("%4d: %s" % i_n)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
137 if co.co_cellvars:
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
138 lines.append("Cell variables:")
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
139 for i_n in enumerate(co.co_cellvars):
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
140 lines.append("%4d: %s" % i_n)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
141 return "\n".join(lines)
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
142
41910
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
143 def show_code(co):
64607
c6669f4bf8c5 As per python-dev discussion with Eli, properly document and publish dis.show_code
Nick Coghlan <ncoghlan@gmail.com>
parents: 64606
diff changeset
144 """Print details of methods, functions, or code to stdout."""
64103
b2a9a59c2d57 Issue 9147: Add dis.code_info()
Nick Coghlan <ncoghlan@gmail.com>
parents: 62712
diff changeset
145 print(code_info(co))
41910
f40ff2d738ea Add a helper to display the various flags and components of code objects
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
146
4988
df385cc0d2e3 More user friedly interface:
Guido van Rossum <guido@python.org>
parents: 4974
diff changeset
147 def disassemble(co, lasti=-1):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
148 """Disassemble a code object."""
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
149 code = co.co_code
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
150 labels = findlabels(code)
30803
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
151 linestarts = dict(findlinestarts(co))
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
152 n = len(code)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
153 i = 0
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
154 extended_arg = 0
16260
20ef849ec877 PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16070
diff changeset
155 free = None
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
156 while i < n:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
157 op = code[i]
30803
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
158 if i in linestarts:
24844
cf5928fab108 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 23829
diff changeset
159 if i > 0:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
160 print()
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
161 print("%3d" % linestarts[i], end=' ')
24844
cf5928fab108 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 23829
diff changeset
162 else:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
163 print(' ', end=' ')
24844
cf5928fab108 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 23829
diff changeset
164
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
165 if i == lasti: print('-->', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
166 else: print(' ', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
167 if i in labels: print('>>', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
168 else: print(' ', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
169 print(repr(i).rjust(4), end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
170 print(opname[op].ljust(20), end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
171 i = i+1
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
172 if op >= HAVE_ARGUMENT:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
173 oparg = code[i] + code[i+1]*256 + extended_arg
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
174 extended_arg = 0
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
175 i = i+2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
176 if op == EXTENDED_ARG:
40644
1c26505c1de6 Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
177 extended_arg = oparg*65536
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
178 print(repr(oparg).rjust(5), end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
179 if op in hasconst:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
180 print('(' + repr(co.co_consts[oparg]) + ')', end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
181 elif op in hasname:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
182 print('(' + co.co_names[oparg] + ')', end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
183 elif op in hasjrel:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
184 print('(to ' + repr(i + oparg) + ')', end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
185 elif op in haslocal:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
186 print('(' + co.co_varnames[oparg] + ')', end=' ')
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
187 elif op in hascompare:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
188 print('(' + cmp_op[oparg] + ')', end=' ')
16260
20ef849ec877 PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16070
diff changeset
189 elif op in hasfree:
20ef849ec877 PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16070
diff changeset
190 if free is None:
20ef849ec877 PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16070
diff changeset
191 free = co.co_cellvars + co.co_freevars
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
192 print('(' + free[oparg] + ')', end=' ')
77373
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
193 elif op in hasnargs:
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
194 print('(%d positional, %d keyword pair)'
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
195 % (code[i-2], code[i-1]), end=' ')
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
196 print()
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
62712
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
198 def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
28092
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
199 constants=None):
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
200 labels = findlabels(code)
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
201 n = len(code)
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
202 i = 0
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
203 while i < n:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
204 op = code[i]
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
205 if i == lasti: print('-->', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
206 else: print(' ', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
207 if i in labels: print('>>', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
208 else: print(' ', end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
209 print(repr(i).rjust(4), end=' ')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
210 print(opname[op].ljust(15), end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
211 i = i+1
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
212 if op >= HAVE_ARGUMENT:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
213 oparg = code[i] + code[i+1]*256
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
214 i = i+2
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
215 print(repr(oparg).rjust(5), end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
216 if op in hasconst:
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
217 if constants:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
218 print('(' + repr(constants[oparg]) + ')', end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
219 else:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
220 print('(%d)'%oparg, end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
221 elif op in hasname:
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
222 if names is not None:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
223 print('(' + names[oparg] + ')', end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
224 else:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
225 print('(%d)'%oparg, end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
226 elif op in hasjrel:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
227 print('(to ' + repr(i + oparg) + ')', end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
228 elif op in haslocal:
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
229 if varnames:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
230 print('(' + varnames[oparg] + ')', end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
231 else:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
232 print('(%d)' % oparg, end=' ')
28231
4cafa5141012 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 28092
diff changeset
233 elif op in hascompare:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
234 print('(' + cmp_op[oparg] + ')', end=' ')
77373
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
235 elif op in hasnargs:
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
236 print('(%d positional, %d keyword pair)'
22dc0a433b0e Issue #11823: disassembly now shows argument counts on calls with keyword args
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64607
diff changeset
237 % (code[i-2], code[i-1]), end=' ')
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
238 print()
28092
12bab87a3dd2 * separate opcode definitions into opcode.py
Skip Montanaro <skip@pobox.com>
parents: 25078
diff changeset
239
62712
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
240 def _disassemble_str(source):
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
241 """Compile the source string, then disassemble the code object."""
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
242 disassemble(_try_compile(source, '<dis>'))
ebe1b3ff8d30 Issue 6507: accept source strings directly in dis.dis(). Original patch by Daniel Urban
Nick Coghlan <ncoghlan@gmail.com>
parents: 60331
diff changeset
243
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
244 disco = disassemble # XXX For backwards compatibility
4988
df385cc0d2e3 More user friedly interface:
Guido van Rossum <guido@python.org>
parents: 4974
diff changeset
245
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 def findlabels(code):
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
247 """Detect all offsets in a byte code which are jump targets.
6592
14025a4f793e Added docstrings (contributed by Martin von Loewis).
Guido van Rossum <guido@python.org>
parents: 5475
diff changeset
248
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
249 Return the list of offsets.
6592
14025a4f793e Added docstrings (contributed by Martin von Loewis).
Guido van Rossum <guido@python.org>
parents: 5475
diff changeset
250
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
251 """
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
252 labels = []
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
253 n = len(code)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
254 i = 0
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
255 while i < n:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
256 op = code[i]
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
257 i = i+1
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
258 if op >= HAVE_ARGUMENT:
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
259 oparg = code[i] + code[i+1]*256
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
260 i = i+2
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
261 label = -1
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
262 if op in hasjrel:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
263 label = i+oparg
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
264 elif op in hasjabs:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
265 label = oparg
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
266 if label >= 0:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
267 if label not in labels:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
268 labels.append(label)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
269 return labels
103
1229ba124e0b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270
30803
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
271 def findlinestarts(code):
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
272 """Find the offsets in a byte code which are start of lines in the source.
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
273
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
274 Generate pairs (offset, lineno) as described in Python/compile.c.
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
275
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
276 """
43604
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
277 byte_increments = list(code.co_lnotab[0::2])
b18f6092f6e0 Patch 1280, by Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43020
diff changeset
278 line_increments = list(code.co_lnotab[1::2])
30803
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
279
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
280 lastlineno = None
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
281 lineno = code.co_firstlineno
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
282 addr = 0
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
283 for byte_incr, line_incr in zip(byte_increments, line_increments):
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
284 if byte_incr:
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
285 if lineno != lastlineno:
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
286 yield (addr, lineno)
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
287 lastlineno = lineno
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
288 addr += byte_incr
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
289 lineno += line_incr
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
290 if lineno != lastlineno:
aecbba0294bb Fixed dis.disassemble_string().
Armin Rigo <arigo@tunes.org>
parents: 28231
diff changeset
291 yield (addr, lineno)
11709
5d625a365e76 Added a simple test program to disassemble a file, invoked as __main__.
Guido van Rossum <guido@python.org>
parents: 10822
diff changeset
292
5d625a365e76 Added a simple test program to disassemble a file, invoked as __main__.
Guido van Rossum <guido@python.org>
parents: 10822
diff changeset
293 def _test():
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
294 """Simple test program to disassemble a file."""
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
295 if sys.argv[1:]:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
296 if sys.argv[2:]:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
297 sys.stderr.write("usage: python dis.py [-|file]\n")
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
298 sys.exit(2)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
299 fn = sys.argv[1]
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
300 if not fn or fn == "-":
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
301 fn = None
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
302 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
303 fn = None
23611
21b1d742e4a7 Replaced boolean test with 'is None'
Raymond Hettinger <python@rcn.com>
parents: 21924
diff changeset
304 if fn is None:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
305 f = sys.stdin
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
306 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
307 f = open(fn)
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
308 source = f.read()
23611
21b1d742e4a7 Replaced boolean test with 'is None'
Raymond Hettinger <python@rcn.com>
parents: 21924
diff changeset
309 if fn is not None:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
310 f.close()
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
311 else:
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
312 fn = "<stdin>"
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
313 code = compile(source, fn, "exec")
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
314 dis(code)
11709
5d625a365e76 Added a simple test program to disassemble a file, invoked as __main__.
Guido van Rossum <guido@python.org>
parents: 10822
diff changeset
315
5d625a365e76 Added a simple test program to disassemble a file, invoked as __main__.
Guido van Rossum <guido@python.org>
parents: 10822
diff changeset
316 if __name__ == "__main__":
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 14171
diff changeset
317 _test()