diff --git a/Lib/inspect.py b/Lib/inspect.py index 183e67fabf966e..3bcc84c8bcf98c 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1698,7 +1698,7 @@ def _shadowed_dict_from_weakref_mro_tuple(*weakref_mro): class_dict = dunder_dict['__dict__'] if not (type(class_dict) is types.GetSetDescriptorType and class_dict.__name__ == "__dict__" and - class_dict.__objclass__ is entry): + (class_dict.__objclass__ is entry or class_dict.__objclass__ is object)): return class_dict return _sentinel diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 10c465b95ac192..a54f713c16005a 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -190,9 +190,11 @@ getset_get(PyObject *self, PyObject *obj, PyObject *type) if (descr_check((PyDescrObject *)descr, obj) < 0) { return NULL; } - if (descr->d_getset->get != NULL) + if (descr->d_getset->get != NULL) { + void *closure = descr->d_getset->closure == (void *)1 ? NULL : descr->d_getset->closure; return descr_get_trampoline_call( - descr->d_getset->get, obj, descr->d_getset->closure); + descr->d_getset->get, obj, closure); + } PyErr_Format(PyExc_AttributeError, "attribute '%V' of '%.100s' objects is not readable", descr_name((PyDescrObject *)descr), "?", @@ -247,9 +249,9 @@ getset_set(PyObject *self, PyObject *obj, PyObject *value) return -1; } if (descr->d_getset->set != NULL) { + void *closure = descr->d_getset->closure == (void *)1 ? NULL : descr->d_getset->closure; return descr_set_trampoline_call( - descr->d_getset->set, obj, value, - descr->d_getset->closure); + descr->d_getset->set, obj, value, closure); } PyErr_Format(PyExc_AttributeError, "attribute '%V' of '%.100s' objects is not writable", @@ -1004,10 +1006,16 @@ PyDescr_NewGetSet(PyTypeObject *type, PyGetSetDef *getset) { PyGetSetDescrObject *descr; + bool should_adjust_d_type = (getset->closure == (void *)1); + descr = (PyGetSetDescrObject *)descr_new(&PyGetSetDescr_Type, type, getset->name); if (descr != NULL) descr->d_getset = getset; + + if (should_adjust_d_type) { + Py_SETREF(descr->d_common.d_type, &PyBaseObject_Type); + } return (PyObject *)descr; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index db923c164774b7..76166f3b75aa5a 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4031,21 +4031,21 @@ subtype_getweakref(PyObject *obj, void *context) static PyGetSetDef subtype_getsets_full[] = { {"__dict__", subtype_dict, subtype_setdict, - PyDoc_STR("dictionary for instance variables")}, + PyDoc_STR("dictionary for instance variables"), (void *)1}, {"__weakref__", subtype_getweakref, NULL, - PyDoc_STR("list of weak references to the object")}, + PyDoc_STR("list of weak references to the object"), (void *)1}, {0} }; static PyGetSetDef subtype_getsets_dict_only[] = { {"__dict__", subtype_dict, subtype_setdict, - PyDoc_STR("dictionary for instance variables")}, + PyDoc_STR("dictionary for instance variables"), (void *)1}, {0} }; static PyGetSetDef subtype_getsets_weakref_only[] = { {"__weakref__", subtype_getweakref, NULL, - PyDoc_STR("list of weak references to the object")}, + PyDoc_STR("list of weak references to the object"), (void *)1}, {0} };