6#include "nuitka/prelude.h"
9#if PYTHON_VERSION < 0x300
10PyObject *FIND_ATTRIBUTE_IN_CLASS(PyClassObject *class_object, PyObject *attr_name) {
11 CHECK_OBJECT(class_object);
12 CHECK_OBJECT(attr_name);
14 assert(PyClass_Check(class_object));
15 assert(PyString_CheckExact(attr_name));
17 PyObject *result = GET_STRING_DICT_VALUE((PyDictObject *)class_object->cl_dict, (PyStringObject *)attr_name);
20 assert(PyTuple_Check(class_object->cl_bases));
22 Py_ssize_t base_count = PyTuple_GET_SIZE(class_object->cl_bases);
24 for (Py_ssize_t i = 0; i < base_count; i++) {
25 result = FIND_ATTRIBUTE_IN_CLASS((PyClassObject *)PyTuple_GET_ITEM(class_object->cl_bases, i), attr_name);
37#if PYTHON_VERSION < 0x300
38static PyObject *LOOKUP_INSTANCE(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
40 CHECK_OBJECT(attr_name);
42 assert(PyInstance_Check(source));
43 assert(PyString_CheckExact(attr_name));
45 PyInstanceObject *source_instance = (PyInstanceObject *)source;
49 assert(attr_name != const_str_plain___dict__);
50 assert(attr_name != const_str_plain___class__);
53 PyObject *result = GET_STRING_DICT_VALUE((PyDictObject *)source_instance->in_dict, (PyStringObject *)attr_name);
61 result = FIND_ATTRIBUTE_IN_CLASS(source_instance->in_class, attr_name);
64 descrgetfunc func = Py_TYPE(result)->tp_descr_get;
67 result = func(result, source, (PyObject *)source_instance->in_class);
69 if (unlikely(result == NULL)) {
83 if (unlikely(source_instance->in_class->cl_getattr == NULL)) {
84 PyErr_Format(PyExc_AttributeError,
"%s instance has no attribute '%s'",
85 PyString_AS_STRING(source_instance->in_class->cl_name), PyString_AS_STRING(attr_name));
89 PyObject *args[] = {source, attr_name};
90 return CALL_FUNCTION_WITH_ARGS2(tstate, source_instance->in_class->cl_getattr, args);
95PyObject *LOOKUP_ATTRIBUTE(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
100#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
101 return PyObject_GetAttr(source, attr_name);
103 CHECK_OBJECT(source);
104 CHECK_OBJECT(attr_name);
106 PyTypeObject *type = Py_TYPE(source);
108 if (hasTypeGenericGetAttr(type)) {
110 if (unlikely(type->tp_dict == NULL)) {
111 if (unlikely(PyType_Ready(type) < 0)) {
116 PyObject *descr = Nuitka_TypeLookup(type, attr_name);
117 descrgetfunc func = NULL;
122 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
123 func = Py_TYPE(descr)->tp_descr_get;
125 if (func != NULL && Nuitka_Descr_IsData(descr)) {
126 PyObject *result = func(descr, source, (PyObject *)type);
134 PyObject *dict = NULL;
137#if PYTHON_VERSION >= 0x3b0 && 0
138 if ((type->tp_flags & Py_TPFLAGS_MANAGED_DICT) && *_PyObject_ValuesPointer(source)) {
139 PyObject **dict_pointer;
141 PyDictValues **values_ptr = _PyObject_ValuesPointer(source);
144 if (PyUnicode_CheckExact(attr_name)) {
145 assert(*_PyObject_DictPointer(source) == NULL);
146 PyObject *result = _PyObject_GetInstanceAttribute(source, *values_ptr, attr_name);
147 if (result != NULL) {
151 dict_pointer = _PyObject_DictPointer(source);
152 assert(dict_pointer != NULL && *dict_pointer == NULL);
154 *dict_pointer = dict = _PyObject_MakeDictFromInstanceAttributes(source, *values_ptr);
155 if (unlikely(dict == NULL)) {
164 Py_ssize_t dict_offset = type->tp_dictoffset;
166 if (dict_offset != 0) {
169 if (dict_offset < 0) {
173 tsize = ((PyVarObject *)source)->ob_size;
177 size = _PyObject_VAR_SIZE(type, tsize);
179 dict_offset += (long)size;
182 PyObject **dict_pointer = (PyObject **)((
char *)source + dict_offset);
183 dict = *dict_pointer;
193 PyObject *result = DICT_GET_ITEM1(tstate, dict, attr_name);
197 if (result != NULL) {
200 CHECK_OBJECT(result);
206 PyObject *result = func(descr, source, (PyObject *)type);
209 CHECK_OBJECT_X(result);
218#if PYTHON_VERSION < 0x300
219 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '%s'", type->tp_name,
220 PyString_AS_STRING(attr_name));
222 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '%U'", type->tp_name, attr_name);
226#if PYTHON_VERSION < 0x300
227 else if (type->tp_getattro == PyInstance_Type.tp_getattro && Nuitka_String_CheckExact(attr_name)) {
228 PyObject *result = LOOKUP_INSTANCE(tstate, source, attr_name);
232 else if (type->tp_getattro != NULL) {
233 PyObject *result = (*type->tp_getattro)(source, attr_name);
235 if (unlikely(result == NULL)) {
239 CHECK_OBJECT(result);
241 }
else if (type->tp_getattr != NULL) {
242 PyObject *result = (*type->tp_getattr)(source, (
char *)Nuitka_String_AsString_Unchecked(attr_name));
245 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '%s'", type->tp_name,
246 Nuitka_String_AsString_Unchecked(attr_name));
253PyObject *LOOKUP_ATTRIBUTE_DICT_SLOT(PyThreadState *tstate, PyObject *source) {
254 CHECK_OBJECT(source);
256#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
257 return PyObject_GetAttr(source, const_str_plain___dict__);
259 PyTypeObject *type = Py_TYPE(source);
261 if (hasTypeGenericGetAttr(type)) {
262 if (unlikely(type->tp_dict == NULL)) {
263 if (unlikely(PyType_Ready(type) < 0)) {
268 PyObject *descr = Nuitka_TypeLookup(type, const_str_plain___dict__);
269 descrgetfunc func = NULL;
274 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
275 func = Py_TYPE(descr)->tp_descr_get;
277 if (func != NULL && Nuitka_Descr_IsData(descr)) {
278 PyObject *result = func(descr, source, (PyObject *)type);
286 Py_ssize_t dict_offset = type->tp_dictoffset;
287 PyObject *dict = NULL;
289 if (dict_offset != 0) {
291 if (dict_offset < 0) {
295 tsize = ((PyVarObject *)source)->ob_size;
298 size = _PyObject_VAR_SIZE(type, tsize);
300 dict_offset += (long)size;
303 PyObject **dict_pointer = (PyObject **)((
char *)source + dict_offset);
304 dict = *dict_pointer;
312 PyObject *result = DICT_GET_ITEM1(tstate, dict, const_str_plain___dict__);
314 if (result != NULL) {
318 CHECK_OBJECT(result);
326 PyObject *result = func(descr, source, (PyObject *)type);
329 CHECK_OBJECT_X(result);
338 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '__dict__'", type->tp_name);
341#if PYTHON_VERSION < 0x300
342 else if (type->tp_getattro == PyInstance_Type.tp_getattro) {
343 PyInstanceObject *source_instance = (PyInstanceObject *)source;
344 PyObject *result = source_instance->in_dict;
350 else if (type->tp_getattro != NULL) {
351 PyObject *result = (*type->tp_getattro)(source, const_str_plain___dict__);
353 if (unlikely(result == NULL)) {
357 CHECK_OBJECT(result);
359 }
else if (type->tp_getattr != NULL) {
360 PyObject *result = (*type->tp_getattr)(source, (
char *)
"__dict__");
363 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '__dict__'", type->tp_name);
370PyObject *LOOKUP_ATTRIBUTE_CLASS_SLOT(PyThreadState *tstate, PyObject *source) {
371 CHECK_OBJECT(source);
373#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
374 return PyObject_GetAttr(source, const_str_plain___class__);
376 PyTypeObject *type = Py_TYPE(source);
378 if (hasTypeGenericGetAttr(type)) {
379 if (unlikely(type->tp_dict == NULL)) {
380 if (unlikely(PyType_Ready(type) < 0)) {
385 PyObject *descr = Nuitka_TypeLookup(type, const_str_plain___class__);
386 descrgetfunc func = NULL;
391 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
392 func = Py_TYPE(descr)->tp_descr_get;
394 if (func != NULL && Nuitka_Descr_IsData(descr)) {
395 PyObject *result = func(descr, source, (PyObject *)type);
403 Py_ssize_t dict_offset = type->tp_dictoffset;
404 PyObject *dict = NULL;
406 if (dict_offset != 0) {
408 if (dict_offset < 0) {
412 tsize = ((PyVarObject *)source)->ob_size;
416 size = _PyObject_VAR_SIZE(type, tsize);
418 dict_offset += (long)size;
421 PyObject **dict_pointer = (PyObject **)((
char *)source + dict_offset);
422 dict = *dict_pointer;
430 PyObject *result = DICT_GET_ITEM1(tstate, dict, const_str_plain___class__);
432 if (result != NULL) {
436 CHECK_OBJECT(result);
444 PyObject *result = func(descr, source, (PyObject *)type);
447 CHECK_OBJECT_X(result);
456 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '__class__'", type->tp_name);
459#if PYTHON_VERSION < 0x300
460 else if (type->tp_getattro == PyInstance_Type.tp_getattro) {
461 PyInstanceObject *source_instance = (PyInstanceObject *)source;
462 PyObject *result = (PyObject *)source_instance->in_class;
468 else if (type->tp_getattro != NULL) {
469 PyObject *result = (*type->tp_getattro)(source, const_str_plain___class__);
471 if (unlikely(result == NULL)) {
475 CHECK_OBJECT(result);
477 }
else if (type->tp_getattr != NULL) {
478 PyObject *result = (*type->tp_getattr)(source, (
char *)
"__class__");
481 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '__class__'", type->tp_name);
488int BUILTIN_HASATTR_BOOL(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
489 CHECK_OBJECT(source);
490 CHECK_OBJECT(attr_name);
492#if PYTHON_VERSION < 0x300
493 if (PyUnicode_Check(attr_name)) {
494 attr_name = _PyUnicode_AsDefaultEncodedString(attr_name, NULL);
496 if (unlikely(attr_name == NULL)) {
501 if (unlikely(!PyString_Check(attr_name))) {
502 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"hasattr(): attribute name must be string");
507 if (unlikely(!PyUnicode_Check(attr_name))) {
508 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"hasattr(): attribute name must be string");
517 PyObject *value = PyObject_GetAttr(source, attr_name);
520 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
531bool HAS_ATTR_BOOL(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
532 CHECK_OBJECT(source);
533 CHECK_OBJECT(attr_name);
535#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
536 return PyObject_HasAttr(source, attr_name);
538 PyTypeObject *type = Py_TYPE(source);
540 if (hasTypeGenericGetAttr(type)) {
542 if (unlikely(type->tp_dict == NULL)) {
543 if (unlikely(PyType_Ready(type) < 0)) {
544 CLEAR_ERROR_OCCURRED(tstate);
550 PyObject *descr = Nuitka_TypeLookup(type, attr_name);
551 descrgetfunc func = NULL;
556 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
557 func = Py_TYPE(descr)->tp_descr_get;
559 if (func != NULL && Nuitka_Descr_IsData(descr)) {
560 PyObject *result = func(descr, source, (PyObject *)type);
564 CHECK_OBJECT(result);
570 DROP_ERROR_OCCURRED(tstate);
576 Py_ssize_t dict_offset = type->tp_dictoffset;
577 PyObject *dict = NULL;
579 if (dict_offset != 0) {
581 if (dict_offset < 0) {
585 tsize = ((PyVarObject *)source)->ob_size;
589 size = _PyObject_VAR_SIZE(type, tsize);
591 dict_offset += (long)size;
594 PyObject **dict_pointer = (PyObject **)((
char *)source + dict_offset);
595 dict = *dict_pointer;
604 PyObject *result = DICT_GET_ITEM1(tstate, dict, attr_name);
605 DROP_ERROR_OCCURRED(tstate);
609 if (result != NULL) {
612 CHECK_OBJECT(result);
620 PyObject *result = func(descr, source, (PyObject *)type);
623 if (result != NULL) {
624 CHECK_OBJECT(result);
630 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
645#if PYTHON_VERSION < 0x300
646 else if (type->tp_getattro == PyInstance_Type.tp_getattro && Nuitka_String_CheckExact(attr_name)) {
647 PyObject *result = LOOKUP_INSTANCE(tstate, source, attr_name);
649 if (result == NULL) {
650 CLEAR_ERROR_OCCURRED(tstate);
655 CHECK_OBJECT(result);
661 else if (type->tp_getattro != NULL) {
662 PyObject *result = (*type->tp_getattro)(source, attr_name);
664 if (result == NULL) {
665 DROP_ERROR_OCCURRED(tstate);
670 CHECK_OBJECT(result);
673 }
else if (type->tp_getattr != NULL) {
674 PyObject *result = (*type->tp_getattr)(source, (
char *)Nuitka_String_AsString_Unchecked(attr_name));
676 if (result == NULL) {
677 CLEAR_ERROR_OCCURRED(tstate);
682 CHECK_OBJECT(result);
691int HAS_ATTR_BOOL2(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
692 CHECK_OBJECT(source);
693 CHECK_OBJECT(attr_name);
695#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
696 PyObject *result = PyObject_GetAttr(source, attr_name);
698 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
702 if (result == NULL) {
706 return CHECK_IF_TRUE(result) ? 1 : 0;
708 PyTypeObject *type = Py_TYPE(source);
710 if (hasTypeGenericGetAttr(type)) {
712 if (unlikely(type->tp_dict == NULL)) {
713 if (unlikely(PyType_Ready(type) < 0)) {
718 PyObject *descr = Nuitka_TypeLookup(type, attr_name);
719 descrgetfunc func = NULL;
725 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
726 func = Py_TYPE(descr)->tp_descr_get;
728 if (func != NULL && Nuitka_Descr_IsData(descr)) {
729 PyObject *result = func(descr, source, (PyObject *)type);
733 CHECK_OBJECT(result);
739 DROP_ERROR_OCCURRED(tstate);
745 Py_ssize_t dict_offset = type->tp_dictoffset;
746 PyObject *dict = NULL;
748 if (dict_offset != 0) {
750 if (dict_offset < 0) {
754 tsize = ((PyVarObject *)source)->ob_size;
758 size = _PyObject_VAR_SIZE(type, tsize);
760 dict_offset += (long)size;
763 PyObject **dict_pointer = (PyObject **)((
char *)source + dict_offset);
764 dict = *dict_pointer;
773 PyObject *result = DICT_GET_ITEM1(tstate, dict, attr_name);
775 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
781 if (result != NULL) {
784 CHECK_OBJECT(result);
792 PyObject *result = func(descr, source, (PyObject *)type);
795 if (result != NULL) {
796 CHECK_OBJECT(result);
802 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
817#if PYTHON_VERSION < 0x300
818 else if (type->tp_getattro == PyInstance_Type.tp_getattro && Nuitka_String_CheckExact(attr_name)) {
819 PyObject *result = LOOKUP_INSTANCE(tstate, source, attr_name);
821 if (result == NULL) {
825 CHECK_OBJECT(result);
831 else if (type->tp_getattro != NULL) {
832 PyObject *result = (*type->tp_getattro)(source, attr_name);
834 if (result == NULL) {
835 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
842 CHECK_OBJECT(result);
845 }
else if (type->tp_getattr != NULL) {
846 PyObject *result = (*type->tp_getattr)(source, (
char *)Nuitka_String_AsString_Unchecked(attr_name));
848 if (result == NULL) {
849 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate) ==
false) {
856 CHECK_OBJECT(result);
866#if PYTHON_VERSION < 0x300
867extern PyObject *CALL_FUNCTION_WITH_ARGS3(PyThreadState *tstate, PyObject *called, PyObject *
const *args);
869static bool SET_INSTANCE(PyThreadState *tstate, PyObject *target, PyObject *attr_name, PyObject *value) {
870 CHECK_OBJECT(target);
871 CHECK_OBJECT(attr_name);
874 assert(PyInstance_Check(target));
875 assert(PyString_Check(attr_name));
877 PyInstanceObject *target_instance = (PyInstanceObject *)target;
882 assert(attr_name != const_str_plain___dict__);
883 assert(attr_name != const_str_plain___class__);
885 if (target_instance->in_class->cl_setattr != NULL) {
886 PyObject *args[] = {target, attr_name, value};
887 PyObject *result = CALL_FUNCTION_WITH_ARGS3(tstate, target_instance->in_class->cl_setattr, args);
889 if (unlikely(result == NULL)) {
897 int status = PyDict_SetItem(target_instance->in_dict, attr_name, value);
899 if (unlikely(status != 0)) {
908#if (PYTHON_VERSION < 0x300 || defined(_NUITKA_USE_UNEXPOSED_API)) && !defined(_NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT)
911#define CACHED_KEYS(type) (((PyHeapTypeObject *)type)->ht_cached_keys)
913static bool SET_ATTRIBUTE_GENERIC(PyThreadState *tstate, PyTypeObject *type, PyObject *target, PyObject *attr_name,
916 if (unlikely(type->tp_dict == NULL)) {
917 if (unlikely(PyType_Ready(type) < 0)) {
922 PyObject *descr = Nuitka_TypeLookup(type, attr_name);
927 if (NuitkaType_HasFeatureClass(Py_TYPE(descr))) {
928 descrsetfunc func = Py_TYPE(descr)->tp_descr_set;
930 if (func != NULL && Nuitka_Descr_IsData(descr)) {
931 int res = func(descr, target, value);
939 Py_ssize_t dict_offset = type->tp_dictoffset;
940 PyObject *dict = NULL;
942 if (dict_offset != 0) {
944 if (dict_offset < 0) {
948 tsize = ((PyVarObject *)target)->ob_size;
952 size = _PyObject_VAR_SIZE(type, tsize);
954 dict_offset += (long)size;
957 PyObject **dict_pointer = (PyObject **)((
char *)target + dict_offset);
959#if PYTHON_VERSION >= 0x300
960 if ((type->tp_flags & Py_TPFLAGS_HEAPTYPE) && (CACHED_KEYS(type) != NULL)) {
961#if PYTHON_VERSION >= 0x3d0
962 int res = _PyObjectDict_SetItem(type, target, dict_pointer, attr_name, value);
964 int res = _PyObjectDict_SetItem(type, dict_pointer, attr_name, value);
967 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) {
968 SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_AttributeError, attr_name);
976 dict = *dict_pointer;
979 dict = MAKE_DICT_EMPTY(tstate);
980 *dict_pointer = dict;
991 int res = PyDict_SetItem(dict, attr_name, value);
999#if PYTHON_VERSION < 0x300
1000 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '%s'", type->tp_name,
1001 PyString_AS_STRING(attr_name));
1003 PyErr_Format(PyExc_AttributeError,
"'%s' object has no attribute '%U'", type->tp_name, attr_name);
1010bool SET_ATTRIBUTE(PyThreadState *tstate, PyObject *target, PyObject *attr_name, PyObject *value) {
1011 CHECK_OBJECT(target);
1012 CHECK_OBJECT(attr_name);
1013 CHECK_OBJECT(value);
1015#if _NUITKA_EXPERIMENTAL_DISABLE_ATTR_OPT
1016 int res = PyObject_SetAttr(target, attr_name, value);
1019 PyTypeObject *type = Py_TYPE(target);
1021#if PYTHON_VERSION < 0x300 || defined(_NUITKA_USE_UNEXPOSED_API)
1022 if (hasTypeGenericSetAttr(type)) {
1023 return SET_ATTRIBUTE_GENERIC(tstate, type, target, attr_name, value);
1026#if PYTHON_VERSION < 0x300
1027 if (type->tp_setattro == PyInstance_Type.tp_setattro) {
1028 return SET_INSTANCE(tstate, target, attr_name, value);
1031 if (type->tp_setattro != NULL) {
1032 int status = (*type->tp_setattro)(target, attr_name, value);
1034 if (unlikely(status == -1)) {
1041 if (type->tp_setattr != NULL) {
1042 int status = (*type->tp_setattr)(target, (
char *)Nuitka_String_AsString_Unchecked(attr_name), value);
1044 if (unlikely(status == -1)) {
1051 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
1052 PyErr_Format(PyExc_TypeError,
"'%s' object has no attributes (assign to %s)", type->tp_name,
1053 Nuitka_String_AsString_Unchecked(attr_name));
1057 PyErr_Format(PyExc_TypeError,
"'%s' object has only read-only attributes (assign to %s)", type->tp_name,
1058 Nuitka_String_AsString_Unchecked(attr_name));
1065bool SET_ATTRIBUTE_DICT_SLOT(PyThreadState *tstate, PyObject *target, PyObject *value) {
1066 CHECK_OBJECT(target);
1067 CHECK_OBJECT(value);
1069#if PYTHON_VERSION < 0x300
1070 if (likely(PyInstance_Check(target))) {
1071 PyInstanceObject *target_instance = (PyInstanceObject *)target;
1074 if (unlikely(!PyDict_Check(value))) {
1075 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__dict__ must be set to a dictionary");
1079 PyObject *old = target_instance->in_dict;
1082 target_instance->in_dict = value;
1088 PyTypeObject *type = Py_TYPE(target);
1090 if (type->tp_setattro != NULL) {
1091 int status = (*type->tp_setattro)(target, const_str_plain___dict__, value);
1093 if (unlikely(status == -1)) {
1096 }
else if (type->tp_setattr != NULL) {
1097 int status = (*type->tp_setattr)(target, (
char *)
"__dict__", value);
1099 if (unlikely(status == -1)) {
1102 }
else if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
1103 PyErr_Format(PyExc_TypeError,
"'%s' object has no attributes (assign to __dict__)", type->tp_name);
1107 PyErr_Format(PyExc_TypeError,
"'%s' object has only read-only attributes (assign to __dict__)",
1117bool SET_ATTRIBUTE_CLASS_SLOT(PyThreadState *tstate, PyObject *target, PyObject *value) {
1118 CHECK_OBJECT(target);
1119 CHECK_OBJECT(value);
1121#if PYTHON_VERSION < 0x300
1122 if (likely(PyInstance_Check(target))) {
1123 PyInstanceObject *target_instance = (PyInstanceObject *)target;
1125 if (unlikely(!PyClass_Check(value))) {
1126 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__class__ must be set to a class");
1130 PyObject *old = (PyObject *)(target_instance->in_class);
1132 target_instance->in_class = (PyClassObject *)value;
1137 PyTypeObject *type = Py_TYPE(target);
1139 if (type->tp_setattro != NULL) {
1140 int status = (*type->tp_setattro)(target, const_str_plain___class__, value);
1142 if (unlikely(status == -1)) {
1145 }
else if (type->tp_setattr != NULL) {
1146 int status = (*type->tp_setattr)(target, (
char *)
"__class__", value);
1148 if (unlikely(status == -1)) {
1151 }
else if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
1152 PyErr_Format(PyExc_TypeError,
"'%s' object has no attributes (assign to __class__)", type->tp_name);
1156 PyErr_Format(PyExc_TypeError,
"'%s' object has only read-only attributes (assign to __class__)",
1166PyObject *LOOKUP_SPECIAL(PyThreadState *tstate, PyObject *source, PyObject *attr_name) {
1167#if PYTHON_VERSION < 0x300
1168 if (PyInstance_Check(source)) {
1169 return LOOKUP_INSTANCE(tstate, source, attr_name);
1176 PyObject *result = Nuitka_TypeLookup(Py_TYPE(source), attr_name);
1178 if (likely(result)) {
1179 descrgetfunc func = Py_TYPE(result)->tp_descr_get;
1185 PyObject *func_result = func(result, source, (PyObject *)(Py_TYPE(source)));
1187 if (unlikely(func_result == NULL)) {
1191 CHECK_OBJECT(func_result);
1196#if PYTHON_VERSION < 0x3b0
1197 SET_CURRENT_EXCEPTION_TYPE0_VALUE0(tstate, PyExc_AttributeError, attr_name);
1202 if (attr_name == const_str_plain___exit__) {
1203 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
1204 "'%s' object does not support the context manager protocol (missed __exit__ method)", source);
1205 }
else if (attr_name == const_str_plain___aexit__) {
1206 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
1207 "'%s' object does not support the asynchronous context manager protocol (missed __aexit__ method)", source);
1208 }
else if (attr_name == const_str_plain___aenter__) {
1209 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
"'%s' object does not support the asynchronous context manager protocol",
1212 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
"'%s' object does not support the context manager protocol", source);
1218PyObject *LOOKUP_MODULE_VALUE(PyDictObject *module_dict, PyObject *var_name) {
1219 PyObject *result = GET_STRING_DICT_VALUE(module_dict, (Nuitka_StringObject *)var_name);
1221 if (unlikely(result == NULL)) {
1222 result = GET_STRING_DICT_VALUE(dict_builtin, (Nuitka_StringObject *)var_name);