GH-133261: Make sure trashcan pointers look mortal -- 32 bit (GH-133450)

Make sure trashcan pointer look mortal -- 32 bit
This commit is contained in:
Mark Shannon 2025-05-05 20:51:32 +01:00 committed by GitHub
parent 9434709edf
commit d48616e08c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2940,20 +2940,29 @@ pointer_to_safe_refcount(void *ptr)
{
uintptr_t full = (uintptr_t)ptr;
assert((full & 3) == 0);
#if SIZEOF_VOID_P > 4
uint32_t refcnt = (uint32_t)full;
if (refcnt >= (uint32_t)_Py_IMMORTAL_MINIMUM_REFCNT) {
full = full - ((uintptr_t)_Py_IMMORTAL_MINIMUM_REFCNT) + 1;
}
return full + 2;
#else
// Make the top two bits 0, so it appears mortal.
return (full >> 2) + 1;
#endif
}
static void *
safe_refcount_to_pointer(uintptr_t refcnt)
{
#if SIZEOF_VOID_P > 4
if (refcnt & 1) {
refcnt += _Py_IMMORTAL_MINIMUM_REFCNT - 1;
}
return (void *)(refcnt - 2);
#else
return (void *)((refcnt -1) << 2);
#endif
}
#endif