| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- """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,
- )
|