Skip to content

Commit af99ebc

Browse files
authored
[mypyc] Fix type of for loop index register in for over range (python#9634)
It sometimes was short int even though it should have been int.
1 parent 8fd20eb commit af99ebc

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

mypyc/irbuild/for_helpers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818
from mypyc.ir.rtypes import (
1919
RType, is_short_int_rprimitive, is_list_rprimitive, is_sequence_rprimitive,
20-
RTuple, is_dict_rprimitive, short_int_rprimitive
20+
RTuple, is_dict_rprimitive, short_int_rprimitive, int_rprimitive
2121
)
2222
from mypyc.primitives.registry import CFunctionDescription
2323
from mypyc.primitives.dict_ops import (
@@ -605,7 +605,11 @@ def init(self, start_reg: Value, end_reg: Value, step: int) -> None:
605605
self.end_reg = end_reg
606606
self.step = step
607607
self.end_target = builder.maybe_spill(end_reg)
608-
index_reg = builder.alloc_temp(start_reg.type)
608+
if is_short_int_rprimitive(start_reg.type) and is_short_int_rprimitive(end_reg.type):
609+
index_type = short_int_rprimitive
610+
else:
611+
index_type = int_rprimitive
612+
index_reg = builder.alloc_temp(index_type)
609613
builder.assign(index_reg, start_reg, -1)
610614
self.index_reg = builder.maybe_spill_assignable(index_reg)
611615
# Initialize loop index to 0. Assert that the index target is assignable.

mypyc/test-data/irbuild-statements.test

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,47 @@ L3:
2929
L4:
3030
return 1
3131

32+
[case testForInRangeVariableEndIndxe]
33+
def f(a: int) -> None:
34+
for i in range(a):
35+
pass
36+
[out]
37+
def f(a):
38+
a, r0, i :: int
39+
r1 :: bool
40+
r2 :: native_int
41+
r3 :: bit
42+
r4 :: native_int
43+
r5, r6, r7, r8 :: bit
44+
r9 :: int
45+
L0:
46+
r0 = 0
47+
i = r0
48+
L1:
49+
r2 = r0 & 1
50+
r3 = r2 == 0
51+
r4 = a & 1
52+
r5 = r4 == 0
53+
r6 = r3 & r5
54+
if r6 goto L2 else goto L3 :: bool
55+
L2:
56+
r7 = r0 < a :: signed
57+
r1 = r7
58+
goto L4
59+
L3:
60+
r8 = CPyTagged_IsLt_(r0, a)
61+
r1 = r8
62+
L4:
63+
if r1 goto L5 else goto L7 :: bool
64+
L5:
65+
L6:
66+
r9 = CPyTagged_Add(r0, 2)
67+
r0 = r9
68+
i = r9
69+
goto L1
70+
L7:
71+
return 1
72+
3273
[case testForInNegativeRange]
3374
def f() -> None:
3475
for i in range(10, 0, -1):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy