[Python-checkins] bpo-32970: Improve disassembly of the MAKE_FUNCTION instruction. (GH-5937)

Serhiy Storchaka webhook-mailer at python.org
Sun Mar 11 05:07:09 EDT 2018


https://github.com/python/cpython/commit/e2732d3e66eba9ec13f9d55c499f2437ead552db
commit: e2732d3e66eba9ec13f9d55c499f2437ead552db
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018-03-11T11:07:06+02:00
summary:

bpo-32970: Improve disassembly of the MAKE_FUNCTION instruction. (GH-5937)

files:
A Misc/NEWS.d/next/Library/2018-02-28-18-39-48.bpo-32970.IPWtbS.rst
M Lib/dis.py
M Lib/test/test_dis.py

diff --git a/Lib/dis.py b/Lib/dis.py
index 90ddf4f33603..b2b0003203a4 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -17,6 +17,15 @@
               classmethod, staticmethod, type)
 
 FORMAT_VALUE = opmap['FORMAT_VALUE']
+FORMAT_VALUE_CONVERTERS = (
+    (None, ''),
+    (str, 'str'),
+    (repr, 'repr'),
+    (ascii, 'ascii'),
+)
+MAKE_FUNCTION = opmap['MAKE_FUNCTION']
+MAKE_FUNCTION_FLAGS = ('defaults', 'kwdefaults', 'annotations', 'closure')
+
 
 def _try_compile(source, name):
     """Attempts to compile the given source, first as an expression and
@@ -339,12 +348,15 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None,
             elif op in hasfree:
                 argval, argrepr = _get_name_info(arg, cells)
             elif op == FORMAT_VALUE:
-                argval = ((None, str, repr, ascii)[arg & 0x3], bool(arg & 0x4))
-                argrepr = ('', 'str', 'repr', 'ascii')[arg & 0x3]
+                argval, argrepr = FORMAT_VALUE_CONVERTERS[arg & 0x3]
+                argval = (argval, bool(arg & 0x4))
                 if argval[1]:
                     if argrepr:
                         argrepr += ', '
                     argrepr += 'with format'
+            elif op == MAKE_FUNCTION:
+                argrepr = ', '.join(s for i, s in enumerate(MAKE_FUNCTION_FLAGS)
+                                    if arg & (1<<i))
         yield Instruction(opname[op], op,
                           arg, argval, argrepr,
                           offset, starts_line, is_jump_target)
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index 08393f734ba5..098367ca55d1 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -348,7 +348,7 @@ def foo(x):
               2 BUILD_TUPLE              1
               4 LOAD_CONST               1 (<code object foo at 0x..., file "%s", line %d>)
               6 LOAD_CONST               2 ('_h.<locals>.foo')
-              8 MAKE_FUNCTION            8
+              8 MAKE_FUNCTION            8 (closure)
              10 STORE_FAST               1 (foo)
 
 %3d          12 LOAD_FAST                1 (foo)
@@ -365,7 +365,7 @@ def foo(x):
               2 BUILD_TUPLE              1
               4 LOAD_CONST               1 (<code object <listcomp> at 0x..., file "%s", line %d>)
               6 LOAD_CONST               2 ('_h.<locals>.foo.<locals>.<listcomp>')
-              8 MAKE_FUNCTION            8
+              8 MAKE_FUNCTION            8 (closure)
              10 LOAD_DEREF               1 (y)
              12 GET_ITER
              14 CALL_FUNCTION            1
@@ -862,7 +862,7 @@ def jumpy():
   Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=6, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_f, argrepr=repr(code_object_f), offset=8, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer.<locals>.f', argrepr="'outer.<locals>.f'", offset=10, starts_line=None, is_jump_target=False),
-  Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='', offset=12, starts_line=None, is_jump_target=False),
+  Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=12, starts_line=None, is_jump_target=False),
   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=14, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=16, starts_line=7, is_jump_target=False),
   Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=18, starts_line=None, is_jump_target=False),
@@ -887,7 +887,7 @@ def jumpy():
   Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=10, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_inner, argrepr=repr(code_object_inner), offset=12, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer.<locals>.f.<locals>.inner', argrepr="'outer.<locals>.f.<locals>.inner'", offset=14, starts_line=None, is_jump_target=False),
-  Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='', offset=16, starts_line=None, is_jump_target=False),
+  Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=16, starts_line=None, is_jump_target=False),
   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=18, starts_line=None, is_jump_target=False),
   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=20, starts_line=5, is_jump_target=False),
   Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='a', argrepr='a', offset=22, starts_line=None, is_jump_target=False),
diff --git a/Misc/NEWS.d/next/Library/2018-02-28-18-39-48.bpo-32970.IPWtbS.rst b/Misc/NEWS.d/next/Library/2018-02-28-18-39-48.bpo-32970.IPWtbS.rst
new file mode 100644
index 000000000000..e97c16df5a0d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-02-28-18-39-48.bpo-32970.IPWtbS.rst
@@ -0,0 +1 @@
+Improved disassembly of the MAKE_FUNCTION instruction.



More information about the Python-checkins mailing list