Files
ANSLibs/nanobind/src/nb_static_property.cpp

77 lines
2.4 KiB
C++

#include "nb_internals.h"
NAMESPACE_BEGIN(NB_NAMESPACE)
NAMESPACE_BEGIN(detail)
/// `nb_static_property.__get__()`: Always pass the class instead of the instance.
static PyObject *nb_static_property_descr_get(PyObject *self, PyObject *, PyObject *cls) {
// Flag to avoid infinite recursion during static attribute assignment
bool static_property_disabled;
#if defined(NB_FREE_THREADED)
static_property_disabled = (bool) PyThread_tss_get(internals->nb_static_property_disabled);
#else
static_property_disabled = internals->nb_static_property_disabled;
#endif
if (!static_property_disabled) {
return NB_SLOT(PyProperty_Type, tp_descr_get)(self, cls, cls);
} else {
Py_INCREF(self);
return self;
}
}
/// `nb_static_property.__set__()`: Just like the above `__get__()`.
static int nb_static_property_descr_set(PyObject *self, PyObject *obj, PyObject *value) {
PyObject *cls = PyType_Check(obj) ? obj : (PyObject *) Py_TYPE(obj);
return NB_SLOT(PyProperty_Type, tp_descr_set)(self, cls, value);
}
PyTypeObject *nb_static_property_tp() noexcept {
nb_internals *internals_ = internals;
PyTypeObject *tp = internals_->nb_static_property.load_acquire();
if (NB_UNLIKELY(!tp)) {
lock_internals guard(internals_);
tp = internals_->nb_static_property.load_relaxed();
if (tp)
return tp;
PyMemberDef *members;
#if defined(Py_LIMITED_API)
members = (PyMemberDef *) PyType_GetSlot(&PyProperty_Type, Py_tp_members);
#else
members = PyProperty_Type.tp_members;
#endif
PyType_Slot slots[] = {
{ Py_tp_base, &PyProperty_Type },
{ Py_tp_descr_get, (void *) nb_static_property_descr_get },
{ Py_tp_members, members },
{ 0, nullptr }
};
PyType_Spec spec = {
/* .name = */ "nanobind.nb_static_property",
/* .basicsize = */ 0,
/* .itemsize = */ 0,
/* .flags = */ Py_TPFLAGS_DEFAULT,
/* .slots = */ slots
};
tp = (PyTypeObject *) PyType_FromSpec(&spec);
check(tp, "nb_static_property type creation failed!");
internals_->nb_static_property_descr_set = nb_static_property_descr_set;
internals_->nb_static_property.store_release(tp);
}
return tp;
}
NAMESPACE_END(detail)
NAMESPACE_END(NB_NAMESPACE)