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)