#include "py_void.h" #include "py_errors.h" #include "py_utils.h" #include using namespace NKikimr; namespace NPython { namespace { PyObject* VoidRepr(PyObject*) { return PyRepr("yql.Void").Release(); } void VoidDealloc(PyObject*) { Py_FatalError("Deallocating yql.Void"); } } // namespace PyTypeObject PyVoidType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) // clang-format off INIT_MEMBER(tp_name, "yql.Void"), // clang-format on INIT_MEMBER(tp_basicsize, 0), INIT_MEMBER(tp_itemsize, 0), INIT_MEMBER(tp_dealloc, VoidDealloc), #if PY_VERSION_HEX < 0x030800b4 INIT_MEMBER(tp_print, nullptr), #else INIT_MEMBER(tp_vectorcall_offset, 0), #endif INIT_MEMBER(tp_getattr, nullptr), INIT_MEMBER(tp_setattr, nullptr), #if PY_MAJOR_VERSION >= 3 INIT_MEMBER(tp_as_async, nullptr), #else INIT_MEMBER(tp_compare, nullptr), #endif INIT_MEMBER(tp_repr, VoidRepr), INIT_MEMBER(tp_as_number, nullptr), INIT_MEMBER(tp_as_sequence, nullptr), INIT_MEMBER(tp_as_mapping, nullptr), INIT_MEMBER(tp_hash, nullptr), INIT_MEMBER(tp_call, nullptr), INIT_MEMBER(tp_str, nullptr), INIT_MEMBER(tp_getattro, nullptr), INIT_MEMBER(tp_setattro, nullptr), INIT_MEMBER(tp_as_buffer, nullptr), INIT_MEMBER(tp_flags, 0), INIT_MEMBER(tp_doc, "yql.Void object"), INIT_MEMBER(tp_traverse, nullptr), INIT_MEMBER(tp_clear, nullptr), INIT_MEMBER(tp_richcompare, nullptr), INIT_MEMBER(tp_weaklistoffset, 0), INIT_MEMBER(tp_iter, nullptr), INIT_MEMBER(tp_iternext, nullptr), INIT_MEMBER(tp_methods, nullptr), INIT_MEMBER(tp_members, nullptr), INIT_MEMBER(tp_getset, nullptr), INIT_MEMBER(tp_base, nullptr), INIT_MEMBER(tp_dict, nullptr), INIT_MEMBER(tp_descr_get, nullptr), INIT_MEMBER(tp_descr_set, nullptr), INIT_MEMBER(tp_dictoffset, 0), INIT_MEMBER(tp_init, nullptr), INIT_MEMBER(tp_alloc, nullptr), INIT_MEMBER(tp_new, nullptr), INIT_MEMBER(tp_free, nullptr), INIT_MEMBER(tp_is_gc, nullptr), INIT_MEMBER(tp_bases, nullptr), INIT_MEMBER(tp_mro, nullptr), INIT_MEMBER(tp_cache, nullptr), INIT_MEMBER(tp_subclasses, nullptr), INIT_MEMBER(tp_weaklist, nullptr), INIT_MEMBER(tp_del, nullptr), INIT_MEMBER(tp_version_tag, 0), #if PY_MAJOR_VERSION >= 3 INIT_MEMBER(tp_finalize, nullptr), #endif #if PY_VERSION_HEX >= 0x030800b1 INIT_MEMBER(tp_vectorcall, nullptr), #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 INIT_MEMBER(tp_print, nullptr), #endif }; PyObject PyVoidObject = { _PyObject_EXTRA_INIT 1, &PyVoidType}; TPyObjectPtr ToPyVoid( const TPyCastContext::TPtr& ctx, const NUdf::TType* type, const NUdf::TUnboxedValuePod& value) { Y_UNUSED(ctx); Y_UNUSED(type); Y_UNUSED(value); return TPyObjectPtr(&PyVoidObject, TPyObjectPtr::ADD_REF); } NUdf::TUnboxedValue FromPyVoid( const TPyCastContext::TPtr& ctx, const NUdf::TType* type, PyObject* value) { Y_UNUSED(ctx); Y_UNUSED(type); Y_UNUSED(value); PY_ENSURE(value == &PyVoidObject, "Expected object of yql.Void type"); return NUdf::TUnboxedValue::Void(); } } // namespace NPython