From c5bfb88eb6f82111bb1603ae9d78d0476b552d66 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 9 Nov 2021 22:05:30 +0000 Subject: [3.10] bpo-45757: Fix bug where dis produced an incorrect oparg on EXTENDED_ARG before a no-arg opcode (GH-29480) (GH-29506) --- Lib/dis.py | 1 + Lib/test/test_dis.py | 21 +++++++++++++++++++++ .../2021-11-08-23-22-14.bpo-45757.MHZHt3.rst | 1 + 3 files changed, 23 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst diff --git a/Lib/dis.py b/Lib/dis.py index 3fee1ce..fe5d24e 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -428,6 +428,7 @@ def _unpack_opargs(code): extended_arg = (arg << 8) if op == EXTENDED_ARG else 0 else: arg = None + extended_arg = 0 yield (i, op, arg) def findlabels(code): diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 2cb2eff..000549f 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -180,6 +180,23 @@ dis_bug42562 = """\ 2 RETURN_VALUE """ +# Extended arg followed by NOP +code_bug_45757 = bytes([ + 0x90, 0x01, # EXTENDED_ARG 0x01 + 0x09, 0xFF, # NOP 0xFF + 0x90, 0x01, # EXTENDED_ARG 0x01 + 0x64, 0x29, # LOAD_CONST 0x29 + 0x53, 0x00, # RETURN_VALUE 0x00 + ]) + +dis_bug_45757 = """\ + 0 EXTENDED_ARG 1 + 2 NOP + 4 EXTENDED_ARG 1 + 6 LOAD_CONST 297 (297) + 8 RETURN_VALUE +""" + _BIG_LINENO_FORMAT = """\ %3d 0 LOAD_GLOBAL 0 (spam) 2 POP_TOP @@ -534,6 +551,10 @@ class DisTests(unittest.TestCase): def test_bug_42562(self): self.do_disassembly_test(bug42562, dis_bug42562) + def test_bug_45757(self): + # Extended arg followed by NOP + self.do_disassembly_test(code_bug_45757, dis_bug_45757) + def test_big_linenos(self): def func(count): namespace = {} diff --git a/Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst b/Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst new file mode 100644 index 0000000..f25638c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst @@ -0,0 +1 @@ +Fix bug where :mod:`dis` produced an incorrect oparg when :opcode:`EXTENDED_ARG` is followed by an opcode that does not use its argument. \ No newline at end of file -- cgit v0.12