@@ -238,6 +238,7 @@ PyStackRef_IsNullOrInt(_PyStackRef ref);
238238#else 
239239
240240#define  Py_INT_TAG  3
241+ #define  Py_TAG_REFCNT  1
241242
242243static  inline  bool 
243244PyStackRef_IsTaggedInt (_PyStackRef  i )
@@ -263,7 +264,7 @@ PyStackRef_UntagInt(_PyStackRef i)
263264
264265#ifdef  Py_GIL_DISABLED 
265266
266- #define  Py_TAG_DEFERRED  (1) 
267+ #define  Py_TAG_DEFERRED  Py_TAG_REFCNT 
267268
268269#define  Py_TAG_PTR       ((uintptr_t)0)
269270#define  Py_TAG_BITS      ((uintptr_t)1)
@@ -441,14 +442,13 @@ PyStackRef_AsStrongReference(_PyStackRef stackref)
441442/* References to immortal objects always have their tag bit set to Py_TAG_REFCNT 
442443 * as they can (must) have their reclamation deferred */ 
443444
444- #define  Py_TAG_BITS  1
445- #define  Py_TAG_REFCNT  1
445+ #define  Py_TAG_BITS  3
446446#if  _Py_IMMORTAL_FLAGS  !=  Py_TAG_REFCNT 
447447#  error  "_Py_IMMORTAL_FLAGS != Py_TAG_REFCNT"
448448#endif 
449449
450450#define  BITS_TO_PTR (REF ) ((PyObject *)((REF).bits))
451- #define  BITS_TO_PTR_MASKED (REF ) ((PyObject *)(((REF).bits) & (~Py_TAG_BITS )))
451+ #define  BITS_TO_PTR_MASKED (REF ) ((PyObject *)(((REF).bits) & (~Py_TAG_REFCNT )))
452452
453453#define  PyStackRef_NULL_BITS  Py_TAG_REFCNT
454454static  const  _PyStackRef  PyStackRef_NULL  =  { .bits  =  PyStackRef_NULL_BITS  };
@@ -528,7 +528,7 @@ PyStackRef_FromPyObjectSteal(PyObject *obj)
528528{
529529    assert (obj  !=  NULL );
530530#if  SIZEOF_VOID_P  >  4 
531-     unsigned int   tag  =  obj -> ob_flags  &  Py_TAG_BITS ;
531+     unsigned int   tag  =  obj -> ob_flags  &  Py_TAG_REFCNT ;
532532#else 
533533    unsigned int   tag  =  _Py_IsImmortal (obj ) ? Py_TAG_REFCNT  : 0 ;
534534#endif 
@@ -547,12 +547,6 @@ PyStackRef_FromPyObjectStealMortal(PyObject *obj)
547547    return  ref ;
548548}
549549
550- // Check if a stackref is exactly the same as another stackref, including the 
551- // the deferred bit. This can only be used safely if you know that the deferred 
552- // bits of `a` and `b` match. 
553- #define  PyStackRef_IsExactly (a , b ) \
554-     (assert(((a).bits & Py_TAG_BITS) == ((b).bits & Py_TAG_BITS)), (a).bits == (b).bits)
555- 
556550static  inline  _PyStackRef 
557551_PyStackRef_FromPyObjectNew (PyObject  * obj )
558552{
@@ -604,7 +598,7 @@ PyStackRef_DUP(_PyStackRef ref)
604598static  inline  bool 
605599PyStackRef_IsHeapSafe (_PyStackRef  ref )
606600{
607-     return  (ref .bits  &  Py_TAG_BITS ) ==   0  ||  ref .bits  ==  PyStackRef_NULL_BITS  ||   _Py_IsImmortal (BITS_TO_PTR_MASKED (ref ));
601+     return  (ref .bits  &  Py_TAG_BITS ) !=   Py_TAG_REFCNT  ||  ref .bits  ==  PyStackRef_NULL_BITS  ||   _Py_IsImmortal (BITS_TO_PTR_MASKED (ref ));
608602}
609603
610604static  inline  _PyStackRef 
@@ -679,7 +673,7 @@ PyStackRef_XCLOSE(_PyStackRef ref)
679673
680674// Note: this is a macro because MSVC (Windows) has trouble inlining it. 
681675
682- #define  PyStackRef_Is (a , b ) (((a).bits & (~Py_TAG_BITS )) == ((b).bits & (~Py_TAG_BITS )))
676+ #define  PyStackRef_Is (a , b ) (((a).bits & (~Py_TAG_REFCNT )) == ((b).bits & (~Py_TAG_REFCNT )))
683677
684678
685679#endif  // !defined(Py_GIL_DISABLED) && defined(Py_STACKREF_DEBUG) 
0 commit comments