@@ -190,9 +190,11 @@ getset_get(PyObject *self, PyObject *obj, PyObject *type)
190190 if (descr_check ((PyDescrObject * )descr , obj ) < 0 ) {
191191 return NULL ;
192192 }
193- if (descr -> d_getset -> get != NULL )
193+ if (descr -> d_getset -> get != NULL ) {
194+ void * closure = descr -> d_getset -> closure == (void * )1 ? NULL : descr -> d_getset -> closure ;
194195 return descr_get_trampoline_call (
195- descr -> d_getset -> get , obj , descr -> d_getset -> closure );
196+ descr -> d_getset -> get , obj , closure );
197+ }
196198 PyErr_Format (PyExc_AttributeError ,
197199 "attribute '%V' of '%.100s' objects is not readable" ,
198200 descr_name ((PyDescrObject * )descr ), "?" ,
@@ -247,9 +249,9 @@ getset_set(PyObject *self, PyObject *obj, PyObject *value)
247249 return -1 ;
248250 }
249251 if (descr -> d_getset -> set != NULL ) {
252+ void * closure = descr -> d_getset -> closure == (void * )1 ? NULL : descr -> d_getset -> closure ;
250253 return descr_set_trampoline_call (
251- descr -> d_getset -> set , obj , value ,
252- descr -> d_getset -> closure );
254+ descr -> d_getset -> set , obj , value , closure );
253255 }
254256 PyErr_Format (PyExc_AttributeError ,
255257 "attribute '%V' of '%.100s' objects is not writable" ,
@@ -1004,10 +1006,16 @@ PyDescr_NewGetSet(PyTypeObject *type, PyGetSetDef *getset)
10041006{
10051007 PyGetSetDescrObject * descr ;
10061008
1009+ bool should_adjust_d_type = (getset -> closure == (void * )1 );
1010+
10071011 descr = (PyGetSetDescrObject * )descr_new (& PyGetSetDescr_Type ,
10081012 type , getset -> name );
10091013 if (descr != NULL )
10101014 descr -> d_getset = getset ;
1015+
1016+ if (should_adjust_d_type ) {
1017+ Py_SETREF (descr -> d_common .d_type , & PyBaseObject_Type );
1018+ }
10111019 return (PyObject * )descr ;
10121020}
10131021
0 commit comments