@@ -265,56 +265,41 @@ _Py_IsOwnedByCurrentThread(PyObject *ob)
265
265
}
266
266
#endif
267
267
268
- // Py_TYPE() implementation for the stable ABI
269
- PyAPI_FUNC (PyTypeObject * ) Py_TYPE (PyObject * ob );
270
-
271
- #if defined(Py_LIMITED_API ) && Py_LIMITED_API + 0 >= 0x030e0000
272
- // Stable ABI implements Py_TYPE() as a function call
273
- // on limited C API version 3.14 and newer.
274
- #else
275
- static inline PyTypeObject * _Py_TYPE (PyObject * ob )
276
- {
277
- return ob -> ob_type ;
278
- }
279
- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
280
- # define Py_TYPE (ob ) _Py_TYPE(_PyObject_CAST(ob))
281
- #else
282
- # define Py_TYPE (ob ) _Py_TYPE(ob)
283
- #endif
284
- #endif
285
-
286
268
PyAPI_DATA (PyTypeObject ) PyLong_Type ;
287
269
PyAPI_DATA (PyTypeObject ) PyBool_Type ;
288
270
271
+ /* Definitions for the stable ABI */
272
+ PyAPI_FUNC (PyTypeObject * ) Py_TYPE (PyObject * ob );
273
+ PyAPI_FUNC (Py_ssize_t ) Py_SIZE (PyObject * ob );
274
+ PyAPI_FUNC (int ) Py_IS_TYPE (PyObject * ob , PyTypeObject * type );
275
+ PyAPI_FUNC (void ) Py_SET_SIZE (PyVarObject * ob , Py_ssize_t size );
276
+
289
277
#ifndef _Py_OPAQUE_PYOBJECT
278
+
279
+ static inline
280
+ PyTypeObject * _Py_TYPE_impl (PyObject * ob )
281
+ {
282
+ return ob -> ob_type ;
283
+ }
284
+
290
285
// bpo-39573: The Py_SET_SIZE() function must be used to set an object size.
291
- static inline Py_ssize_t Py_SIZE (PyObject * ob ) {
286
+ static inline Py_ssize_t
287
+ _Py_SIZE_impl (PyObject * ob )
288
+ {
292
289
assert (Py_TYPE (ob ) != & PyLong_Type );
293
290
assert (Py_TYPE (ob ) != & PyBool_Type );
294
291
return _PyVarObject_CAST (ob )-> ob_size ;
295
292
}
296
- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
297
- # define Py_SIZE (ob ) Py_SIZE(_PyObject_CAST(ob))
298
- #endif
299
- #endif // !defined(_Py_OPAQUE_PYOBJECT)
300
293
301
- static inline int Py_IS_TYPE (PyObject * ob , PyTypeObject * type ) {
294
+ static inline int
295
+ _Py_IS_TYPE_impl (PyObject * ob , PyTypeObject * type )
296
+ {
302
297
return Py_TYPE (ob ) == type ;
303
298
}
304
- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
305
- # define Py_IS_TYPE (ob , type ) Py_IS_TYPE(_PyObject_CAST(ob), (type))
306
- #endif
307
-
308
-
309
- #ifndef _Py_OPAQUE_PYOBJECT
310
- static inline void Py_SET_TYPE (PyObject * ob , PyTypeObject * type ) {
311
- ob -> ob_type = type ;
312
- }
313
- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
314
- # define Py_SET_TYPE (ob , type ) Py_SET_TYPE(_PyObject_CAST(ob), type)
315
- #endif
316
299
317
- static inline void Py_SET_SIZE (PyVarObject * ob , Py_ssize_t size ) {
300
+ static inline void
301
+ _Py_SET_SIZE_impl (PyVarObject * ob , Py_ssize_t size )
302
+ {
318
303
assert (Py_TYPE (_PyObject_CAST (ob )) != & PyLong_Type );
319
304
assert (Py_TYPE (_PyObject_CAST (ob )) != & PyBool_Type );
320
305
#ifdef Py_GIL_DISABLED
@@ -323,9 +308,31 @@ static inline void Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) {
323
308
ob -> ob_size = size ;
324
309
#endif
325
310
}
326
- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
327
- # define Py_SET_SIZE (ob , size ) Py_SET_SIZE(_PyVarObject_CAST(ob), (size))
311
+
312
+ static inline void
313
+ Py_SET_TYPE (PyObject * ob , PyTypeObject * type )
314
+ {
315
+ ob -> ob_type = type ;
316
+ }
317
+
318
+ #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < _Py_PACK_VERSION (3 , 11 )
319
+ // Non-limited API & limited API 3.11 & below: the user can omit casts
320
+ # define Py_TYPE (ob ) _Py_TYPE_impl(_PyObject_CAST(ob))
321
+ # define Py_SIZE (ob ) _Py_SIZE_impl(_PyObject_CAST(ob))
322
+ # define Py_IS_TYPE (ob , type ) _Py_IS_TYPE_impl(_PyObject_CAST(ob), (type))
323
+ # define Py_SET_SIZE (ob , size ) _Py_SET_SIZE_impl(_PyVarObject_CAST(ob), (size))
324
+ # define Py_SET_TYPE (ob , type ) Py_SET_TYPE(_PyObject_CAST(ob), type)
325
+ #elif Py_LIMITED_API + 0 < _Py_PACK_VERSION (3 , 15 )
326
+ # if Py_LIMITED_API + 0 < _Py_PACK_VERSION (3 , 14 )
327
+ // Py_TYPE() is a function call on Limited API 3.14 and newer
328
+ # define Py_TYPE (ob ) _Py_TYPE_impl(ob)
329
+ # endif
330
+ // These are function calls on Limited API 3.15 and newer:
331
+ # define Py_SIZE (ob ) _Py_SIZE_impl(ob)
332
+ # define Py_IS_TYPE (ob , type ) _Py_IS_TYPE_impl((ob), (type))
333
+ # define Py_SET_SIZE (ob , size ) _Py_SET_SIZE_impl((ob), (size))
328
334
#endif
335
+
329
336
#endif // !defined(_Py_OPAQUE_PYOBJECT)
330
337
331
338
0 commit comments