3#ifndef __NUITKA_HELPER_ATTRIBUTES_H__
4#define __NUITKA_HELPER_ATTRIBUTES_H__
7extern PyObject *LOOKUP_ATTRIBUTE(PyThreadState *tstate, PyObject *source, PyObject *attr_name);
10extern PyObject *LOOKUP_ATTRIBUTE_DICT_SLOT(PyThreadState *tstate, PyObject *source);
13extern PyObject *LOOKUP_ATTRIBUTE_CLASS_SLOT(PyThreadState *tstate, PyObject *source);
16extern int BUILTIN_HASATTR_BOOL(PyThreadState *tstate, PyObject *source, PyObject *attr_name);
19extern bool HAS_ATTR_BOOL(PyThreadState *tstate, PyObject *source, PyObject *attr_name);
22extern int HAS_ATTR_BOOL2(PyThreadState *tstate, PyObject *source, PyObject *attr_name);
25extern bool SET_ATTRIBUTE(PyThreadState *tstate, PyObject *target, PyObject *attr_name, PyObject *value);
28extern bool SET_ATTRIBUTE_DICT_SLOT(PyThreadState *tstate, PyObject *target, PyObject *value);
31extern bool SET_ATTRIBUTE_CLASS_SLOT(PyThreadState *tstate, PyObject *target, PyObject *value);
34extern PyObject *LOOKUP_SPECIAL(PyThreadState *tstate, PyObject *source, PyObject *attr_name);
37#if PYTHON_VERSION < 0x300
38extern PyObject *FIND_ATTRIBUTE_IN_CLASS(PyClassObject *class_object, PyObject *attr_name);
41extern PyObject *LOOKUP_MODULE_VALUE(PyDictObject *module_dict, PyObject *var_name);
44extern getattrofunc PyObject_GenericGetAttr_resolved;
48static inline bool hasTypeGenericGetAttr(PyTypeObject *type) {
49#if PYTHON_VERSION >= 0x3b0
53 return type->tp_getattro == PyObject_GenericGetAttr_resolved;
58extern setattrofunc PyObject_GenericSetAttr_resolved;
60static inline bool hasTypeGenericSetAttr(PyTypeObject *type) {
61#if PYTHON_VERSION >= 0x3b0
65 return type->tp_setattro == PyObject_GenericSetAttr_resolved;
69#if PYTHON_VERSION >= 0x3a0
70static inline bool Nuitka_Descr_IsData(PyObject *
object) {
return Py_TYPE(
object)->tp_descr_set != NULL; }
72#define Nuitka_Descr_IsData(object) PyDescr_IsData(object)