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} }; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy