mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
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:
parent
376d53771d
commit
e798f698e5
3 changed files with 25 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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 = []
|
||||
|
|
|
@ -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.
|
Loading…
Add table
Add a link
Reference in a new issue