gh-111178: Define visitproc
callback functions properly and remove unnecessary casts in gcmodule.c (#112687)
This commit is contained in:
parent
cc7e45cc57
commit
b920d6ceaa
@ -491,15 +491,16 @@ subtract_refs(PyGC_Head *containers)
|
|||||||
PyObject *op = FROM_GC(gc);
|
PyObject *op = FROM_GC(gc);
|
||||||
traverse = Py_TYPE(op)->tp_traverse;
|
traverse = Py_TYPE(op)->tp_traverse;
|
||||||
(void) traverse(op,
|
(void) traverse(op,
|
||||||
(visitproc)visit_decref,
|
visit_decref,
|
||||||
op);
|
op);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A traversal callback for move_unreachable. */
|
/* A traversal callback for move_unreachable. */
|
||||||
static int
|
static int
|
||||||
visit_reachable(PyObject *op, PyGC_Head *reachable)
|
visit_reachable(PyObject *op, void *arg)
|
||||||
{
|
{
|
||||||
|
PyGC_Head *reachable = arg;
|
||||||
OBJECT_STAT_INC(object_visits);
|
OBJECT_STAT_INC(object_visits);
|
||||||
if (!_PyObject_IS_GC(op)) {
|
if (!_PyObject_IS_GC(op)) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -603,7 +604,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
|
|||||||
// NOTE: visit_reachable may change gc->_gc_next when
|
// NOTE: visit_reachable may change gc->_gc_next when
|
||||||
// young->_gc_prev == gc. Don't do gc = GC_NEXT(gc) before!
|
// young->_gc_prev == gc. Don't do gc = GC_NEXT(gc) before!
|
||||||
(void) traverse(op,
|
(void) traverse(op,
|
||||||
(visitproc)visit_reachable,
|
visit_reachable,
|
||||||
(void *)young);
|
(void *)young);
|
||||||
// relink gc_prev to prev element.
|
// relink gc_prev to prev element.
|
||||||
_PyGCHead_SET_PREV(gc, prev);
|
_PyGCHead_SET_PREV(gc, prev);
|
||||||
@ -726,8 +727,9 @@ clear_unreachable_mask(PyGC_Head *unreachable)
|
|||||||
|
|
||||||
/* A traversal callback for move_legacy_finalizer_reachable. */
|
/* A traversal callback for move_legacy_finalizer_reachable. */
|
||||||
static int
|
static int
|
||||||
visit_move(PyObject *op, PyGC_Head *tolist)
|
visit_move(PyObject *op, void *arg)
|
||||||
{
|
{
|
||||||
|
PyGC_Head *tolist = arg;
|
||||||
OBJECT_STAT_INC(object_visits);
|
OBJECT_STAT_INC(object_visits);
|
||||||
if (_PyObject_IS_GC(op)) {
|
if (_PyObject_IS_GC(op)) {
|
||||||
PyGC_Head *gc = AS_GC(op);
|
PyGC_Head *gc = AS_GC(op);
|
||||||
@ -751,7 +753,7 @@ move_legacy_finalizer_reachable(PyGC_Head *finalizers)
|
|||||||
/* Note that the finalizers list may grow during this. */
|
/* Note that the finalizers list may grow during this. */
|
||||||
traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
|
traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
|
||||||
(void) traverse(FROM_GC(gc),
|
(void) traverse(FROM_GC(gc),
|
||||||
(visitproc)visit_move,
|
visit_move,
|
||||||
(void *)finalizers);
|
(void *)finalizers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1684,8 +1686,9 @@ gc_get_count_impl(PyObject *module)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
referrersvisit(PyObject* obj, PyObject *objs)
|
referrersvisit(PyObject* obj, void *arg)
|
||||||
{
|
{
|
||||||
|
PyObject *objs = arg;
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
|
for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
|
||||||
if (PyTuple_GET_ITEM(objs, i) == obj)
|
if (PyTuple_GET_ITEM(objs, i) == obj)
|
||||||
@ -1704,7 +1707,7 @@ gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
|
|||||||
traverse = Py_TYPE(obj)->tp_traverse;
|
traverse = Py_TYPE(obj)->tp_traverse;
|
||||||
if (obj == objs || obj == resultlist)
|
if (obj == objs || obj == resultlist)
|
||||||
continue;
|
continue;
|
||||||
if (traverse(obj, (visitproc)referrersvisit, objs)) {
|
if (traverse(obj, referrersvisit, objs)) {
|
||||||
if (PyList_Append(resultlist, obj) < 0)
|
if (PyList_Append(resultlist, obj) < 0)
|
||||||
return 0; /* error */
|
return 0; /* error */
|
||||||
}
|
}
|
||||||
@ -1740,8 +1743,9 @@ gc_get_referrers(PyObject *self, PyObject *args)
|
|||||||
|
|
||||||
/* Append obj to list; return true if error (out of memory), false if OK. */
|
/* Append obj to list; return true if error (out of memory), false if OK. */
|
||||||
static int
|
static int
|
||||||
referentsvisit(PyObject *obj, PyObject *list)
|
referentsvisit(PyObject *obj, void *arg)
|
||||||
{
|
{
|
||||||
|
PyObject *list = arg;
|
||||||
return PyList_Append(list, obj) < 0;
|
return PyList_Append(list, obj) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1770,7 +1774,7 @@ gc_get_referents(PyObject *self, PyObject *args)
|
|||||||
traverse = Py_TYPE(obj)->tp_traverse;
|
traverse = Py_TYPE(obj)->tp_traverse;
|
||||||
if (! traverse)
|
if (! traverse)
|
||||||
continue;
|
continue;
|
||||||
if (traverse(obj, (visitproc)referentsvisit, result)) {
|
if (traverse(obj, referentsvisit, result)) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user