mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +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;
|
uintptr_t full = (uintptr_t)ptr;
|
||||||
assert((full & 3) == 0);
|
assert((full & 3) == 0);
|
||||||
|
#if SIZEOF_VOID_P > 4
|
||||||
uint32_t refcnt = (uint32_t)full;
|
uint32_t refcnt = (uint32_t)full;
|
||||||
if (refcnt >= (uint32_t)_Py_IMMORTAL_MINIMUM_REFCNT) {
|
if (refcnt >= (uint32_t)_Py_IMMORTAL_MINIMUM_REFCNT) {
|
||||||
full = full - ((uintptr_t)_Py_IMMORTAL_MINIMUM_REFCNT) + 1;
|
full = full - ((uintptr_t)_Py_IMMORTAL_MINIMUM_REFCNT) + 1;
|
||||||
}
|
}
|
||||||
return full + 2;
|
return full + 2;
|
||||||
|
#else
|
||||||
|
// Make the top two bits 0, so it appears mortal.
|
||||||
|
return (full >> 2) + 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
safe_refcount_to_pointer(uintptr_t refcnt)
|
safe_refcount_to_pointer(uintptr_t refcnt)
|
||||||
{
|
{
|
||||||
|
#if SIZEOF_VOID_P > 4
|
||||||
if (refcnt & 1) {
|
if (refcnt & 1) {
|
||||||
refcnt += _Py_IMMORTAL_MINIMUM_REFCNT - 1;
|
refcnt += _Py_IMMORTAL_MINIMUM_REFCNT - 1;
|
||||||
}
|
}
|
||||||
return (void *)(refcnt - 2);
|
return (void *)(refcnt - 2);
|
||||||
|
#else
|
||||||
|
return (void *)((refcnt -1) << 2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue