Skip to content

Commit 9941d54

Browse files
committed
feat: handle native calls and primitive ops
1 parent eae9209 commit 9941d54

File tree

2 files changed

+46
-72
lines changed

2 files changed

+46
-72
lines changed

mypyc/irbuild/for_helpers.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,10 +1169,11 @@ def need_cleanup(self) -> bool:
11691169
return True
11701170

11711171
def init(self, index: Lvalue, func: Expression, iterable: Expression) -> None:
1172+
self.filter_func_def = func
11721173
if isinstance(func, NameExpr) and isinstance(func.node, Var) and func.node.fullname == "builtins.None":
1173-
self.filter_func = None
1174+
self.filter_func_val = None
11741175
else:
1175-
self.filter_func = self.builder.accept(func)
1176+
self.filter_func_val = self.builder.accept(func)
11761177
self.iterable = iterable
11771178
self.index = index
11781179

@@ -1198,11 +1199,20 @@ def begin_body(self) -> None:
11981199
builder = self.builder
11991200
line = self.line
12001201
item = builder.read(builder.get_assignment_target(self.index), line)
1201-
if self.filter_func is None:
1202+
1203+
if self.filter_func_val is None:
12021204
result = item
12031205
else:
1204-
# TODO: implement logic to handle c calls of native functions
1205-
result = builder.py_call(self.filter_func, [item], line)
1206+
fake_call_expr = CallExpr(
1207+
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+
],
1212+
[ARG_POS],
1213+
[None],
1214+
)
1215+
result = builder.call_refexpr_with_args(fake_call_expr, self.filter_func_def, [item])
12061216

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

mypyc/test-data/irbuild-basic.test

Lines changed: 31 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -3573,15 +3573,9 @@ def g(a):
35733573
r5 :: bit
35743574
r6 :: object
35753575
r7, x :: int
3576-
r8 :: object
3577-
r9 :: object[1]
3578-
r10 :: object_ptr
3579-
r11 :: object
3580-
r12 :: i32
3581-
r13 :: bit
3582-
r14 :: bool
3583-
r15 :: int
3584-
r16 :: native_int
3576+
r8 :: bool
3577+
r9 :: int
3578+
r10 :: native_int
35853579
L0:
35863580
s = 0
35873581
r0 = __main__.globals :: static
@@ -3596,23 +3590,16 @@ L2:
35963590
r6 = list_get_item_unsafe a, r3
35973591
r7 = unbox(int, r6)
35983592
x = r7
3599-
r8 = box(int, x)
3600-
r9 = [r8]
3601-
r10 = load_address r9
3602-
r11 = PyObject_Vectorcall(r2, r10, 1, 0)
3603-
keep_alive r8
3604-
r12 = PyObject_IsTrue(r11)
3605-
r13 = r12 >= 0 :: signed
3606-
r14 = truncate r12: i32 to builtins.bool
3607-
if r14 goto L4 else goto L3 :: bool
3593+
r8 = f(x)
3594+
if r8 goto L4 else goto L3 :: bool
36083595
L3:
36093596
goto L5
36103597
L4:
3611-
r15 = CPyTagged_Add(s, x)
3612-
s = r15
3598+
r9 = CPyTagged_Add(s, x)
3599+
s = r9
36133600
L5:
3614-
r16 = r3 + 1
3615-
r3 = r16
3601+
r10 = r3 + 1
3602+
r3 = r10
36163603
goto L1
36173604
L6:
36183605
L7:
@@ -3641,16 +3628,10 @@ def g(a):
36413628
r3, r4 :: native_int
36423629
r5 :: bit
36433630
r6 :: object
3644-
r7, x :: int
3645-
r8 :: object
3646-
r9 :: object[1]
3647-
r10 :: object_ptr
3648-
r11 :: object
3649-
r12 :: i32
3650-
r13 :: bit
3651-
r14 :: bool
3652-
r15 :: int
3653-
r16 :: native_int
3631+
r7, x, r8 :: int
3632+
r9 :: bit
3633+
r10 :: int
3634+
r11 :: native_int
36543635
L0:
36553636
s = 0
36563637
r0 = __main__.globals :: static
@@ -3665,23 +3646,17 @@ L2:
36653646
r6 = list_get_item_unsafe a, r3
36663647
r7 = unbox(int, r6)
36673648
x = r7
3668-
r8 = box(int, x)
3669-
r9 = [r8]
3670-
r10 = load_address r9
3671-
r11 = PyObject_Vectorcall(r2, r10, 1, 0)
3672-
keep_alive r8
3673-
r12 = PyObject_IsTrue(r11)
3674-
r13 = r12 >= 0 :: signed
3675-
r14 = truncate r12: i32 to builtins.bool
3676-
if r14 goto L4 else goto L3 :: bool
3649+
r8 = f(x)
3650+
r9 = r8 != 0
3651+
if r9 goto L4 else goto L3 :: bool
36773652
L3:
36783653
goto L5
36793654
L4:
3680-
r15 = CPyTagged_Add(s, x)
3681-
s = r15
3655+
r10 = CPyTagged_Add(s, x)
3656+
s = r10
36823657
L5:
3683-
r16 = r3 + 1
3684-
r3 = r16
3658+
r11 = r3 + 1
3659+
r3 = r11
36853660
goto L1
36863661
L6:
36873662
L7:
@@ -3713,15 +3688,10 @@ def g(a):
37133688
r5 :: bit
37143689
r6 :: object
37153690
r7, x :: int
3716-
r8 :: object
3717-
r9 :: object[1]
3718-
r10 :: object_ptr
3719-
r11 :: object
3720-
r12 :: i32
3721-
r13 :: bit
3722-
r14 :: bool
3723-
r15 :: int
3724-
r16 :: native_int
3691+
r8 :: str
3692+
r9 :: bit
3693+
r10 :: int
3694+
r11 :: native_int
37253695
L0:
37263696
s = 0
37273697
r0 = __main__.globals :: static
@@ -3736,23 +3706,17 @@ L2:
37363706
r6 = list_get_item_unsafe a, r3
37373707
r7 = unbox(int, r6)
37383708
x = r7
3739-
r8 = box(int, x)
3740-
r9 = [r8]
3741-
r10 = load_address r9
3742-
r11 = PyObject_Vectorcall(r2, r10, 1, 0)
3743-
keep_alive r8
3744-
r12 = PyObject_IsTrue(r11)
3745-
r13 = r12 >= 0 :: signed
3746-
r14 = truncate r12: i32 to builtins.bool
3747-
if r14 goto L4 else goto L3 :: bool
3709+
r8 = f(x)
3710+
r9 = CPyStr_IsTrue(r8)
3711+
if r9 goto L4 else goto L3 :: bool
37483712
L3:
37493713
goto L5
37503714
L4:
3751-
r15 = CPyTagged_Add(s, x)
3752-
s = r15
3715+
r10 = CPyTagged_Add(s, x)
3716+
s = r10
37533717
L5:
3754-
r16 = r3 + 1
3755-
r3 = r16
3718+
r11 = r3 + 1
3719+
r3 = r11
37563720
goto L1
37573721
L6:
37583722
L7:

0 commit comments

Comments
 (0)