In Python 3.11b0, dis.dis() and dis.get_instructions() will show the "wrong" operand values for instructions prefixed by EXTENDED_ARG_QUICK.
| deop=_deoptop(op) |
| caches=_inline_cache_entries[deop] |
| ifdeop>=HAVE_ARGUMENT: |
| arg=code[i+1] |extended_arg |
| extended_arg= (arg<<8) ifop==EXTENDED_ARGelse0 |
The bug is that this line only checks for EXTENDED_ARG instructions. It should check for instructions that deoptimize to EXTENDED_ARG (i.e. deop == EXTENDED_ARG).
| extended_arg= (arg<<8) ifop==EXTENDED_ARGelse0 |
To reproduce the issue, consider this snippet adapted from cloudpickle:
importrandomimporttextwrapimportdisnvars=65537+258names= ['g%d'%iforiinrange(1, nvars)]
r=random.Random(42)
d= {name: r.randrange(100) fornameinnames}
# def f(x):# x = g1, g2, ...code="""def f(): x = {tup}""".format(tup=', '.join(names))
exec(textwrap.dedent(code), d, d)
f=d['f']
dis.dis(f)
In Python 3.11b0,
dis.dis()anddis.get_instructions()will show the "wrong" operand values for instructions prefixed by EXTENDED_ARG_QUICK.cpython/Lib/dis.py
Lines 591 to 595 in a4460f2
The bug is that this line only checks for
EXTENDED_ARGinstructions. It should check for instructions that deoptimize toEXTENDED_ARG(i.e.deop == EXTENDED_ARG).cpython/Lib/dis.py
Line 595 in a4460f2
To reproduce the issue, consider this snippet adapted from cloudpickle: