diff options
author | Brandt Bucher <brandtbucher@gmail.com> | 2022-05-06 17:57:08 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-06 17:57:08 (GMT) |
commit | 3f61db475692511a9676765e6f9f0bb204306e93 (patch) | |
tree | 6f849144d9b5298dc52f7780ff2931f549ab89b7 /Lib/dis.py | |
parent | 50210643902d28405a57a9672347f43215dbdb3b (diff) | |
download | cpython-3f61db475692511a9676765e6f9f0bb204306e93.zip cpython-3f61db475692511a9676765e6f9f0bb204306e93.tar.gz cpython-3f61db475692511a9676765e6f9f0bb204306e93.tar.bz2 |
gh-90997: Move `CACHE` handling into `_unpack_opargs` (#92409)
* Move CACHE handling into _unpack_opargs
* Remove auto-added import
* blurb add
Diffstat (limited to 'Lib/dis.py')
-rw-r--r-- | Lib/dis.py | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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 @@ _INT_OVERFLOW = 2 ** (_INT_BITS - 1) 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 |