PEP 227 implementation

Track changes to new opcodes.  Add hasfree list that applies to all
ops that use the closure.
This commit is contained in:
Jeremy Hylton 2001-01-25 20:08:47 +00:00
parent 903f654ac9
commit a39414b15c
1 changed files with 15 additions and 1 deletions

View File

@ -6,7 +6,7 @@ import types
__all__ = ["dis","disassemble","distb","disco","opname","cmp_op", __all__ = ["dis","disassemble","distb","disco","opname","cmp_op",
"hasconst","hasname","hasjrel","hasjabs","haslocal", "hasconst","hasname","hasjrel","hasjabs","haslocal",
"hascompare"] "hascompare", "hasfree"]
def dis(x=None): def dis(x=None):
"""Disassemble classes, methods, functions, or code. """Disassemble classes, methods, functions, or code.
@ -60,6 +60,7 @@ def disassemble(co, lasti=-1):
n = len(code) n = len(code)
i = 0 i = 0
extended_arg = 0 extended_arg = 0
free = None
while i < n: while i < n:
c = code[i] c = code[i]
op = ord(c) op = ord(c)
@ -88,6 +89,10 @@ def disassemble(co, lasti=-1):
print '(' + co.co_varnames[oparg] + ')', print '(' + co.co_varnames[oparg] + ')',
elif op in hascompare: elif op in hascompare:
print '(' + cmp_op[oparg] + ')', print '(' + cmp_op[oparg] + ')',
elif op in hasfree:
if free is None:
free = co.co_cellvars + co.co_freevars
print '(' + free[oparg] + ')',
print print
disco = disassemble # XXX For backwards compatibility disco = disassemble # XXX For backwards compatibility
@ -127,6 +132,7 @@ hasjrel = []
hasjabs = [] hasjabs = []
haslocal = [] haslocal = []
hascompare = [] hascompare = []
hasfree = []
opname = [''] * 256 opname = [''] * 256
for op in range(256): opname[op] = '<' + `op` + '>' for op in range(256): opname[op] = '<' + `op` + '>'
@ -272,6 +278,14 @@ def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8)
def_op('MAKE_FUNCTION', 132) # Number of args with default values def_op('MAKE_FUNCTION', 132) # Number of args with default values
def_op('BUILD_SLICE', 133) # Number of items 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_VAR', 140) # #args + (#kwargs << 8)
def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8)
def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8)