Skip to content

Commit a810e0c

Browse files
authored
[mypyc] translate call_emit primitive ops to CallC (#9012)
Related issue: mypyc/mypyc#734 This PR translates PrimitiveOps with call_emit, which can be represented by CallC pretty straightforwardly, to CallC. Mostly translating the description. After this PR and another following PR which handles the ones whose descriptions are explicitly used in irbuild, we'll able to see what's missing for CallC by analyzing the remaining primitives.
1 parent 8577ea4 commit a810e0c

File tree

12 files changed

+113
-116
lines changed

12 files changed

+113
-116
lines changed

mypyc/primitives/dict_ops.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from mypyc.primitives.registry import (
1212
name_ref_op, method_op, binary_op, func_op, custom_op,
1313
simple_emit, negative_int_emit, call_emit, call_negative_bool_emit,
14-
name_emit, c_custom_op
14+
name_emit, c_custom_op, c_method_op
1515
)
1616

1717

@@ -73,12 +73,12 @@
7373
emit=call_negative_bool_emit('CPyDict_UpdateFromAny'))
7474

7575
# dict.get(key, default)
76-
method_op(
76+
c_method_op(
7777
name='get',
7878
arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive],
79-
result_type=object_rprimitive,
80-
error_kind=ERR_MAGIC,
81-
emit=call_emit('CPyDict_Get'))
79+
return_type=object_rprimitive,
80+
c_function_name='CPyDict_Get',
81+
error_kind=ERR_MAGIC)
8282

8383
# dict.get(key)
8484
method_op(
@@ -115,6 +115,7 @@
115115
priority=2)
116116

117117
# Generic one-argument dict constructor: dict(obj)
118+
118119
func_op(
119120
name='builtins.dict',
120121
arg_types=[object_rprimitive],
@@ -123,31 +124,28 @@
123124
emit=call_emit('CPyDict_FromAny'))
124125

125126
# dict.keys()
126-
method_op(
127+
c_method_op(
127128
name='keys',
128129
arg_types=[dict_rprimitive],
129-
result_type=object_rprimitive,
130-
error_kind=ERR_MAGIC,
131-
emit=call_emit('CPyDict_KeysView')
132-
)
130+
return_type=object_rprimitive,
131+
c_function_name='CPyDict_KeysView',
132+
error_kind=ERR_MAGIC)
133133

134134
# dict.values()
135-
method_op(
135+
c_method_op(
136136
name='values',
137137
arg_types=[dict_rprimitive],
138-
result_type=object_rprimitive,
139-
error_kind=ERR_MAGIC,
140-
emit=call_emit('CPyDict_ValuesView')
141-
)
138+
return_type=object_rprimitive,
139+
c_function_name='CPyDict_ValuesView',
140+
error_kind=ERR_MAGIC)
142141

143142
# dict.items()
144-
method_op(
143+
c_method_op(
145144
name='items',
146145
arg_types=[dict_rprimitive],
147-
result_type=object_rprimitive,
148-
error_kind=ERR_MAGIC,
149-
emit=call_emit('CPyDict_ItemsView')
150-
)
146+
return_type=object_rprimitive,
147+
c_function_name='CPyDict_ItemsView',
148+
error_kind=ERR_MAGIC)
151149

152150
# list(dict.keys())
153151
dict_keys_op = custom_op(

mypyc/primitives/int_ops.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
str_rprimitive, RType
1313
)
1414
from mypyc.primitives.registry import (
15-
name_ref_op, binary_op, func_op, custom_op,
16-
simple_emit, call_emit, name_emit, c_unary_op, CFunctionDescription
15+
name_ref_op, binary_op, custom_op, simple_emit, call_emit, name_emit,
16+
c_unary_op, CFunctionDescription, c_function_op
1717
)
1818

1919
# These int constructors produce object_rprimitives that then need to be unboxed
@@ -28,47 +28,46 @@
2828
is_borrowed=True)
2929

3030
# Convert from a float to int. We could do a bit better directly.
31-
func_op(
31+
c_function_op(
3232
name='builtins.int',
3333
arg_types=[float_rprimitive],
34-
result_type=object_rprimitive,
35-
error_kind=ERR_MAGIC,
36-
emit=call_emit('CPyLong_FromFloat'),
37-
priority=1)
34+
return_type=object_rprimitive,
35+
c_function_name='CPyLong_FromFloat',
36+
error_kind=ERR_MAGIC)
3837

3938
# int(string)
40-
func_op(
39+
c_function_op(
4140
name='builtins.int',
4241
arg_types=[str_rprimitive],
43-
result_type=object_rprimitive,
44-
error_kind=ERR_MAGIC,
45-
emit=call_emit('CPyLong_FromStr'),
46-
priority=1)
42+
return_type=object_rprimitive,
43+
c_function_name='CPyLong_FromStr',
44+
error_kind=ERR_MAGIC)
4745

