| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- """Primitive dict ops."""
- from __future__ import annotations
- from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC, ERR_NEVER
- from mypyc.ir.rtypes import (
- bit_rprimitive,
- bool_rprimitive,
- c_int_rprimitive,
- c_pyssize_t_rprimitive,
- dict_next_rtuple_pair,
- dict_next_rtuple_single,
- dict_rprimitive,
- int_rprimitive,
- list_rprimitive,
- object_rprimitive,
- )
- from mypyc.primitives.registry import (
- ERR_NEG_INT,
- binary_op,
- custom_op,
- function_op,
- load_address_op,
- method_op,
- )
- # Get the 'dict' type object.
- load_address_op(name="builtins.dict", type=object_rprimitive, src="PyDict_Type")
- # Construct an empty dictionary via dict().
- function_op(
- name="builtins.dict",
- arg_types=[],
- return_type=dict_rprimitive,
- c_function_name="PyDict_New",
- error_kind=ERR_MAGIC,
- )
- # Construct an empty dictionary.
- dict_new_op = custom_op(
- arg_types=[], return_type=dict_rprimitive, c_function_name="PyDict_New", error_kind=ERR_MAGIC
- )
- # Construct a dictionary from keys and values.
- # Positional argument is the number of key-value pairs
- # Variable arguments are (key1, value1, ..., keyN, valueN).
- dict_build_op = custom_op(
- arg_types=[c_pyssize_t_rprimitive],
- return_type=dict_rprimitive,
- c_function_name="CPyDict_Build",
- error_kind=ERR_MAGIC,
- var_arg_type=object_rprimitive,
- )
- # Construct a dictionary from another dictionary.
- function_op(
- name="builtins.dict",
- arg_types=[dict_rprimitive],
- return_type=dict_rprimitive,
- c_function_name="PyDict_Copy",
- error_kind=ERR_MAGIC,
- priority=2,
- )
- # Generic one-argument dict constructor: dict(obj)
- dict_copy = function_op(
- name="builtins.dict",
- arg_types=[object_rprimitive],
- return_type=dict_rprimitive,
- c_function_name="CPyDict_FromAny",
- error_kind=ERR_MAGIC,
- )
- # dict[key]
- dict_get_item_op = method_op(
- name="__getitem__",
- arg_types=[dict_rprimitive, object_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_GetItem",
- error_kind=ERR_MAGIC,
- )
- # dict[key] = value
- dict_set_item_op = method_op(
- name="__setitem__",
- arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="CPyDict_SetItem",
- error_kind=ERR_NEG_INT,
- )
- # key in dict
- binary_op(
- name="in",
- arg_types=[object_rprimitive, dict_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="PyDict_Contains",
- error_kind=ERR_NEG_INT,
- truncated_type=bool_rprimitive,
- ordering=[1, 0],
- )
- # dict1.update(dict2)
- dict_update_op = method_op(
- name="update",
- arg_types=[dict_rprimitive, dict_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="CPyDict_Update",
- error_kind=ERR_NEG_INT,
- priority=2,
- )
- # Operation used for **value in dict displays.
- # This is mostly like dict.update(obj), but has customized error handling.
- dict_update_in_display_op = custom_op(
- arg_types=[dict_rprimitive, object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="CPyDict_UpdateInDisplay",
- error_kind=ERR_NEG_INT,
- )
- # dict.update(obj)
- method_op(
- name="update",
- arg_types=[dict_rprimitive, object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="CPyDict_UpdateFromAny",
- error_kind=ERR_NEG_INT,
- )
- # dict.get(key, default)
- method_op(
- name="get",
- arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_Get",
- error_kind=ERR_MAGIC,
- )
- # dict.get(key)
- dict_get_method_with_none = method_op(
- name="get",
- arg_types=[dict_rprimitive, object_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_GetWithNone",
- error_kind=ERR_MAGIC,
- )
- # dict.setdefault(key, default)
- dict_setdefault_op = method_op(
- name="setdefault",
- arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_SetDefault",
- error_kind=ERR_MAGIC,
- )
- # dict.setdefault(key)
- method_op(
- name="setdefault",
- arg_types=[dict_rprimitive, object_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_SetDefaultWithNone",
- error_kind=ERR_MAGIC,
- )
- # dict.setdefault(key, empty tuple/list/set)
- # The third argument marks the data type of the second argument.
- # 1: list 2: dict 3: set
- # Other number would lead to an error.
- dict_setdefault_spec_init_op = custom_op(
- arg_types=[dict_rprimitive, object_rprimitive, c_int_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_SetDefaultWithEmptyDatatype",
- error_kind=ERR_MAGIC,
- )
- # dict.keys()
- method_op(
- name="keys",
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_KeysView",
- error_kind=ERR_MAGIC,
- )
- # dict.values()
- method_op(
- name="values",
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_ValuesView",
- error_kind=ERR_MAGIC,
- )
- # dict.items()
- method_op(
- name="items",
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_ItemsView",
- error_kind=ERR_MAGIC,
- )
- # dict.clear()
- method_op(
- name="clear",
- arg_types=[dict_rprimitive],
- return_type=bit_rprimitive,
- c_function_name="CPyDict_Clear",
- error_kind=ERR_FALSE,
- )
- # dict.copy()
- method_op(
- name="copy",
- arg_types=[dict_rprimitive],
- return_type=dict_rprimitive,
- c_function_name="CPyDict_Copy",
- error_kind=ERR_MAGIC,
- )
- # list(dict.keys())
- dict_keys_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=list_rprimitive,
- c_function_name="CPyDict_Keys",
- error_kind=ERR_MAGIC,
- )
- # list(dict.values())
- dict_values_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=list_rprimitive,
- c_function_name="CPyDict_Values",
- error_kind=ERR_MAGIC,
- )
- # list(dict.items())
- dict_items_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=list_rprimitive,
- c_function_name="CPyDict_Items",
- error_kind=ERR_MAGIC,
- )
- # PyDict_Next() fast iteration
- dict_key_iter_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_GetKeysIter",
- error_kind=ERR_MAGIC,
- )
- dict_value_iter_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_GetValuesIter",
- error_kind=ERR_MAGIC,
- )
- dict_item_iter_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=object_rprimitive,
- c_function_name="CPyDict_GetItemsIter",
- error_kind=ERR_MAGIC,
- )
- dict_next_key_op = custom_op(
- arg_types=[object_rprimitive, int_rprimitive],
- return_type=dict_next_rtuple_single,
- c_function_name="CPyDict_NextKey",
- error_kind=ERR_NEVER,
- )
- dict_next_value_op = custom_op(
- arg_types=[object_rprimitive, int_rprimitive],
- return_type=dict_next_rtuple_single,
- c_function_name="CPyDict_NextValue",
- error_kind=ERR_NEVER,
- )
- dict_next_item_op = custom_op(
- arg_types=[object_rprimitive, int_rprimitive],
- return_type=dict_next_rtuple_pair,
- c_function_name="CPyDict_NextItem",
- error_kind=ERR_NEVER,
- )
- # check that len(dict) == const during iteration
- dict_check_size_op = custom_op(
- arg_types=[dict_rprimitive, int_rprimitive],
- return_type=bit_rprimitive,
- c_function_name="CPyDict_CheckSize",
- error_kind=ERR_FALSE,
- )
- dict_ssize_t_size_op = custom_op(
- arg_types=[dict_rprimitive],
- return_type=c_pyssize_t_rprimitive,
- c_function_name="PyDict_Size",
- error_kind=ERR_NEVER,
- )
- # Delete an item from a dict
- dict_del_item = custom_op(
- arg_types=[object_rprimitive, object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="PyDict_DelItem",
- error_kind=ERR_NEG_INT,
- )
- supports_mapping_protocol = custom_op(
- arg_types=[object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="CPyMapping_Check",
- error_kind=ERR_NEVER,
- )
- mapping_has_key = custom_op(
- arg_types=[object_rprimitive, object_rprimitive],
- return_type=c_int_rprimitive,
- c_function_name="PyMapping_HasKey",
- error_kind=ERR_NEVER,
- )
|