@@ -139,7 +139,7 @@ method_get(PyObject *self, PyObject *obj, PyObject *type)
139139{
140140 PyMethodDescrObject * descr = (PyMethodDescrObject * )self ;
141141 if (obj == NULL ) {
142- return Py_NewRef (descr );
142+ return PyRegion_NewRef (descr );
143143 }
144144 if (descr_check ((PyDescrObject * )descr , obj ) < 0 ) {
145145 return NULL ;
@@ -164,7 +164,7 @@ member_get(PyObject *self, PyObject *obj, PyObject *type)
164164{
165165 PyMemberDescrObject * descr = (PyMemberDescrObject * )self ;
166166 if (obj == NULL ) {
167- return Py_NewRef (descr );
167+ return PyRegion_NewRef (descr );
168168 }
169169 if (descr_check ((PyDescrObject * )descr , obj ) < 0 ) {
170170 return NULL ;
@@ -242,7 +242,7 @@ member_set(PyObject *self, PyObject *obj, PyObject *value)
242242 if (descr_setcheck ((PyDescrObject * )descr , obj , value ) < 0 ) {
243243 return -1 ;
244244 }
245- return PyMember_SetOne ( (char * )obj , descr -> d_member , value );
245+ return PyMember_SetOneOn ( obj , (char * )obj , descr -> d_member , value );
246246}
247247
248248static int
@@ -519,7 +519,7 @@ classmethoddescr_call(PyObject *_descr, PyObject *args,
519519 }
520520 PyObject * res = PyObject_VectorcallDict (bound , _PyTuple_ITEMS (args )+ 1 ,
521521 argc - 1 , kwds );
522- Py_DECREF (bound );
522+ PyRegion_CLEARLOCAL (bound );
523523 return res ;
524524}
525525
@@ -540,6 +540,13 @@ wrapperdescr_raw_call(PyWrapperDescrObject *descr, PyObject *self,
540540 descr -> d_base -> name );
541541 return NULL ;
542542 }
543+
544+ if (descr -> d_common .d_type ) {
545+ PyRegion_NotifyTypeUse (descr -> d_common .d_type );
546+ } else {
547+ PyRegion_DirtyAllRegions ("A descriptor without a type was called" );
548+ }
549+
543550 return (* wrapper )(self , args , descr -> d_wrapped );
544551}
545552
@@ -579,7 +586,7 @@ wrapperdescr_call(PyObject *_descr, PyObject *args, PyObject *kwds)
579586 return NULL ;
580587 }
581588 result = wrapperdescr_raw_call (descr , self , args , kwds );
582- Py_DECREF (args );
589+ PyRegion_CLEARLOCAL (args );
583590 return result ;
584591}
585592
@@ -619,12 +626,12 @@ calculate_qualname(PyDescrObject *descr)
619626 if (!PyUnicode_Check (type_qualname )) {
620627 PyErr_SetString (PyExc_TypeError , "<descriptor>.__objclass__."
621628 "__qualname__ is not a unicode object" );
622- Py_XDECREF (type_qualname );
629+ PyRegion_CLEARLOCAL (type_qualname );
623630 return NULL ;
624631 }
625632
626633 res = PyUnicode_FromFormat ("%S.%S" , type_qualname , descr -> d_name );
627- Py_DECREF (type_qualname );
634+ PyRegion_CLEARLOCAL (type_qualname );
628635 return res ;
629636}
630637
@@ -763,6 +770,7 @@ PyTypeObject PyMethodDescr_Type = {
763770 method_get , /* tp_descr_get */
764771 0 , /* tp_descr_set */
765772 .tp_reachable = _PyObject_ReachableVisitType ,
773+ .tp_flags2 = Py_TPFLAGS2_REGION_AWARE ,
766774};
767775
768776/* This is for METH_CLASS in C, not for "f = classmethod(f)" in Python! */
@@ -802,6 +810,7 @@ PyTypeObject PyClassMethodDescr_Type = {
802810 classmethod_get , /* tp_descr_get */
803811 0 , /* tp_descr_set */
804812 .tp_reachable = _PyObject_ReachableVisitType ,
813+ .tp_flags2 = Py_TPFLAGS2_REGION_AWARE ,
805814};
806815
807816PyTypeObject PyMemberDescr_Type = {
@@ -840,6 +849,7 @@ PyTypeObject PyMemberDescr_Type = {
840849 member_get , /* tp_descr_get */
841850 member_set , /* tp_descr_set */
842851 .tp_reachable = _PyObject_ReachableVisitType ,
852+ .tp_flags2 = Py_TPFLAGS2_REGION_AWARE ,
843853};
844854
845855PyTypeObject PyGetSetDescr_Type = {
@@ -879,6 +889,7 @@ PyTypeObject PyGetSetDescr_Type = {
879889 getset_set , /* tp_descr_set */
880890 .tp_reachable = _PyObject_ReachableVisitType ,
881891 .tp_flags2 = Py_TPFLAGS2_REGION_AWARE
892+ .tp_flags2 = Py_TPFLAGS2_REGION_AWARE ,
882893};
883894
884895PyTypeObject PyWrapperDescr_Type = {
@@ -918,6 +929,7 @@ PyTypeObject PyWrapperDescr_Type = {
918929 wrapperdescr_get , /* tp_descr_get */
919930 0 , /* tp_descr_set */
920931 .tp_reachable = _PyObject_ReachableVisitType ,
932+ .tp_flags2 = Py_TPFLAGS2_REGION_AWARE ,
921933};
922934
923935static PyDescrObject *
@@ -1533,7 +1545,7 @@ PyWrapper_New(PyObject *d, PyObject *self)
15331545 wp = PyObject_GC_New (wrapperobject , & _PyMethodWrapper_Type );
15341546 if (wp == NULL )
15351547 return NULL ;
1536- if (PyRegion_AddRef (wp , descr )){
1548+ if (PyRegion_AddRefs (wp , descr , self )){
15371549 Py_DECREF (wp );
15381550 return NULL ;
15391551 }
0 commit comments