4846
# int(string, base)
49-
func_op(
47+
c_function_op(
5048
name='builtins.int',
5149
arg_types=[str_rprimitive, int_rprimitive],
52-
result_type=object_rprimitive,
53-
error_kind=ERR_MAGIC,
54-
emit=call_emit('CPyLong_FromStrWithBase'),
55-
priority=1)
50+
return_type=object_rprimitive,
51+
c_function_name='CPyLong_FromStrWithBase',
52+
error_kind=ERR_MAGIC)
5653

5754
# str(n) on ints
58-
func_op(name='builtins.str',
59-
arg_types=[int_rprimitive],
60-
result_type=str_rprimitive,
61-
error_kind=ERR_MAGIC,
62-
emit=call_emit('CPyTagged_Str'),
63-
priority=2)
55+
c_function_op(
56+
name='builtins.str',
57+
arg_types=[int_rprimitive],
58+
return_type=str_rprimitive,
59+
c_function_name='CPyTagged_Str',
60+
error_kind=ERR_MAGIC,
61+
priority=2)
6462

6563
# We need a specialization for str on bools also since the int one is wrong...
66-
func_op(name='builtins.str',
67-
arg_types=[bool_rprimitive],
68-
result_type=str_rprimitive,
69-
error_kind=ERR_MAGIC,
70-
emit=call_emit('CPyBool_Str'),
71-
priority=3)
64+
c_function_op(
65+
name='builtins.str',
66+
arg_types=[bool_rprimitive],
67+
return_type=str_rprimitive,
68+
c_function_name='CPyBool_Str',
69+
error_kind=ERR_MAGIC,
70+
priority=3)
7271

7372

7473
def int_binary_op(op: str, c_func_name: str,

mypyc/primitives/list_ops.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
)
99
from mypyc.primitives.registry import (
1010
name_ref_op, func_op, method_op, custom_op, name_emit,
11-
call_emit, call_negative_bool_emit, c_function_op, c_binary_op
11+
call_emit, call_negative_bool_emit, c_function_op, c_binary_op, c_method_op
1212
)
1313

1414

@@ -117,19 +117,20 @@ def emit_new(emitter: EmitterInterface, args: List[str], dest: str) -> None:
117117
emit=call_emit('CPyList_Pop'))
118118

119119
# list.count(obj)
120-
method_op(
120+
c_method_op(
121121
name='count',
122122
arg_types=[list_rprimitive, object_rprimitive],
123-
result_type=short_int_rprimitive,
124-
error_kind=ERR_MAGIC,
125-
emit=call_emit('CPyList_Count'))
123+
return_type=short_int_rprimitive,
124+
c_function_name='CPyList_Count',
125+
error_kind=ERR_MAGIC)
126126

127127
# list * int
128-
c_binary_op(name='*',
129-
arg_types=[list_rprimitive, int_rprimitive],
130-
return_type=list_rprimitive,
131-
c_function_name='CPySequence_Multiply',
132-
error_kind=ERR_MAGIC)
128+
c_binary_op(
129+
name='*',
130+
arg_types=[list_rprimitive, int_rprimitive],
131+
return_type=list_rprimitive,
132+
c_function_name='CPySequence_Multiply',
133+
error_kind=ERR_MAGIC)
133134

134135
# int * list
135136
c_binary_op(name='*',

mypyc/primitives/misc_ops.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
)
88
from mypyc.primitives.registry import (
99
name_ref_op, simple_emit, unary_op, func_op, custom_op, call_emit, name_emit,
10-
call_negative_magic_emit
10+
call_negative_magic_emit, c_function_op
1111
)
1212

1313

@@ -53,11 +53,12 @@
5353
is_borrowed=True)
5454

5555
# id(obj)
56-
func_op(name='builtins.id',
57-
arg_types=[object_rprimitive],
58-
result_type=int_rprimitive,
59-
error_kind=ERR_NEVER,
60-
emit=call_emit('CPyTagged_Id'))
56+
c_function_op(
57+
name='builtins.id',
58+
arg_types=[object_rprimitive],
59+
return_type=int_rprimitive,
60+
c_function_name='CPyTagged_Id',
61+
error_kind=ERR_NEVER)
6162

