set_ops.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """Primitive set (and frozenset) ops."""
  2. from __future__ import annotations
  3. from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC
  4. from mypyc.ir.rtypes import (
  5. bit_rprimitive,
  6. bool_rprimitive,
  7. c_int_rprimitive,
  8. object_rprimitive,
  9. pointer_rprimitive,
  10. set_rprimitive,
  11. )
  12. from mypyc.primitives.registry import (
  13. ERR_NEG_INT,
  14. binary_op,
  15. function_op,
  16. load_address_op,
  17. method_op,
  18. )
  19. # Get the 'builtins.set' type object.
  20. load_address_op(name="builtins.set", type=object_rprimitive, src="PySet_Type")
  21. # Get the 'builtins.frozenset' tyoe object.
  22. load_address_op(name="builtins.frozenset", type=object_rprimitive, src="PyFrozenSet_Type")
  23. # Construct an empty set.
  24. new_set_op = function_op(
  25. name="builtins.set",
  26. arg_types=[],
  27. return_type=set_rprimitive,
  28. c_function_name="PySet_New",
  29. error_kind=ERR_MAGIC,
  30. extra_int_constants=[(0, pointer_rprimitive)],
  31. )
  32. # set(obj)
  33. function_op(
  34. name="builtins.set",
  35. arg_types=[object_rprimitive],
  36. return_type=set_rprimitive,
  37. c_function_name="PySet_New",
  38. error_kind=ERR_MAGIC,
  39. )
  40. # frozenset(obj)
  41. function_op(
  42. name="builtins.frozenset",
  43. arg_types=[object_rprimitive],
  44. return_type=object_rprimitive,
  45. c_function_name="PyFrozenSet_New",
  46. error_kind=ERR_MAGIC,
  47. )
  48. # item in set
  49. set_in_op = binary_op(
  50. name="in",
  51. arg_types=[object_rprimitive, set_rprimitive],
  52. return_type=c_int_rprimitive,
  53. c_function_name="PySet_Contains",
  54. error_kind=ERR_NEG_INT,
  55. truncated_type=bool_rprimitive,
  56. ordering=[1, 0],
  57. )
  58. # set.remove(obj)
  59. method_op(
  60. name="remove",
  61. arg_types=[set_rprimitive, object_rprimitive],
  62. return_type=bit_rprimitive,
  63. c_function_name="CPySet_Remove",
  64. error_kind=ERR_FALSE,
  65. )
  66. # set.discard(obj)
  67. method_op(
  68. name="discard",
  69. arg_types=[set_rprimitive, object_rprimitive],
  70. return_type=c_int_rprimitive,
  71. c_function_name="PySet_Discard",
  72. error_kind=ERR_NEG_INT,
  73. )
  74. # set.add(obj)
  75. set_add_op = method_op(
  76. name="add",
  77. arg_types=[set_rprimitive, object_rprimitive],
  78. return_type=c_int_rprimitive,
  79. c_function_name="PySet_Add",
  80. error_kind=ERR_NEG_INT,
  81. )
  82. # set.update(obj)
  83. #
  84. # This is not a public API but looks like it should be fine.
  85. set_update_op = method_op(
  86. name="update",
  87. arg_types=[set_rprimitive, object_rprimitive],
  88. return_type=c_int_rprimitive,
  89. c_function_name="_PySet_Update",
  90. error_kind=ERR_NEG_INT,
  91. )
  92. # set.clear()
  93. method_op(
  94. name="clear",
  95. arg_types=[set_rprimitive],
  96. return_type=c_int_rprimitive,
  97. c_function_name="PySet_Clear",
  98. error_kind=ERR_NEG_INT,
  99. )
  100. # set.pop()
  101. method_op(
  102. name="pop",
  103. arg_types=[set_rprimitive],
  104. return_type=object_rprimitive,
  105. c_function_name="PySet_Pop",
  106. error_kind=ERR_MAGIC,
  107. )