@@ -63,6 +63,28 @@ static inline PyObject* _Py_XNewRef(PyObject *obj)
6363#endif
6464
6565
66+ // See https://bugs.python.org/issue42522
67+ #if !defined(_Py_StealRef )
68+ static inline PyObject * __Py_StealRef (PyObject * obj )
69+ {
70+ Py_DECREF (obj );
71+ return obj ;
72+ }
73+ #define _Py_StealRef (obj ) __Py_StealRef(_PyObject_CAST(obj))
74+ #endif
75+
76+
77+ // See https://bugs.python.org/issue42522
78+ #if !defined(_Py_XStealRef )
79+ static inline PyObject * __Py_XStealRef (PyObject * obj )
80+ {
81+ Py_XDECREF (obj );
82+ return obj ;
83+ }
84+ #define _Py_XStealRef (obj ) __Py_XStealRef(_PyObject_CAST(obj))
85+ #endif
86+
87+
6688// bpo-39573 added Py_SET_REFCNT() to Python 3.9.0a4
6789#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_REFCNT )
6890static inline void _Py_SET_REFCNT (PyObject * ob , Py_ssize_t refcnt )
@@ -109,9 +131,7 @@ PyFrame_GetCode(PyFrameObject *frame)
109131static inline PyCodeObject *
110132_PyFrame_GetCodeBorrow (PyFrameObject * frame )
111133{
112- PyCodeObject * code = PyFrame_GetCode (frame );
113- Py_DECREF (code );
114- return code ; // borrowed reference
134+ return (PyCodeObject * )_Py_StealRef (PyFrame_GetCode (frame ));
115135}
116136
117137
@@ -128,9 +148,7 @@ PyFrame_GetBack(PyFrameObject *frame)
128148static inline PyFrameObject *
129149_PyFrame_GetBackBorrow (PyFrameObject * frame )
130150{
131- PyFrameObject * back = PyFrame_GetBack (frame );
132- Py_XDECREF (back );
133- return back ; // borrowed reference
151+ return (PyFrameObject * )_Py_XStealRef (PyFrame_GetBack (frame ));
134152}
135153
136154
@@ -158,9 +176,7 @@ PyThreadState_GetFrame(PyThreadState *tstate)
158176static inline PyFrameObject *
159177_PyThreadState_GetFrameBorrow (PyThreadState * tstate )
160178{
161- PyFrameObject * frame = PyThreadState_GetFrame (tstate );
162- Py_XDECREF (frame );
163- return frame ; // borrowed reference
179+ return (PyFrameObject * )_Py_XStealRef (PyThreadState_GetFrame (tstate ));
164180}
165181
166182
0 commit comments