1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
"""Primitive bytes ops."""
from __future__ import annotations
from mypyc.ir.ops import ERR_MAGIC
from mypyc.ir.rtypes import (
RUnion,
bytes_rprimitive,
c_int_rprimitive,
c_pyssize_t_rprimitive,
dict_rprimitive,
int_rprimitive,
list_rprimitive,
object_rprimitive,
str_rprimitive,
)
from mypyc.primitives.registry import (
ERR_NEG_INT,
binary_op,
custom_op,
function_op,
load_address_op,
method_op,
)
# Get the 'bytes' type object.
load_address_op(name="builtins.bytes", type=object_rprimitive, src="PyBytes_Type")
# bytes(obj)
function_op(
name="builtins.bytes",
arg_types=[RUnion([list_rprimitive, dict_rprimitive, str_rprimitive])],
return_type=bytes_rprimitive,
c_function_name="PyBytes_FromObject",
error_kind=ERR_MAGIC,
)
# bytearray(obj)
function_op(
name="builtins.bytearray",
arg_types=[object_rprimitive],
return_type=bytes_rprimitive,
c_function_name="PyByteArray_FromObject",
error_kind=ERR_MAGIC,
)
# bytes ==/!= (return -1/0/1)
bytes_compare = custom_op(
arg_types=[bytes_rprimitive, bytes_rprimitive],
return_type=c_int_rprimitive,
c_function_name="CPyBytes_Compare",
error_kind=ERR_NEG_INT,
)
# bytes + bytes
# bytearray + bytearray
binary_op(
name="+",
arg_types=[bytes_rprimitive, bytes_rprimitive],
return_type=bytes_rprimitive,
c_function_name="CPyBytes_Concat",
error_kind=ERR_MAGIC,
steals=[True, False],
)
# bytes[begin:end]
bytes_slice_op = custom_op(
arg_types=[bytes_rprimitive, int_rprimitive, int_rprimitive],
return_type=bytes_rprimitive,
c_function_name="CPyBytes_GetSlice",
error_kind=ERR_MAGIC,
)
# bytes[index]
# bytearray[index]
method_op(
name="__getitem__",
arg_types=[bytes_rprimitive, int_rprimitive],
return_type=int_rprimitive,
c_function_name="CPyBytes_GetItem",
error_kind=ERR_MAGIC,
)
# bytes.join(obj)
method_op(
name="join",
arg_types=[bytes_rprimitive, object_rprimitive],
return_type=bytes_rprimitive,
c_function_name="CPyBytes_Join",
error_kind=ERR_MAGIC,
)
# Join bytes objects and return a new bytes.
# The first argument is the total number of the following bytes.
bytes_build_op = custom_op(
arg_types=[c_pyssize_t_rprimitive],
return_type=bytes_rprimitive,
c_function_name="CPyBytes_Build",
error_kind=ERR_MAGIC,
var_arg_type=bytes_rprimitive,
)
function_op(
name="builtins.ord",
arg_types=[bytes_rprimitive],
return_type=int_rprimitive,
c_function_name="CPyBytes_Ord",
error_kind=ERR_MAGIC,
)
|