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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
23 additions and
0 deletions
-
Lib/dis.py
-
Lib/test/test_dis.py
-
Misc/NEWS.d/next/Library/2021-11-08-23-22-14.bpo-45757.MHZHt3.rst
|
|
|
@ -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): |
|
|
|
|
|
|
|
@ -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 = {} |
|
|
|
|
|
|
|
@ -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. |