Browse Source

bpo-45757: Fix bug where dis produced an incorrect oparg on EXTENDED_ARG before a no-arg opcode (GH-29480)

pull/23960/head
Irit Katriel 4 years ago
committed by GitHub
parent
commit
cb414cf0e2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      Lib/dis.py
  2. 21
      Lib/test/test_dis.py
  3. 1
      Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst

1
Lib/dis.py

@ -523,6 +523,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):

21
Lib/test/test_dis.py

@ -179,6 +179,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
8 RETURN_VALUE
"""
_BIG_LINENO_FORMAT = """\
%3d 0 LOAD_GLOBAL 0 (spam)
2 POP_TOP
@ -547,6 +564,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 = {}

1
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.
Loading…
Cancel
Save