@@ -77,21 +77,29 @@ check by comparing the reference count field to the immortality reference count.
7777#endif // Py_GIL_DISABLED
7878
7979
80- static inline Py_ssize_t Py_REFCNT (PyObject * ob ) {
81- #if !defined(Py_GIL_DISABLED )
82- return ob -> ob_refcnt ;
80+ // Py_REFCNT() implementation for the stable ABI
81+ PyAPI_FUNC (Py_ssize_t ) Py_REFCNT (PyObject * ob );
82+
83+ #if defined(Py_LIMITED_API ) && Py_LIMITED_API + 0 >= 0x030e0000
84+ // Stable ABI implements Py_REFCNT() as a function call
85+ // on limited C API version 3.14 and newer.
8386#else
84- uint32_t local = _Py_atomic_load_uint32_relaxed (& ob -> ob_ref_local );
85- if (local == _Py_IMMORTAL_REFCNT_LOCAL ) {
86- return _Py_IMMORTAL_REFCNT ;
87+ static inline Py_ssize_t _Py_REFCNT (PyObject * ob ) {
88+ #if !defined(Py_GIL_DISABLED )
89+ return ob -> ob_refcnt ;
90+ #else
91+ uint32_t local = _Py_atomic_load_uint32_relaxed (& ob -> ob_ref_local );
92+ if (local == _Py_IMMORTAL_REFCNT_LOCAL ) {
93+ return _Py_IMMORTAL_REFCNT ;
94+ }
95+ Py_ssize_t shared = _Py_atomic_load_ssize_relaxed (& ob -> ob_ref_shared );
96+ return _Py_STATIC_CAST (Py_ssize_t , local ) +
97+ Py_ARITHMETIC_RIGHT_SHIFT (Py_ssize_t , shared , _Py_REF_SHARED_SHIFT );
98+ #endif
8799 }
88- Py_ssize_t shared = _Py_atomic_load_ssize_relaxed (& ob -> ob_ref_shared );
89- return _Py_STATIC_CAST (Py_ssize_t , local ) +
90- Py_ARITHMETIC_RIGHT_SHIFT (Py_ssize_t , shared , _Py_REF_SHARED_SHIFT );
91- #endif
92- }
93- #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
94- # define Py_REFCNT (ob ) Py_REFCNT(_PyObject_CAST(ob))
100+ #if !defined(Py_LIMITED_API ) || Py_LIMITED_API + 0 < 0x030b0000
101+ # define Py_REFCNT (ob ) _Py_REFCNT(_PyObject_CAST(ob))
102+ #endif
95103#endif
96104
97105
0 commit comments