102 lines
2.4 KiB
Python
102 lines
2.4 KiB
Python
|
"""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,
|
||
|
)
|