mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
[3.12] gh-131740: Update PyUnstable_GC_VisitObjects to traverse perm gen (#131828)
This commit is contained in:
parent
4f7b66ab82
commit
940c937c13
2 changed files with 21 additions and 10 deletions
|
|
@ -0,0 +1 @@
|
|||
Update PyUnstable_GC_VisitObjects to traverse perm gen.
|
||||
|
|
@ -2443,6 +2443,23 @@ PyObject_GC_IsFinalized(PyObject *obj)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
visit_generation(gcvisitobjects_t callback, void *arg, struct gc_generation *gen)
|
||||
{
|
||||
PyGC_Head *gc_list, *gc;
|
||||
gc_list = &gen->head;
|
||||
for (gc = GC_NEXT(gc_list); gc != gc_list; gc = GC_NEXT(gc)) {
|
||||
PyObject *op = FROM_GC(gc);
|
||||
Py_INCREF(op);
|
||||
int res = callback(op, arg);
|
||||
Py_DECREF(op);
|
||||
if (!res) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
|
||||
{
|
||||
|
|
@ -2451,18 +2468,11 @@ PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
|
|||
int origenstate = gcstate->enabled;
|
||||
gcstate->enabled = 0;
|
||||
for (i = 0; i < NUM_GENERATIONS; i++) {
|
||||
PyGC_Head *gc_list, *gc;
|
||||
gc_list = GEN_HEAD(gcstate, i);
|
||||
for (gc = GC_NEXT(gc_list); gc != gc_list; gc = GC_NEXT(gc)) {
|
||||
PyObject *op = FROM_GC(gc);
|
||||
Py_INCREF(op);
|
||||
int res = callback(op, arg);
|
||||
Py_DECREF(op);
|
||||
if (!res) {
|
||||
goto done;
|
||||
}
|
||||
if (visit_generation(callback, arg, &gcstate->generations[i])) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
visit_generation(callback, arg, &gcstate->permanent_generation);
|
||||
done:
|
||||
gcstate->enabled = origenstate;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue