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
116
117
|
#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();
}
} // namspace NPython
|