]> granicus.if.org Git - python/commitdiff
PEP 227 implementation
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 25 Jan 2001 20:08:47 +0000 (20:08 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 25 Jan 2001 20:08:47 +0000 (20:08 +0000)
Track changes to new opcodes.  Add hasfree list that applies to all
ops that use the closure.

Lib/dis.py

index f01bf4fe103fcd1c8442bb4887370d962756f2c0..269304eefdaeaa9b3ca93e52c633ebd4874c83db 100644 (file)
@@ -6,7 +6,7 @@ import types
 
 __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 @@ def disassemble(co, lasti=-1):
     n = len(code)
     i = 0
     extended_arg = 0
+    free = None
     while i < n:
         c = code[i]
         op = ord(c)
@@ -88,6 +89,10 @@ def disassemble(co, lasti=-1):
                 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 @@ hasjrel = []
 hasjabs = []
 haslocal = []
 hascompare = []
+hasfree = []
 
 opname = [''] * 256
 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('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)