Skip to content

Commit c39bb4a

Browse files
committed
feat: use speciailizers
1 parent 5bf4b22 commit c39bb4a

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

mypyc/irbuild/for_helpers.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,14 +1205,17 @@ def begin_body(self) -> None:
12051205
else:
12061206
fake_call_expr = CallExpr(
12071207
self.filter_func_def,
1208-
[
1209-
# this is unused in call_refexpr_with_args which is good because
1210-
# we don't have an Expression to put here. But it works just fine.
1211-
],
1208+
[self.index],
12121209
[ARG_POS],
12131210
[None],
12141211
)
1215-
result = builder.call_refexpr_with_args(fake_call_expr, self.filter_func_def, [item])
1212+
1213+
builder.types[fake_call_expr] = builder.types[self.index]
1214+
1215+
# I put this here to prevent a circular import
1216+
from mypyc.irbuild.expression import transform_call_expr
1217+
1218+
result = transform_call_expr(builder, fake_call_expr)
12161219

12171220
# Now, filter: only enter the body if func(item) is truthy
12181221
cont_block, rest_block = BasicBlock(), BasicBlock()

mypyc/test-data/irbuild-basic.test

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3730,51 +3730,46 @@ def f(a: list[list[int]]) -> int:
37303730
return s
37313731
[out]
37323732
def f(a):
3733-
x, r0 :: int
3734-
r1 :: str
3735-
L0:
3736-
r0 = CPyTagged_Remainder(x, 4)
3737-
r1 = CPyTagged_Str(r0)
3738-
return r1
3739-
def g(a):
37403733
a :: list
37413734
s :: int
3742-
r0 :: dict
3735+
r0 :: object
37433736
r1 :: str
37443737
r2 :: object
37453738
r3, r4 :: native_int
37463739
r5 :: bit
37473740
r6 :: object
3748-
r7, x :: int
3749-
r8 :: str
3750-
r9 :: bit
3751-
r10 :: int
3752-
r11 :: native_int
3741+
r7, x :: list
3742+
r8 :: native_int
3743+
r9 :: short_int
3744+
r10 :: bit
3745+
r11 :: int
3746+
r12 :: native_int
37533747
L0:
37543748
s = 0
3755-
r0 = __main__.globals :: static
3756-
r1 = 'f'
3757-
r2 = CPyDict_GetItem(r0, r1)
3749+
r0 = builtins :: module
3750+
r1 = 'len'
3751+
r2 = CPyObject_GetAttr(r0, r1)
37583752
r3 = 0
37593753
L1:
37603754
r4 = var_object_size a
37613755
r5 = r3 < r4 :: signed
37623756
if r5 goto L2 else goto L6 :: bool
37633757
L2:
37643758
r6 = list_get_item_unsafe a, r3
3765-
r7 = unbox(int, r6)
3759+
r7 = cast(list, r6)
37663760
x = r7
3767-
r8 = f(x)
3768-
r9 = CPyStr_IsTrue(r8)
3769-
if r9 goto L4 else goto L3 :: bool
3761+
r8 = var_object_size x
3762+
r9 = r8 << 1
3763+
r10 = r9 != 0
3764+
if r10 goto L4 else goto L3 :: bool
37703765
L3:
37713766
goto L5
37723767
L4:
3773-
r10 = CPyTagged_Add(s, x)
3774-
s = r10
3768+
r11 = CPyTagged_Add(s, 2)
3769+
s = r11
37753770
L5:
3776-
r11 = r3 + 1
3777-
r3 = r11
3771+
r12 = r3 + 1
3772+
r3 = r12
37783773
goto L1
37793774
L6:
37803775
L7:

0 commit comments

Comments
 (0)