[Python-checkins] gh-92932: dis._unpack_opargs should handle EXTENDED_ARG_QUICK (gh-92945)

corona10 webhook-mailer at python.org
Thu Jun 2 22:29:42 EDT 2022


https://github.com/python/cpython/commit/b013804134b07894205b06744628f6b25b879d85
commit: b013804134b07894205b06744628f6b25b879d85
branch: main
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2022-06-03T11:29:27+09:00
summary:

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

files:
A Misc/NEWS.d/next/Library/2022-05-19-17-49-58.gh-issue-92932.o2peTh.rst
M Lib/dis.py
M Lib/test/test_dis.py

diff --git a/Lib/dis.py b/Lib/dis.py
index 046013120b000..5a5ee8d848d3a 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -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
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index 244a24591b241..a4f7f84995bf5 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -620,6 +620,22 @@ def loop_test():
        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):
@@ -997,6 +1013,11 @@ def test_loop_quicken(self):
         got = self.get_disassembly(loop_test, adaptive=True)
         self.do_disassembly_compare(got, dis_loop_test_quickened_code)
 
+    @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 = []
diff --git a/Misc/NEWS.d/next/Library/2022-05-19-17-49-58.gh-issue-92932.o2peTh.rst b/Misc/NEWS.d/next/Library/2022-05-19-17-49-58.gh-issue-92932.o2peTh.rst
new file mode 100644
index 0000000000000..cb76ac5cbd60e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-05-19-17-49-58.gh-issue-92932.o2peTh.rst
@@ -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.



More information about the Python-checkins mailing list