Major fixes and new features
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
325
venv/lib/python3.12/site-packages/mypyc/primitives/dict_ops.py
Normal file
325
venv/lib/python3.12/site-packages/mypyc/primitives/dict_ops.py
Normal file
@@ -0,0 +1,325 @@
|
||||
"""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,
|
||||
)
|
||||
Reference in New Issue
Block a user