bpo-46724: Fix dis support for overflow args (GH-31285)

This commit is contained in:
Saul Shanabrook 2022-02-18 04:56:23 -05:00 committed by GitHub
parent 2923d87ca2
commit c3ce7781e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 5 deletions

View file

@ -515,6 +515,12 @@ def _disassemble_str(source, **kwargs):
disco = disassemble # XXX For backwards compatibility
# Rely on C `int` being 32 bits for oparg
_INT_BITS = 32
# Value for c int when it overflows
_INT_OVERFLOW = 2 ** (_INT_BITS - 1)
def _unpack_opargs(code):
extended_arg = 0
for i in range(0, len(code), 2):
@ -522,6 +528,11 @@ def _unpack_opargs(code):
if op >= 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
# If the value exceeds its upper limit, it will overflow and wrap
# to a negative integer
if extended_arg >= _INT_OVERFLOW:
extended_arg -= 2 * _INT_OVERFLOW
else:
arg = None
extended_arg = 0