bytes_ops.py 2.4 KB

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