PEP 227 implementation
Track changes to new opcodes. Add hasfree list that applies to all
ops that use the closure.
diff --git a/Lib/dis.py b/Lib/dis.py
index f01bf4f..269304e 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -6,7 +6,7 @@
__all__ = ["dis","disassemble","distb","disco","opname","cmp_op",
"hasconst","hasname","hasjrel","hasjabs","haslocal",
- "hascompare"]
+ "hascompare", "hasfree"]
def dis(x=None):
"""Disassemble classes, methods, functions, or code.
@@ -60,6 +60,7 @@
n = len(code)
i = 0
extended_arg = 0
+ free = None
while i < n:
c = code[i]
op = ord(c)
@@ -88,6 +89,10 @@
print '(' + co.co_varnames[oparg] + ')',
elif op in hascompare:
print '(' + cmp_op[oparg] + ')',
+ elif op in hasfree:
+ if free is None:
+ free = co.co_cellvars + co.co_freevars
+ print '(' + free[oparg] + ')',
print
disco = disassemble # XXX For backwards compatibility
@@ -127,6 +132,7 @@
hasjabs = []
haslocal = []
hascompare = []
+hasfree = []
opname = [''] * 256
for op in range(256): opname[op] = '<' + `op` + '>'
@@ -272,6 +278,14 @@
def_op('MAKE_FUNCTION', 132) # Number of args with default values
def_op('BUILD_SLICE', 133) # Number of items
+def_op('MAKE_CLOSURE', 134)
+def_op('LOAD_CLOSURE', 135)
+hasfree.append(135)
+def_op('LOAD_DEREF', 136)
+hasfree.append(136)
+def_op('STORE_DEREF', 137)
+hasfree.append(137)
+
def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8)
def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8)
def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8)