diff options
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/object.c | 15 | ||||
-rw-r--r-- | Objects/structseq.c | 5 |
2 files changed, 19 insertions, 1 deletions
diff --git a/Objects/object.c b/Objects/object.c index bbf7f98..7247eb2 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2388,6 +2388,21 @@ _Py_NewReferenceNoTotal(PyObject *op) } void +_Py_SetImmortal(PyObject *op) +{ + if (PyObject_IS_GC(op) && _PyObject_GC_IS_TRACKED(op)) { + _PyObject_GC_UNTRACK(op); + } +#ifdef Py_GIL_DISABLED + op->ob_tid = _Py_UNOWNED_TID; + op->ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL; + op->ob_ref_shared = 0; +#else + op->ob_refcnt = _Py_IMMORTAL_REFCNT; +#endif +} + +void _Py_ResurrectReference(PyObject *op) { if (_PyRuntime.tracemalloc.config.tracing) { diff --git a/Objects/structseq.c b/Objects/structseq.c index 581d6ad..661d96a 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -603,6 +603,9 @@ _PyStructSequence_InitBuiltinWithFlags(PyInterpreterState *interp, PyStructSequence_Desc *desc, unsigned long tp_flags) { + if (Py_TYPE(type) == NULL) { + Py_SET_TYPE(type, &PyType_Type); + } Py_ssize_t n_unnamed_members; Py_ssize_t n_members = count_members(desc, &n_unnamed_members); PyMemberDef *members = NULL; @@ -618,7 +621,7 @@ _PyStructSequence_InitBuiltinWithFlags(PyInterpreterState *interp, } initialize_static_fields(type, desc, members, tp_flags); - _Py_SetImmortal(type); + _Py_SetImmortal((PyObject *)type); } #ifndef NDEBUG else { |