mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
bpo-39573: Add Py_SET_REFCNT() function (GH-18389)
Add a Py_SET_REFCNT() function to set the reference counter of an object.
This commit is contained in:
parent
a93c51e3a8
commit
c86a11221d
7 changed files with 30 additions and 14 deletions
|
@ -3551,7 +3551,7 @@ slot_tp_del(PyObject *self)
|
|||
|
||||
/* Temporarily resurrect the object. */
|
||||
assert(Py_REFCNT(self) == 0);
|
||||
Py_REFCNT(self) = 1;
|
||||
Py_SET_REFCNT(self, 1);
|
||||
|
||||
/* Save the current exception, if any. */
|
||||
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||
|
@ -3574,7 +3574,8 @@ slot_tp_del(PyObject *self)
|
|||
* cause a recursive call.
|
||||
*/
|
||||
assert(Py_REFCNT(self) > 0);
|
||||
if (--Py_REFCNT(self) == 0) {
|
||||
Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
|
||||
if (Py_REFCNT(self) == 0) {
|
||||
/* this is the normal path out */
|
||||
return;
|
||||
}
|
||||
|
@ -3585,7 +3586,7 @@ slot_tp_del(PyObject *self)
|
|||
{
|
||||
Py_ssize_t refcnt = Py_REFCNT(self);
|
||||
_Py_NewReference(self);
|
||||
Py_REFCNT(self) = refcnt;
|
||||
Py_SET_REFCNT(self, refcnt);
|
||||
}
|
||||
assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
|
||||
/* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
|
||||
|
@ -4621,7 +4622,7 @@ check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
|
|||
return NULL;
|
||||
}
|
||||
/* Initialize reference count to avoid early crash in ceval or GC */
|
||||
Py_REFCNT(op) = 1;
|
||||
Py_SET_REFCNT(op, 1);
|
||||
/* object fields like ob_type are uninitialized! */
|
||||
return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
|
||||
}
|
||||
|
@ -4636,7 +4637,7 @@ check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args
|
|||
return NULL;
|
||||
}
|
||||
/* Initialize reference count to avoid early crash in ceval or GC */
|
||||
Py_REFCNT(op) = 1;
|
||||
Py_SET_REFCNT(op, 1);
|
||||
/* ob_type field is after the memory block: part of "forbidden bytes"
|
||||
when using debug hooks on memory allocators! */
|
||||
return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
|
||||
|
@ -4652,7 +4653,7 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
|
|||
}
|
||||
Py_TYPE(op)->tp_dealloc(op);
|
||||
/* Reset reference count to avoid early crash in ceval or GC */
|
||||
Py_REFCNT(op) = 1;
|
||||
Py_SET_REFCNT(op, 1);
|
||||
/* object memory is freed! */
|
||||
return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
|
||||
}
|
||||
|
@ -5134,7 +5135,7 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
|
|||
}
|
||||
assert(Py_REFCNT(obj) == 1);
|
||||
|
||||
Py_REFCNT(obj) = 0;
|
||||
Py_SET_REFCNT(obj, 0);
|
||||
/* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
|
||||
Py_DECREF(obj);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue