@@ -239,6 +239,7 @@ PyStackRef_IsNullOrInt(_PyStackRef ref);
239239#else 
240240
241241#define  Py_INT_TAG  3
242+ #define  Py_TAG_REFCNT  1
242243
243244static  inline  bool 
244245PyStackRef_IsTaggedInt (_PyStackRef  i )
@@ -264,7 +265,7 @@ PyStackRef_UntagInt(_PyStackRef i)
264265
265266#ifdef  Py_GIL_DISABLED 
266267
267- #define  Py_TAG_DEFERRED  (1) 
268+ #define  Py_TAG_DEFERRED  Py_TAG_REFCNT 
268269
269270#define  Py_TAG_PTR       ((uintptr_t)0)
270271#define  Py_TAG_BITS      ((uintptr_t)1)
@@ -442,14 +443,13 @@ PyStackRef_AsStrongReference(_PyStackRef stackref)
442443/* References to immortal objects always have their tag bit set to Py_TAG_REFCNT 
443444 * as they can (must) have their reclamation deferred */ 
444445
445- #define  Py_TAG_BITS  1
446- #define  Py_TAG_REFCNT  1
446+ #define  Py_TAG_BITS  3
447447#if  _Py_IMMORTAL_FLAGS  !=  Py_TAG_REFCNT 
448448#  error  "_Py_IMMORTAL_FLAGS != Py_TAG_REFCNT"
449449#endif 
450450
451451#define  BITS_TO_PTR (REF ) ((PyObject *)((REF).bits))
452- #define  BITS_TO_PTR_MASKED (REF ) ((PyObject *)(((REF).bits) & (~Py_TAG_BITS )))
452+ #define  BITS_TO_PTR_MASKED (REF ) ((PyObject *)(((REF).bits) & (~Py_TAG_REFCNT )))
453453
454454#define  PyStackRef_NULL_BITS  Py_TAG_REFCNT
455455static  const  _PyStackRef  PyStackRef_NULL  =  { .bits  =  PyStackRef_NULL_BITS  };
@@ -529,7 +529,7 @@ PyStackRef_FromPyObjectSteal(PyObject *obj)
529529{
530530    assert (obj  !=  NULL );
531531#if  SIZEOF_VOID_P  >  4 
532-     unsigned int   tag  =  obj -> ob_flags  &  Py_TAG_BITS ;
532+     unsigned int   tag  =  obj -> ob_flags  &  Py_TAG_REFCNT ;
533533#else 
534534    unsigned int   tag  =  _Py_IsImmortal (obj ) ? Py_TAG_REFCNT  : 0 ;
535535#endif 
@@ -548,12 +548,6 @@ PyStackRef_FromPyObjectStealMortal(PyObject *obj)
548548    return  ref ;
549549}
550550
551- // Check if a stackref is exactly the same as another stackref, including the 
552- // the deferred bit. This can only be used safely if you know that the deferred 
553- // bits of `a` and `b` match. 
554- #define  PyStackRef_IsExactly (a , b ) \
555-     (assert(((a).bits & Py_TAG_BITS) == ((b).bits & Py_TAG_BITS)), (a).bits == (b).bits)
556- 
557551static  inline  _PyStackRef 
558552_PyStackRef_FromPyObjectNew (PyObject  * obj )
559553{
@@ -606,7 +600,7 @@ PyStackRef_DUP(_PyStackRef ref)
606600static  inline  bool 
607601PyStackRef_IsHeapSafe (_PyStackRef  ref )
608602{
609-     return  (ref .bits  &  Py_TAG_BITS ) ==   0  ||  ref .bits  ==  PyStackRef_NULL_BITS  ||   _Py_IsImmortal (BITS_TO_PTR_MASKED (ref ));
603+     return  (ref .bits  &  Py_TAG_BITS ) !=   Py_TAG_REFCNT  ||  ref .bits  ==  PyStackRef_NULL_BITS  ||   _Py_IsImmortal (BITS_TO_PTR_MASKED (ref ));
610604}
611605
612606static  inline  _PyStackRef 
@@ -681,7 +675,7 @@ PyStackRef_XCLOSE(_PyStackRef ref)
681675
682676// Note: this is a macro because MSVC (Windows) has trouble inlining it. 
683677
684- #define  PyStackRef_Is (a , b ) (((a).bits & (~Py_TAG_BITS )) == ((b).bits & (~Py_TAG_BITS )))
678+ #define  PyStackRef_Is (a , b ) (((a).bits & (~Py_TAG_REFCNT )) == ((b).bits & (~Py_TAG_REFCNT )))
685679
686680
687681#endif  // !defined(Py_GIL_DISABLED) && defined(Py_STACKREF_DEBUG) 
0 commit comments