gh-92932: dis._unpack_opargs should handle EXTENDED_ARG_QUICK (gh-92945)

(cherry picked from commit b013804134)

Co-authored-by: Dong-hee Na <donghee.na@python.org>
This commit is contained in:
Miss Islington (bot) 2022-06-02 20:02:55 -07:00 committed by GitHub
parent 376d53771d
commit e798f698e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 1 deletions

View file

@ -592,7 +592,7 @@ def _unpack_opargs(code):
caches = _inline_cache_entries[deop]
if deop >= HAVE_ARGUMENT:
arg = code[i+1] | extended_arg
extended_arg = (arg << 8) if op == EXTENDED_ARG else 0
extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0
# The oparg is stored as a signed integer
# If the value exceeds its upper limit, it will overflow and wrap
# to a negative integer

View file

@ -633,6 +633,22 @@ dis_loop_test_quickened_code = """\
loop_test.__code__.co_firstlineno + 2,
loop_test.__code__.co_firstlineno + 1,)
def extended_arg_quick():
*_, _ = ...
dis_extended_arg_quick_code = """\
%3d 0 RESUME 0
%3d 2 LOAD_CONST 1 (Ellipsis)
4 EXTENDED_ARG_QUICK 1
6 UNPACK_EX 256
8 STORE_FAST 0 (_)
10 STORE_FAST 0 (_)
12 LOAD_CONST 0 (None)
14 RETURN_VALUE
"""% (extended_arg_quick.__code__.co_firstlineno,
extended_arg_quick.__code__.co_firstlineno + 1,)
QUICKENING_WARMUP_DELAY = 8
class DisTestBase(unittest.TestCase):
@ -1011,6 +1027,11 @@ class DisTests(DisTestBase):
got = self.get_disassembly(loop_test, adaptive=True)
self.do_disassembly_compare(got, dis_loop_test_quickened_code, True)
@cpython_only
def test_extended_arg_quick(self):
got = self.get_disassembly(extended_arg_quick)
self.do_disassembly_compare(got, dis_extended_arg_quick_code, True)
def get_cached_values(self, quickened, adaptive):
def f():
l = []

View file

@ -0,0 +1,3 @@
Now :func:`~dis.dis` and :func:`~dis.get_instructions` handle operand values
for instructions prefixed by ``EXTENDED_ARG_QUICK``.
Patch by Sam Gross and Dong-hee Na.