[Python-checkins] gh-90997: Move `CACHE` handling into `_unpack_opargs` (#92409)
pablogsal
webhook-mailer at python.org
Fri May 6 13:57:32 EDT 2022
https://github.com/python/cpython/commit/3f61db475692511a9676765e6f9f0bb204306e93
commit: 3f61db475692511a9676765e6f9f0bb204306e93
branch: main
author: Brandt Bucher <brandtbucher at gmail.com>
committer: pablogsal <Pablogsal at gmail.com>
date: 2022-05-06T18:57:08+01:00
summary:
gh-90997: Move `CACHE` handling into `_unpack_opargs` (#92409)
* Move CACHE handling into _unpack_opargs
* Remove auto-added import
* blurb add
files:
A Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst
M Lib/dis.py
diff --git a/Lib/dis.py b/Lib/dis.py
index 53c62694decaa..046013120b000 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -440,11 +440,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None,
for i in range(start, end):
labels.add(target)
starts_line = None
- cache_counter = 0
for offset, op, arg in _unpack_opargs(code):
- if cache_counter > 0:
- cache_counter -= 1
- continue
if linestarts is not None:
starts_line = linestarts.get(offset, None)
if starts_line is not None:
@@ -454,7 +450,6 @@ def _get_instructions_bytes(code, varname_from_oparg=None,
argrepr = ''
positions = Positions(*next(co_positions, ()))
deop = _deoptop(op)
- cache_counter = _inline_cache_entries[deop]
if arg is not None:
# Set argval to the dereferenced value of the argument when
# available, and argrepr to the string representation of argval.
@@ -497,7 +492,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None,
yield Instruction(_all_opname[op], op,
arg, argval, argrepr,
offset, starts_line, is_jump_target, positions)
- if show_caches and cache_counter:
+ if show_caches and _inline_cache_entries[deop]:
for name, caches in _cache_format[opname[deop]].items():
data = code[offset + 2: offset + 2 + caches * 2]
argrepr = f"{name}: {int.from_bytes(data, sys.byteorder)}"
@@ -586,9 +581,16 @@ def _disassemble_str(source, **kwargs):
def _unpack_opargs(code):
extended_arg = 0
+ caches = 0
for i in range(0, len(code), 2):
+ # Skip inline CACHE entries:
+ if caches:
+ caches -= 1
+ continue
op = code[i]
- if _deoptop(op) >= HAVE_ARGUMENT:
+ deop = _deoptop(op)
+ 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
# The oparg is stored as a signed integer
diff --git a/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst b/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst
new file mode 100644
index 0000000000000..0e683070806c2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst
@@ -0,0 +1,2 @@
+Fix an issue where :mod:`dis` utilities may interpret populated inline cache
+entries as valid instructions.
More information about the Python-checkins
mailing list