@@ -33,17 +33,23 @@ extern "C" {
33
33
34
34
35
35
// C++ compatibility
36
+ #ifndef _Py_CAST
37
+ # ifdef __cplusplus
38
+ # define _Py_CAST (type , expr ) \
39
+ const_cast<type>(reinterpret_cast<const type>(expr))
40
+ # else
41
+ # define _Py_CAST (type , expr ) ((type)(expr))
42
+ # endif
43
+ #endif
36
44
#ifdef __cplusplus
37
- # define PYCAPI_COMPAT_CAST (TYPE , EXPR ) reinterpret_cast<TYPE>(EXPR)
38
45
# define PYCAPI_COMPAT_NULL nullptr
39
46
#else
40
- # define PYCAPI_COMPAT_CAST (TYPE , EXPR ) ((TYPE)(EXPR))
41
47
# define PYCAPI_COMPAT_NULL NULL
42
48
#endif
43
49
44
50
// Cast argument to PyObject* type.
45
51
#ifndef _PyObject_CAST
46
- # define _PyObject_CAST (op ) PYCAPI_COMPAT_CAST (PyObject*, op)
52
+ # define _PyObject_CAST (op ) _Py_CAST (PyObject*, op)
47
53
#endif
48
54
49
55
@@ -71,30 +77,6 @@ _Py_XNewRef(PyObject *obj)
71
77
#endif
72
78
73
79
74
- // See https://bugs.python.org/issue42522
75
- #if !defined(_Py_StealRef )
76
- PYCAPI_COMPAT_STATIC_INLINE (PyObject * )
77
- __Py_StealRef (PyObject * obj )
78
- {
79
- Py_DECREF (obj );
80
- return obj ;
81
- }
82
- #define _Py_StealRef (obj ) __Py_StealRef(_PyObject_CAST(obj))
83
- #endif
84
-
85
-
86
- // See https://bugs.python.org/issue42522
87
- #if !defined(_Py_XStealRef )
88
- PYCAPI_COMPAT_STATIC_INLINE (PyObject * )
89
- __Py_XStealRef (PyObject * obj )
90
- {
91
- Py_XDECREF (obj );
92
- return obj ;
93
- }
94
- #define _Py_XStealRef (obj ) __Py_XStealRef(_PyObject_CAST(obj))
95
- #endif
96
-
97
-
98
80
// bpo-39573 added Py_SET_REFCNT() to Python 3.9.0a4
99
81
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_REFCNT )
100
82
PYCAPI_COMPAT_STATIC_INLINE (void )
@@ -170,15 +152,16 @@ PyFrame_GetCode(PyFrameObject *frame)
170
152
{
171
153
assert (frame != PYCAPI_COMPAT_NULL );
172
154
assert (frame -> f_code != PYCAPI_COMPAT_NULL );
173
- return PYCAPI_COMPAT_CAST (PyCodeObject * , Py_NewRef (frame -> f_code ));
155
+ return _Py_CAST (PyCodeObject * , Py_NewRef (frame -> f_code ));
174
156
}
175
157
#endif
176
158
177
159
PYCAPI_COMPAT_STATIC_INLINE (PyCodeObject * )
178
160
_PyFrame_GetCodeBorrow (PyFrameObject * frame )
179
161
{
180
- return PYCAPI_COMPAT_CAST (PyCodeObject * ,
181
- _Py_StealRef (PyFrame_GetCode (frame )));
162
+ PyCodeObject * code = PyFrame_GetCode (frame );
163
+ Py_DECREF (code );
164
+ return code ;
182
165
}
183
166
184
167
@@ -188,16 +171,17 @@ PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
188
171
PyFrame_GetBack (PyFrameObject * frame )
189
172
{
190
173
assert (frame != PYCAPI_COMPAT_NULL );
191
- return PYCAPI_COMPAT_CAST (PyFrameObject * , Py_XNewRef (frame -> f_back ));
174
+ return _Py_CAST (PyFrameObject * , Py_XNewRef (frame -> f_back ));
192
175
}
193
176
#endif
194
177
195
178
#if !defined(PYPY_VERSION )
196
179
PYCAPI_COMPAT_STATIC_INLINE (PyFrameObject * )
197
180
_PyFrame_GetBackBorrow (PyFrameObject * frame )
198
181
{
199
- return PYCAPI_COMPAT_CAST (PyFrameObject * ,
200
- _Py_XStealRef (PyFrame_GetBack (frame )));
182
+ PyFrameObject * back = PyFrame_GetBack (frame );
183
+ Py_XDECREF (back );
184
+ return back ;
201
185
}
202
186
#endif
203
187
@@ -276,16 +260,17 @@ PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
276
260
PyThreadState_GetFrame (PyThreadState * tstate )
277
261
{
278
262
assert (tstate != PYCAPI_COMPAT_NULL );
279
- return PYCAPI_COMPAT_CAST (PyFrameObject * , Py_XNewRef (tstate -> frame ));
263
+ return _Py_CAST (PyFrameObject * , Py_XNewRef (tstate -> frame ));
280
264
}
281
265
#endif
282
266
283
267
#if !defined(PYPY_VERSION )
284
268
PYCAPI_COMPAT_STATIC_INLINE (PyFrameObject * )
285
269
_PyThreadState_GetFrameBorrow (PyThreadState * tstate )
286
270
{
287
- return PYCAPI_COMPAT_CAST (PyFrameObject * ,
288
- _Py_XStealRef (PyThreadState_GetFrame (tstate )));
271
+ PyFrameObject * frame = PyThreadState_GetFrame (tstate );
272
+ Py_XDECREF (frame );
273
+ return frame ;
289
274
}
290
275
#endif
291
276
@@ -429,7 +414,7 @@ PyObject_GC_IsTracked(PyObject* obj)
429
414
PYCAPI_COMPAT_STATIC_INLINE (int )
430
415
PyObject_GC_IsFinalized (PyObject * obj )
431
416
{
432
- PyGC_Head * gc = PYCAPI_COMPAT_CAST (PyGC_Head * , obj ) - 1 ;
417
+ PyGC_Head * gc = _Py_CAST (PyGC_Head * , obj ) - 1 ;
433
418
return (PyObject_IS_GC (obj ) && _PyGCHead_FINALIZED (gc ));
434
419
}
435
420
#endif
0 commit comments