summaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs/common/python/bindings/py_void.cpp
blob: 8214259fb494aca7c098166670ed545b35202650 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "py_void.h"
#include "py_errors.h"
#include "py_utils.h"

#include <yql/essentials/public/udf/udf_value.h>

using namespace NKikimr;

namespace NPython {
namespace {

static PyObject* VoidRepr(PyObject*) {
    return PyRepr("yql.Void").Release();
}

static void VoidDealloc(PyObject*) {
    Py_FatalError("Deallocating yql.Void");
}

} // namespace

PyTypeObject PyVoidType = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
        INIT_MEMBER(tp_name, "yql.Void"),
    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