Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adaptive opcodes neglect EXTENDED_ARG #91625

Closed
sweeneyde opened this issue Apr 17, 2022 · 3 comments
Closed

Adaptive opcodes neglect EXTENDED_ARG #91625

sweeneyde opened this issue Apr 17, 2022 · 3 comments
Labels
3.11 interpreter-core release-blocker type-bug

Comments

@sweeneyde
Copy link
Member

@sweeneyde sweeneyde commented Apr 17, 2022

Reproducer:

def f(x):
    # UNPACK_SEQUENCE 400
    # is actually
    #     EXTENDED_ARG 1
    #     UNPACK_SEQUENCE 144
    (
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
    ) = x

# 0..7 get printed out before we get 
# ValueError: too many values to unpack (expected 144)
for i in range(30):
    print(i)
    f(range(400))

This is the problematic bit of C code:

                next_instr--;
                _Py_Specialize_UnpackSequence(seq, next_instr, oparg);
                DISPATCH();
@sweeneyde sweeneyde added the type-bug label Apr 17, 2022
@sweeneyde
Copy link
Member Author

@sweeneyde sweeneyde commented Apr 17, 2022

@sweeneyde
Copy link
Member Author

@sweeneyde sweeneyde commented Apr 17, 2022

Similar thing for LOAD_GLOBAL:

code = """
def f():
    y=(a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16+a17+a18+a19+
    a20+a21+a22+a23+a24+a25+a26+a27+a28+a29+a30+a31+a32+a33+a34+a35+a36+a37+a38+a39+
    a40+a41+a42+a43+a44+a45+a46+a47+a48+a49+a50+a51+a52+a53+a54+a55+a56+a57+a58+a59+
    a60+a61+a62+a63+a64+a65+a66+a67+a68+a69+a70+a71+a72+a73+a74+a75+a76+a77+a78+a79+
    a80+a81+a82+a83+a84+a85+a86+a87+a88+a89+a90+a91+a92+a93+a94+a95+a96+a97+a98+a99+
    a100+a101+a102+a103+a104+a105+a106+a107+a108+a109+a110+a111+a112+a113+a114+a115+a116+a117+a118+a119+
    a120+a121+a122+a123+a124+a125+a126+a127+a128+a129+a130+a131+a132+a133+a134+a135+a136+a137+a138+a139+
    a140+a141+a142+a143+a144+a145+a146+a147+a148+a149+a150+a151+a152+a153+a154+a155+a156+a157+a158+a159+
    a160+a161+a162+a163+a164+a165+a166+a167+a168+a169+a170+a171+a172+a173+a174+a175+a176+a177+a178+a179+
    a180+a181+a182+a183+a184+a185+a186+a187+a188+a189+a190+a191+a192+a193+a194+a195+a196+a197+a198+a199+
    a200+a201+a202+a203+a204+a205+a206+a207+a208+a209+a210+a211+a212+a213+a214+a215+a216+a217+a218+a219+
    a220+a221+a222+a223+a224+a225+a226+a227+a228+a229+a230+a231+a232+a233+a234+a235+a236+a237+a238+a239+
    a240+a241+a242+a243+a244+a245+a246+a247+a248+a249+a250+a251+a252+a253+a254+a255+a256+a257+a258+a259+
    a260+a261+a262+a263+a264+a265+a266+a267+a268+a269+a270+a271+a272+a273+a274+a275+a276+a277+a278+a279+
    a280+a281+a282+a283+a284+a285+a286+a287+a288+a289+a290+a291+a292+a293+a294+a295+a296+a297+a298+a299+
    a300+a301+a302+a303+a304+a305+a306+a307+a308+a309+a310+a311+a312+a313+a314+a315+a316+a317+a318+a319)
    return y
"""
class D(dict):
    def __missing__(self, key):
        return int(key.removeprefix("a"))
ns = D()
exec(code, ns)
f = ns["f"]

for i in range(12):
    print(f())
# 51040
# 51040
# 51040
# 51040
# 51040
# 51040
# 51040
# 18272
# 51040
# 51040
# 51040
# 51040

@sweeneyde
Copy link
Member Author

@sweeneyde sweeneyde commented Apr 17, 2022

Same thing with LOAD_ATTR:

class A:
    def __getattr__(self, attr):
        return int(attr.removeprefix("a"))
a = A()

