Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
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,
|
|
)
|