Skip to content

Commit 38cdacf

Browse files
authored
[mypyc] Add primitives for isinstance of built-in types (#19435)
Follow-up to #19416 adding primitives for `isinstance(obj, type)` where type is built-in.
1 parent 32f57e4 commit 38cdacf

22 files changed

+568
-104
lines changed

mypyc/irbuild/specialize.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,26 @@
8383
join_formatted_strings,
8484
tokenizer_format_call,
8585
)
86+
from mypyc.primitives.bytes_ops import isinstance_bytearray, isinstance_bytes
8687
from mypyc.primitives.dict_ops import (
8788
dict_items_op,
8889
dict_keys_op,
8990
dict_setdefault_spec_init_op,
9091
dict_values_op,
92+
isinstance_dict,
9193
)
94+
from mypyc.primitives.float_ops import isinstance_float
95+
from mypyc.primitives.int_ops import isinstance_int
9296
from mypyc.primitives.list_ops import isinstance_list, new_list_set_item_op
97+
from mypyc.primitives.misc_ops import isinstance_bool
98+
from mypyc.primitives.set_ops import isinstance_frozenset, isinstance_set
9399
from mypyc.primitives.str_ops import (
100+
isinstance_str,
94101
str_encode_ascii_strict,
95102
str_encode_latin1_strict,
96103
str_encode_utf8_strict,
97104
)
98-
from mypyc.primitives.tuple_ops import new_tuple_set_item_op
105+
from mypyc.primitives.tuple_ops import isinstance_tuple, new_tuple_set_item_op
99106

100107
# Specializers are attempted before compiling the arguments to the
101108
# function. Specializers can return None to indicate that they failed
@@ -546,7 +553,19 @@ def gen_inner_stmts() -> None:
546553
return retval
547554

548555

549-
isinstance_primitives: Final = {"builtins.list": isinstance_list}
556+
isinstance_primitives: Final = {
557+
"builtins.bool": isinstance_bool,
558+
"builtins.bytearray": isinstance_bytearray,
559+
"builtins.bytes": isinstance_bytes,
560+
"builtins.dict": isinstance_dict,
561+
"builtins.float": isinstance_float,
562+
"builtins.frozenset": isinstance_frozenset,
563+
"builtins.int": isinstance_int,
564+
"builtins.list": isinstance_list,
565+
"builtins.set": isinstance_set,
566+
"builtins.str": isinstance_str,
567+
"builtins.tuple": isinstance_tuple,
568+
}
550569

551570

552571
@specialize_function("builtins.isinstance")

mypyc/primitives/bytes_ops.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
from __future__ import annotations
44

5-
from mypyc.ir.ops import ERR_MAGIC
5+
from mypyc.ir.ops import ERR_MAGIC, ERR_NEVER
66
from mypyc.ir.rtypes import (
77
RUnion,
8+
bit_rprimitive,
89
bytes_rprimitive,
910
c_int_rprimitive,
1011
c_pyssize_t_rprimitive,
@@ -35,6 +36,15 @@
3536
error_kind=ERR_MAGIC,
3637
)
3738

39+
# translate isinstance(obj, bytes)
40+
isinstance_bytes = function_op(
41+
name="builtins.isinstance",
42+
arg_types=[object_rprimitive],
43+
return_type=bit_rprimitive,
44+
c_function_name="PyBytes_Check",
45+
error_kind=ERR_NEVER,
46+
)
47+
3848
# bytearray(obj)
3949
function_op(
4050
name="builtins.bytearray",
@@ -44,6 +54,15 @@
4454
error_kind=ERR_MAGIC,
4555
)
4656

57+
# translate isinstance(obj, bytearray)
58+
isinstance_bytearray = function_op(
59+
name="builtins.isinstance",
60+
arg_types=[object_rprimitive],
61+
return_type=bit_rprimitive,
62+
c_function_name="PyByteArray_Check",
63+
error_kind=ERR_NEVER,
64+
)
65+
4766
# bytes ==/!= (return -1/0/1)
4867
bytes_compare = custom_op(
4968
arg_types=[bytes_rprimitive, bytes_rprimitive],

mypyc/primitives/dict_ops.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@
7171
error_kind=ERR_MAGIC,
7272
)
7373