def f():
    y=(a.a0+a.a1+a.a2+a.a3+a.a4+a.a5+a.a6+a.a7+a.a8+a.a9+a.a10+a.a11+a.a12+a.a13+a.a14+a.a15+a.a16+a.a17+a.a18+a.a19+
    a.a20+a.a21+a.a22+a.a23+a.a24+a.a25+a.a26+a.a27+a.a28+a.a29+a.a30+a.a31+a.a32+a.a33+a.a34+a.a35+a.a36+a.a37+a.a38+a.a39+
    a.a40+a.a41+a.a42+a.a43+a.a44+a.a45+a.a46+a.a47+a.a48+a.a49+a.a50+a.a51+a.a52+a.a53+a.a54+a.a55+a.a56+a.a57+a.a58+a.a59+
    a.a60+a.a61+a.a62+a.a63+a.a64+a.a65+a.a66+a.a67+a.a68+a.a69+a.a70+a.a71+a.a72+a.a73+a.a74+a.a75+a.a76+a.a77+a.a78+a.a79+
    a.a80+a.a81+a.a82+a.a83+a.a84+a.a85+a.a86+a.a87+a.a88+a.a89+a.a90+a.a91+a.a92+a.a93+a.a94+a.a95+a.a96+a.a97+a.a98+a.a99+
    a.a100+a.a101+a.a102+a.a103+a.a104+a.a105+a.a106+a.a107+a.a108+a.a109+a.a110+a.a111+a.a112+a.a113+a.a114+a.a115+a.a116+a.a117+a.a118+a.a119+
    a.a120+a.a121+a.a122+a.a123+a.a124+a.a125+a.a126+a.a127+a.a128+a.a129+a.a130+a.a131+a.a132+a.a133+a.a134+a.a135+a.a136+a.a137+a.a138+a.a139+
    a.a140+a.a141+a.a142+a.a143+a.a144+a.a145+a.a146+a.a147+a.a148+a.a149+a.a150+a.a151+a.a152+a.a153+a.a154+a.a155+a.a156+a.a157+a.a158+a.a159+
    a.a160+a.a161+a.a162+a.a163+a.a164+a.a165+a.a166+a.a167+a.a168+a.a169+a.a170+a.a171+a.a172+a.a173+a.a174+a.a175+a.a176+a.a177+a.a178+a.a179+
    a.a180+a.a181+a.a182+a.a183+a.a184+a.a185+a.a186+a.a187+a.a188+a.a189+a.a190+a.a191+a.a192+a.a193+a.a194+a.a195+a.a196+a.a197+a.a198+a.a199+
    a.a200+a.a201+a.a202+a.a203+a.a204+a.a205+a.a206+a.a207+a.a208+a.a209+a.a210+a.a211+a.a212+a.a213+a.a214+a.a215+a.a216+a.a217+a.a218+a.a219+
    a.a220+a.a221+a.a222+a.a223+a.a224+a.a225+a.a226+a.a227+a.a228+a.a229+a.a230+a.a231+a.a232+a.a233+a.a234+a.a235+a.a236+a.a237+a.a238+a.a239+
    a.a240+a.a241+a.a242+a.a243+a.a244+a.a245+a.a246+a.a247+a.a248+a.a249+a.a250+a.a251+a.a252+a.a253+a.a254+a.a255+a.a256+a.a257+a.a258+a.a259+
    a.a260+a.a261+a.a262+a.a263+a.a264+a.a265+a.a266+a.a267+a.a268+a.a269+a.a270+a.a271+a.a272+a.a273+a.a274+a.a275+a.a276+a.a277+a.a278+a.a279+
    a.a280+a.a281+a.a282+a.a283+a.a284+a.a285+a.a286+a.a287+a.a288+a.a289+a.a290+a.a291+a.a292+a.a293+a.a294+a.a295+a.a296+a.a297+a.a298+a.a299)
    return y

for i in range(12):
    print(f())
# 44850
# 44850
# 44850
# 44850
# 44850
# 44850
# 44850
# Traceback (most recent call last):
#   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 26, in <module>
#     print(f())
#           ^^^
#   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 20, in f
#     a.a240+a.a241+a.a242+a.a243+a.a244+a.a245+a.a246+a.a247+a.a248+a.a249+a.a250+a.a251+a.a252+a.a253+a.a254+a.a255+a.a256+a.a257+a.a258+a.a259+
#                                                                                                              ^^^^^^
#   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 4, in __getattr__
#     return int(attr.removeprefix("a"))
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# ValueError: invalid literal for int() with base 10: ''

@sweeneyde sweeneyde changed the title UNPACK_SEQUENCE specializations neglect EXTENDED_ARG Adaptive opcodes neglect EXTENDED_ARG Apr 17, 2022
@sweeneyde sweeneyde added interpreter-core 3.11 labels Apr 17, 2022
@sweeneyde sweeneyde closed this Apr 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.11 interpreter-core release-blocker type-bug
Projects
None yet
Development

No branches or pull requests

1 participant