6263
# Return the result of obj.__await()__ or obj.__iter__() (if no __await__ exists)
6364
coro_op = custom_op(name='get_coroutine_obj',

mypyc/primitives/set_ops.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Primitive set (and frozenset) ops."""
22

33
from mypyc.primitives.registry import (
4-
func_op, method_op, binary_op,
5-
simple_emit, negative_int_emit, call_emit, call_negative_bool_emit,
4+
func_op, method_op, binary_op, simple_emit, negative_int_emit,
5+
call_negative_bool_emit, c_function_op, c_method_op
66
)
77
from mypyc.ir.ops import ERR_MAGIC, ERR_FALSE, ERR_NEVER, EmitterInterface
88
from mypyc.ir.rtypes import object_rprimitive, bool_rprimitive, set_rprimitive, int_rprimitive
@@ -19,22 +19,20 @@
1919
)
2020

2121
# set(obj)
22-
func_op(
22+
c_function_op(
2323
name='builtins.set',
2424
arg_types=[object_rprimitive],
25-
result_type=set_rprimitive,
26-
error_kind=ERR_MAGIC,
27-
emit=call_emit('PySet_New')
28-
)
25+
return_type=set_rprimitive,
26+
c_function_name='PySet_New',
27+
error_kind=ERR_MAGIC)
2928

3029
# frozenset(obj)
31-
func_op(
30+
c_function_op(
3231
name='builtins.frozenset',
3332
arg_types=[object_rprimitive],
34-
result_type=object_rprimitive,
35-
error_kind=ERR_MAGIC,
36-
emit=call_emit('PyFrozenSet_New')
37-
)
33+
return_type=object_rprimitive,
34+
c_function_name='PyFrozenSet_New',
35+
error_kind=ERR_MAGIC)
3836

3937

4038
def emit_len(emitter: EmitterInterface, args: List[str], dest: str) -> None:
@@ -64,13 +62,12 @@ def emit_len(emitter: EmitterInterface, args: List[str], dest: str) -> None:
6462
)
6563

6664
# set.remove(obj)
67-
method_op(
65+
c_method_op(
6866
name='remove',
6967
arg_types=[set_rprimitive, object_rprimitive],
70-
result_type=bool_rprimitive,
71-
error_kind=ERR_FALSE,
72-
emit=call_emit('CPySet_Remove')
73-
)
68+
return_type=bool_rprimitive,
69+
c_function_name='CPySet_Remove',
70+
error_kind=ERR_FALSE)
7471

7572
# set.discard(obj)
7673
method_op(
@@ -111,10 +108,9 @@ def emit_len(emitter: EmitterInterface, args: List[str], dest: str) -> None:
111108
)
112109

113110
# set.pop()
114-
method_op(
111+
c_method_op(
115112
name='pop',
116113
arg_types=[set_rprimitive],
117-
result_type=object_rprimitive,
118-
error_kind=ERR_MAGIC,
119-
emit=call_emit('PySet_Pop')
120-
)
114+
return_type=object_rprimitive,
115+
c_function_name='PySet_Pop',
116+
error_kind=ERR_MAGIC)

mypyc/primitives/str_ops.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
RType, object_rprimitive, str_rprimitive, bool_rprimitive, int_rprimitive, list_rprimitive
88
)
99
from mypyc.primitives.registry import (
10-
func_op, binary_op, simple_emit, name_ref_op, method_op, call_emit, name_emit,
11-
c_method_op, c_binary_op
10+
binary_op, simple_emit, name_ref_op, method_op, call_emit, name_emit,
11+
c_method_op, c_binary_op, c_function_op
1212
)
1313

1414

@@ -20,18 +20,19 @@
2020
is_borrowed=True)
2121

2222
# str(obj)
23-
func_op(name='builtins.str',
24-
arg_types=[object_rprimitive],
25-
result_type=str_rprimitive,
26-
error_kind=ERR_MAGIC,
27-
emit=call_emit('PyObject_Str'))
23+
c_function_op(
24+
name='builtins.str',
25+
arg_types=[object_rprimitive],
26+
return_type=str_rprimitive,
27+
c_function_name='PyObject_Str',
28+
error_kind=ERR_MAGIC)
2829

2930
# str1 + str2
30-
binary_op(op='+',
31-
arg_types=[str_rprimitive, str_rprimitive],
32-
result_type=str_rprimitive,
33-
error_kind=ERR_MAGIC,
34-
emit=call_emit('PyUnicode_Concat'))
31+
c_binary_op(name='+',
32+
arg_types=[str_rprimitive, str_rprimitive],
33+
return_type=str_rprimitive,
34+
c_function_name='PyUnicode_Concat',
35+
error_kind=ERR_MAGIC)
3536

3637
# str.join(obj)
3738
c_method_op(
@@ -43,12 +44,13 @@
4344
)
4445

4546
# str[index] (for an int index)
46-
method_op(
47+
c_method_op(
4748
name='__getitem__',
4849
arg_types=[str_rprimitive, int_rprimitive],
49-
result_type=str_rprimitive,
50-
error_kind=ERR_MAGIC,
51-
emit=call_emit('CPyStr_GetItem'))
50+
return_type=str_rprimitive,
51+
c_function_name='CPyStr_GetItem',
52+
error_kind=ERR_MAGIC
53+
)
5254

5355
# str.split(...)
5456
str_split_types = [str_rprimitive, str_rprimitive, int_rprimitive] # type: List[RType]

mypyc/test-data/analysis.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ def lol(x):
525525
r11, r12 :: int
526526
L0:
527527
L1:
528-
r0 = id x :: object
528+
r0 = CPyTagged_Id(x)
529529
st = r0
530530
goto L10
531531
L2:

0 commit comments

Comments
 (0)