74+
# translate isinstance(obj, dict)
75+
isinstance_dict = function_op(
76+
name="builtins.isinstance",
77+
arg_types=[object_rprimitive],
78+
return_type=bit_rprimitive,
79+
c_function_name="PyDict_Check",
80+
error_kind=ERR_NEVER,
81+
)
82+
7483
# dict[key]
7584
dict_get_item_op = method_op(
7685
name="__getitem__",

mypyc/primitives/float_ops.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from mypyc.ir.ops import ERR_MAGIC, ERR_MAGIC_OVERLAPPING, ERR_NEVER
66
from mypyc.ir.rtypes import (
7+
bit_rprimitive,
78
bool_rprimitive,
89
float_rprimitive,
910
int_rprimitive,
@@ -166,3 +167,12 @@
166167
c_function_name="CPyFloat_IsNaN",
167168
error_kind=ERR_NEVER,
168169
)
170+
171+
# translate isinstance(obj, float)
172+
isinstance_float = function_op(
173+
name="builtins.isinstance",
174+
arg_types=[object_rprimitive],
175+
return_type=bit_rprimitive,
176+
c_function_name="PyFloat_Check",
177+
error_kind=ERR_NEVER,
178+
)

mypyc/primitives/int_ops.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,12 @@ def int_unary_op(name: str, c_function_name: str) -> PrimitiveDescription:
296296
c_function_name="CPyUInt8_Overflow",
297297
error_kind=ERR_ALWAYS,
298298
)
299+
300+
# translate isinstance(obj, int)
301+
isinstance_int = function_op(
302+
name="builtints.isinstance",
303+
arg_types=[object_rprimitive],
304+
return_type=bit_rprimitive,
305+
c_function_name="PyLong_Check",
306+
error_kind=ERR_NEVER,
307+
)

mypyc/primitives/list_ops.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
extra_int_constants=[(0, int_rprimitive)],
5757
)
5858

59-
# isinstance(obj, list)
59+
# translate isinstance(obj, list)
6060
isinstance_list = function_op(
6161
name="builtins.isinstance",
6262
arg_types=[object_rprimitive],

mypyc/primitives/misc_ops.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,15 @@
191191
truncated_type=bool_rprimitive,
192192
)
193193

194+
# isinstance(obj, bool)
195+
isinstance_bool = function_op(
196+
name="builtins.isinstance",
197+
arg_types=[object_rprimitive],
198+
return_type=bit_rprimitive,
199+
c_function_name="PyBool_Check",
200+
error_kind=ERR_NEVER,
201+
)
202+
194203
# slice(start, stop, step)
195204
new_slice_op = function_op(
196205
name="builtins.slice",

mypyc/primitives/set_ops.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC
5+
from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC, ERR_NEVER
66
from mypyc.ir.rtypes import (
77
bit_rprimitive,
88
bool_rprimitive,
@@ -64,6 +64,24 @@
6464
error_kind=ERR_MAGIC,
6565
)
6666

67+
# translate isinstance(obj, set)
68+
isinstance_set = function_op(
69+
name="builtins.isinstance",
70+
arg_types=[object_rprimitive],
71+
return_type=bit_rprimitive,
72+
c_function_name="PySet_Check",
73+
error_kind=ERR_NEVER,
74+
)
75+
76+
# translate isinstance(obj, frozenset)
77+
isinstance_frozenset = function_op(
78+
name="builtins.isinstance",
79+
arg_types=[object_rprimitive],
80+
return_type=bit_rprimitive,
81+
c_function_name="PyFrozenSet_Check",
82+
error_kind=ERR_NEVER,
83+
)
84+
6785
# item in set
6886
set_in_op = binary_op(
6987
name="in",

mypyc/primitives/str_ops.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@
4848
error_kind=ERR_MAGIC,
4949
)
5050

51+
# translate isinstance(obj, str)
52+
isinstance_str = function_op(
53+
name="builtins.isinstance",
54+
arg_types=[object_rprimitive],
55+
return_type=bit_rprimitive,
56+
c_function_name="PyUnicode_Check",
57+
error_kind=ERR_NEVER,
58+
)
59+
5160
# str1 + str2
5261
binary_op(
5362
name="+",

mypyc/primitives/tuple_ops.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from mypyc.ir.ops import ERR_MAGIC, ERR_NEVER
1010
from mypyc.ir.rtypes import (
11+
bit_rprimitive,
1112
c_pyssize_t_rprimitive,
1213
int_rprimitive,
1314
list_rprimitive,
@@ -83,6 +84,15 @@
8384
error_kind=ERR_MAGIC,
8485
)
8586

87+
# translate isinstance(obj, tuple)
88+
isinstance_tuple = function_op(
89+
name="builtins.isinstance",
90+
arg_types=[object_rprimitive],
91+
return_type=bit_rprimitive,
92+
c_function_name="PyTuple_Check",
93+
error_kind=ERR_NEVER,
94+
)
95+
8696
# tuple + tuple
8797
binary_op(
8898
name="+",

0 commit comments

Comments
 (0)