mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-125174: Mark objects as statically allocated. (#127797)
* Set a bit in the unused part of the refcount on 64 bit machines and the free-threaded build. * Use the top of the refcount range on 32 bit machines
This commit is contained in:
parent
dd9da738ad
commit
bc262de06b
7 changed files with 99 additions and 13 deletions
|
@ -2475,10 +2475,16 @@ new_reference(PyObject *op)
|
|||
{
|
||||
// Skip the immortal object check in Py_SET_REFCNT; always set refcnt to 1
|
||||
#if !defined(Py_GIL_DISABLED)
|
||||
#if SIZEOF_VOID_P > 4
|
||||
op->ob_refcnt_full = 1;
|
||||
assert(op->ob_refcnt == 1);
|
||||
assert(op->ob_flags == 0);
|
||||
#else
|
||||
op->ob_refcnt = 1;
|
||||
#endif
|
||||
#else
|
||||
op->ob_tid = _Py_ThreadId();
|
||||
op->_padding = 0;
|
||||
op->ob_flags = 0;
|
||||
op->ob_mutex = (PyMutex){ 0 };
|
||||
op->ob_gc_bits = 0;
|
||||
op->ob_ref_local = 1;
|
||||
|
@ -2515,6 +2521,10 @@ _Py_SetImmortalUntracked(PyObject *op)
|
|||
|| PyUnicode_CHECK_INTERNED(op) == SSTATE_INTERNED_IMMORTAL_STATIC);
|
||||
}
|
||||
#endif
|
||||
// Check if already immortal to avoid degrading from static immortal to plain immortal
|
||||
if (_Py_IsImmortal(op)) {
|
||||
return;
|
||||
}
|
||||
#ifdef Py_GIL_DISABLED
|
||||
op->ob_tid = _Py_UNOWNED_TID;
|
||||
op->ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue