77 lines
2.4 KiB
C++
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)
|