Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
122 lines
2.7 KiB
Python
122 lines
2.7 KiB
Python
"""Primitive set (and frozenset) ops."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC
|
|
from mypyc.ir.rtypes import (
|
|
bit_rprimitive,
|
|
bool_rprimitive,
|
|
c_int_rprimitive,
|
|
object_rprimitive,
|
|
pointer_rprimitive,
|
|
set_rprimitive,
|
|
)
|
|
from mypyc.primitives.registry import (
|
|
ERR_NEG_INT,
|
|
binary_op,
|
|
function_op,
|
|
load_address_op,
|
|
method_op,
|
|
)
|
|
|
|
# Get the 'builtins.set' type object.
|
|
load_address_op(name="builtins.set", type=object_rprimitive, src="PySet_Type")
|
|
|
|
# Get the 'builtins.frozenset' tyoe object.
|
|
load_address_op(name="builtins.frozenset", type=object_rprimitive, src="PyFrozenSet_Type")
|
|
|
|
# Construct an empty set.
|
|
new_set_op = function_op(
|
|
name="builtins.set",
|
|
arg_types=[],
|
|
return_type=set_rprimitive,
|
|
c_function_name="PySet_New",
|
|
error_kind=ERR_MAGIC,
|
|
extra_int_constants=[(0, pointer_rprimitive)],
|
|
)
|
|
|
|
# set(obj)
|
|
function_op(
|
|
name="builtins.set",
|
|
arg_types=[object_rprimitive],
|
|
return_type=set_rprimitive,
|
|
c_function_name="PySet_New",
|
|
error_kind=ERR_MAGIC,
|
|
)
|
|
|
|
# frozenset(obj)
|
|
function_op(
|
|
name="builtins.frozenset",
|
|
arg_types=[object_rprimitive],
|
|
return_type=object_rprimitive,
|
|
c_function_name="PyFrozenSet_New",
|
|
error_kind=ERR_MAGIC,
|
|
)
|
|
|
|
# item in set
|
|
set_in_op = binary_op(
|
|
name="in",
|
|
arg_types=[object_rprimitive, set_rprimitive],
|
|
return_type=c_int_rprimitive,
|
|
c_function_name="PySet_Contains",
|
|
error_kind=ERR_NEG_INT,
|
|
truncated_type=bool_rprimitive,
|
|
ordering=[1, 0],
|
|
)
|
|
|
|
# set.remove(obj)
|
|
method_op(
|
|
name="remove",
|
|
arg_types=[set_rprimitive, object_rprimitive],
|
|
return_type=bit_rprimitive,
|
|
c_function_name="CPySet_Remove",
|
|
error_kind=ERR_FALSE,
|
|
)
|
|
|
|
# set.discard(obj)
|
|
method_op(
|
|
name="discard",
|
|
arg_types=[set_rprimitive, object_rprimitive],
|
|
return_type=c_int_rprimitive,
|
|
c_function_name="PySet_Discard",
|
|
error_kind=ERR_NEG_INT,
|
|
)
|
|
|
|
# set.add(obj)
|
|
set_add_op = method_op(
|
|
name="add",
|
|
arg_types=[set_rprimitive, object_rprimitive],
|
|
return_type=c_int_rprimitive,
|
|
c_function_name="PySet_Add",
|
|
error_kind=ERR_NEG_INT,
|
|
)
|
|
|
|
# set.update(obj)
|
|
#
|
|
# This is not a public API but looks like it should be fine.
|
|
set_update_op = method_op(
|
|
name="update",
|
|
arg_types=[set_rprimitive, object_rprimitive],
|
|
return_type=c_int_rprimitive,
|
|
c_function_name="_PySet_Update",
|
|
error_kind=ERR_NEG_INT,
|
|
)
|
|
|
|
# set.clear()
|
|
method_op(
|
|
name="clear",
|
|
arg_types=[set_rprimitive],
|
|
return_type=c_int_rprimitive,
|
|
c_function_name="PySet_Clear",
|
|
error_kind=ERR_NEG_INT,
|
|
)
|
|
|
|
# set.pop()
|
|
method_op(
|
|
name="pop",
|
|
arg_types=[set_rprimitive],
|
|
return_type=object_rprimitive,
|
|
c_function_name="PySet_Pop",
|
|
error_kind=ERR_MAGIC,
|
|
)
|