changeset: 104369:5e81d14a52f7 branch: 3.6 parent: 104367:888a26fac9d2 user: Serhiy Storchaka date: Sat Oct 08 12:34:25 2016 +0300 files: Lib/dis.py Lib/test/test_dis.py Misc/NEWS description: Issue #28317: The disassembler now decodes FORMAT_VALUE argument. diff -r 888a26fac9d2 -r 5e81d14a52f7 Lib/dis.py --- a/Lib/dis.py Sat Oct 08 12:26:25 2016 +0300 +++ b/Lib/dis.py Sat Oct 08 12:34:25 2016 +0300 @@ -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 -r 888a26fac9d2 -r 5e81d14a52f7 Lib/test/test_dis.py --- a/Lib/test/test_dis.py Sat Oct 08 12:26:25 2016 +0300 +++ b/Lib/test/test_dis.py Sat Oct 08 12:34:25 2016 +0300 @@ -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 -r 888a26fac9d2 -r 5e81d14a52f7 Misc/NEWS --- a/Misc/NEWS Sat Oct 08 12:26:25 2016 +0300 +++ b/Misc/NEWS Sat Oct 08 12:34:25 2016 +0300 @@ -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.