tuple_ops.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """Primitive tuple ops for *variable-length* tuples.
  2. Note: Varying-length tuples are represented as boxed Python tuple
  3. objects, i.e. tuple_rprimitive (RPrimitive), not RTuple.
  4. """
  5. from __future__ import annotations
  6. from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC
  7. from mypyc.ir.rtypes import (
  8. bit_rprimitive,
  9. c_pyssize_t_rprimitive,
  10. int_rprimitive,
  11. list_rprimitive,
  12. object_rprimitive,
  13. tuple_rprimitive,
  14. )
  15. from mypyc.primitives.registry import custom_op, function_op, load_address_op, method_op
  16. # Get the 'builtins.tuple' type object.
  17. load_address_op(name="builtins.tuple", type=object_rprimitive, src="PyTuple_Type")
  18. # tuple[index] (for an int index)
  19. tuple_get_item_op = method_op(
  20. name="__getitem__",
  21. arg_types=[tuple_rprimitive, int_rprimitive],
  22. return_type=object_rprimitive,
  23. c_function_name="CPySequenceTuple_GetItem",
  24. error_kind=ERR_MAGIC,
  25. )
  26. # Construct a boxed tuple from items: (item1, item2, ...)
  27. new_tuple_op = custom_op(
  28. arg_types=[c_pyssize_t_rprimitive],
  29. return_type=tuple_rprimitive,
  30. c_function_name="PyTuple_Pack",
  31. error_kind=ERR_MAGIC,
  32. var_arg_type=object_rprimitive,
  33. )
  34. new_tuple_with_length_op = custom_op(
  35. arg_types=[c_pyssize_t_rprimitive],
  36. return_type=tuple_rprimitive,
  37. c_function_name="PyTuple_New",
  38. error_kind=ERR_MAGIC,
  39. )
  40. # PyTuple_SET_ITEM does no error checking,
  41. # and should only be used to fill in brand new tuples.
  42. new_tuple_set_item_op = custom_op(
  43. arg_types=[tuple_rprimitive, int_rprimitive, object_rprimitive],
  44. return_type=bit_rprimitive,
  45. c_function_name="CPySequenceTuple_SetItemUnsafe",
  46. error_kind=ERR_FALSE,
  47. steals=[False, False, True],
  48. )
  49. # Construct tuple from a list.
  50. list_tuple_op = function_op(
  51. name="builtins.tuple",
  52. arg_types=[list_rprimitive],
  53. return_type=tuple_rprimitive,
  54. c_function_name="PyList_AsTuple",
  55. error_kind=ERR_MAGIC,
  56. priority=2,
  57. )
  58. # Construct tuple from an arbitrary (iterable) object.
  59. function_op(
  60. name="builtins.tuple",
  61. arg_types=[object_rprimitive],
  62. return_type=tuple_rprimitive,
  63. c_function_name="PySequence_Tuple",
  64. error_kind=ERR_MAGIC,
  65. )
  66. # tuple[begin:end]
  67. tuple_slice_op = custom_op(
  68. arg_types=[tuple_rprimitive, int_rprimitive, int_rprimitive],
  69. return_type=object_rprimitive,
  70. c_function_name="CPySequenceTuple_GetSlice",
  71. error_kind=ERR_MAGIC,
  72. )