Make sure trashcan pointer look mortal -- 32 bit
{
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