diff options
author | Victor Stinner <vstinner@python.org> | 2020-02-07 00:24:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-07 00:24:29 (GMT) |
commit | c86a11221df7e37da389f9c6ce6e47ea22dc44ff (patch) | |
tree | c27a35a01bde1554488268dd3bbeb8b4c46e193c /Modules | |
parent | a93c51e3a8e15f1a486d11d5b55a64f3381babe0 (diff) | |
download | cpython-c86a11221df7e37da389f9c6ce6e47ea22dc44ff.zip cpython-c86a11221df7e37da389f9c6ce6e47ea22dc44ff.tar.gz cpython-c86a11221df7e37da389f9c6ce6e47ea22dc44ff.tar.bz2 |
bpo-39573: Add Py_SET_REFCNT() function (GH-18389)
Add a Py_SET_REFCNT() function to set the reference counter of an
object.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_testcapimodule.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 27db86a..d8bf373 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -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); |