[Python-checkins] cpython (3.6): Issue #28317: The disassembler now decodes FORMAT_VALUE argument.

serhiy.storchaka python-checkins at python.org
Sat Oct 8 05:35:21 EDT 2016


https://hg.python.org/cpython/rev/5e81d14a52f7
changeset:   104369:5e81d14a52f7
branch:      3.6
parent:      104367:888a26fac9d2
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Oct 08 12:34:25 2016 +0300
summary:
  Issue #28317: The disassembler now decodes FORMAT_VALUE argument.

files:
  Lib/dis.py           |   9 +++++++++
  Lib/test/test_dis.py |  24 ++++++++++++++++++++++++
  Misc/NEWS            |   2 ++
  3 files changed, 35 insertions(+), 0 deletions(-)


diff --git a/Lib/dis.py b/Lib/dis.py
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -16,6 +16,8 @@
 _have_code = (types.MethodType, types.FunctionType, types.CodeType,
               classmethod, staticmethod, type)
 
+FORMAT_VALUE = opmap['FORMAT_VALUE']
+
 def _try_compile(source, name):
     """Attempts to compile the given source, first as an expression and
        then as a statement if the first approach fails.
@@ -314,6 +316,13 @@
                 argrepr = argval
             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]
+                if argval[1]:
+                    if argrepr:
+                        argrepr += ', '
+                    argrepr += 'with format'
         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
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -301,6 +301,27 @@
        TRACEBACK_CODE.co_firstlineno + 4,
        TRACEBACK_CODE.co_firstlineno + 5)
 
+def _fstring(a, b, c, d):
+    return f'{a} {b:4} {c!r} {d!r:4}'
+
+dis_fstring = """\
+%3d           0 LOAD_FAST                0 (a)
+              2 FORMAT_VALUE             0
+              4 LOAD_CONST               1 (' ')
+              6 LOAD_FAST                1 (b)
+              8 LOAD_CONST               2 ('4')
+             10 FORMAT_VALUE             4 (with format)
+             12 LOAD_CONST               1 (' ')
+             14 LOAD_FAST                2 (c)
+             16 FORMAT_VALUE             2 (repr)
+             18 LOAD_CONST               1 (' ')
+             20 LOAD_FAST                3 (d)
+             22 LOAD_CONST               2 ('4')
+             24 FORMAT_VALUE             6 (repr, with format)
+             26 BUILD_STRING             7
+             28 RETURN_VALUE
+""" % (_fstring.__code__.co_firstlineno + 1,)
+
 def _g(x):
     yield x
 
@@ -404,6 +425,9 @@
         gen_disas = self.get_disassembly(_g(1))  # Disassemble generator itself
         self.assertEqual(gen_disas, gen_func_disas)
 
+    def test_disassemble_fstring(self):
+        self.do_disassembly_test(_fstring, dis_fstring)
+
     def test_dis_none(self):
         try:
             del sys.last_traceback
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -62,6 +62,8 @@
 Library
 -------
 
+- Issue #28317: The disassembler now decodes FORMAT_VALUE argument.
+
 - Issue #26293: Fixed writing ZIP files that starts not from the start of the
   file.  Offsets in ZIP file now are relative to the start of the archive in
   conforming to the specification.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list