py_void.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "py_void.h"
  2. #include "py_errors.h"
  3. #include "py_utils.h"
  4. #include <yql/essentials/public/udf/udf_value.h>
  5. using namespace NKikimr;
  6. namespace NPython {
  7. namespace {
  8. static PyObject* VoidRepr(PyObject*) {
  9. return PyRepr("yql.Void").Release();
  10. }
  11. static void VoidDealloc(PyObject*) {
  12. Py_FatalError("Deallocating yql.Void");
  13. }
  14. } // namespace
  15. PyTypeObject PyVoidType = {
  16. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  17. INIT_MEMBER(tp_name , "yql.Void"),
  18. INIT_MEMBER(tp_basicsize , 0),
  19. INIT_MEMBER(tp_itemsize , 0),
  20. INIT_MEMBER(tp_dealloc , VoidDealloc),
  21. #if PY_VERSION_HEX < 0x030800b4
  22. INIT_MEMBER(tp_print , nullptr),
  23. #else
  24. INIT_MEMBER(tp_vectorcall_offset, 0),
  25. #endif
  26. INIT_MEMBER(tp_getattr , nullptr),
  27. INIT_MEMBER(tp_setattr , nullptr),
  28. #if PY_MAJOR_VERSION >= 3
  29. INIT_MEMBER(tp_as_async , nullptr),
  30. #else
  31. INIT_MEMBER(tp_compare , nullptr),
  32. #endif
  33. INIT_MEMBER(tp_repr , VoidRepr),
  34. INIT_MEMBER(tp_as_number , nullptr),
  35. INIT_MEMBER(tp_as_sequence , nullptr),
  36. INIT_MEMBER(tp_as_mapping , nullptr),
  37. INIT_MEMBER(tp_hash , nullptr),
  38. INIT_MEMBER(tp_call , nullptr),
  39. INIT_MEMBER(tp_str , nullptr),
  40. INIT_MEMBER(tp_getattro , nullptr),
  41. INIT_MEMBER(tp_setattro , nullptr),
  42. INIT_MEMBER(tp_as_buffer , nullptr),
  43. INIT_MEMBER(tp_flags , 0),
  44. INIT_MEMBER(tp_doc , "yql.Void object"),
  45. INIT_MEMBER(tp_traverse , nullptr),
  46. INIT_MEMBER(tp_clear , nullptr),
  47. INIT_MEMBER(tp_richcompare , nullptr),
  48. INIT_MEMBER(tp_weaklistoffset , 0),
  49. INIT_MEMBER(tp_iter , nullptr),
  50. INIT_MEMBER(tp_iternext , nullptr),
  51. INIT_MEMBER(tp_methods , nullptr),
  52. INIT_MEMBER(tp_members , nullptr),
  53. INIT_MEMBER(tp_getset , nullptr),
  54. INIT_MEMBER(tp_base , nullptr),
  55. INIT_MEMBER(tp_dict , nullptr),
  56. INIT_MEMBER(tp_descr_get , nullptr),
  57. INIT_MEMBER(tp_descr_set , nullptr),
  58. INIT_MEMBER(tp_dictoffset , 0),
  59. INIT_MEMBER(tp_init , nullptr),
  60. INIT_MEMBER(tp_alloc , nullptr),
  61. INIT_MEMBER(tp_new , nullptr),
  62. INIT_MEMBER(tp_free , nullptr),
  63. INIT_MEMBER(tp_is_gc , nullptr),
  64. INIT_MEMBER(tp_bases , nullptr),
  65. INIT_MEMBER(tp_mro , nullptr),
  66. INIT_MEMBER(tp_cache , nullptr),
  67. INIT_MEMBER(tp_subclasses , nullptr),
  68. INIT_MEMBER(tp_weaklist , nullptr),
  69. INIT_MEMBER(tp_del , nullptr),
  70. INIT_MEMBER(tp_version_tag , 0),
  71. #if PY_MAJOR_VERSION >= 3
  72. INIT_MEMBER(tp_finalize , nullptr),
  73. #endif
  74. #if PY_VERSION_HEX >= 0x030800b1
  75. INIT_MEMBER(tp_vectorcall , nullptr),
  76. #endif
  77. #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
  78. INIT_MEMBER(tp_print , nullptr),
  79. #endif
  80. };
  81. PyObject PyVoidObject = {
  82. _PyObject_EXTRA_INIT
  83. 1, &PyVoidType
  84. };
  85. TPyObjectPtr ToPyVoid(
  86. const TPyCastContext::TPtr& ctx,
  87. const NUdf::TType* type,
  88. const NUdf::TUnboxedValuePod& value)
  89. {
  90. Y_UNUSED(ctx);
  91. Y_UNUSED(type);
  92. Y_UNUSED(value);
  93. return TPyObjectPtr(&PyVoidObject, TPyObjectPtr::ADD_REF);
  94. }
  95. NUdf::TUnboxedValue FromPyVoid(
  96. const TPyCastContext::TPtr& ctx,
  97. const NUdf::TType* type,
  98. PyObject* value)
  99. {
  100. Y_UNUSED(ctx);
  101. Y_UNUSED(type);
  102. Y_UNUSED(value);
  103. PY_ENSURE(value == &PyVoidObject, "Expected object of yql.Void type");
  104. return NUdf::TUnboxedValue::Void();
  105. }
  106. } // namspace NPython