summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-02-07 00:24:29 (GMT)
committerGitHub <noreply@github.com>2020-02-07 00:24:29 (GMT)
commitc86a11221df7e37da389f9c6ce6e47ea22dc44ff (patch)
treec27a35a01bde1554488268dd3bbeb8b4c46e193c /Modules
parenta93c51e3a8e15f1a486d11d5b55a64f3381babe0 (diff)
downloadcpython-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.c15
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);