mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
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:
parent
9434709edf
commit
d48616e08c
1 changed files with 9 additions and 0 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue