mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00
[3.13] gh-131740: Update PyUnstable_GC_VisitObjects to traverse perm … (gh-131754)
* [3.13] gh-131740: Update PyUnstable_GC_VisitObjects to traverse perm gen (gh-131744)
(cherry picked from commit 7bb41aef4b
)
* fix
This commit is contained in:
parent
5bcb476df1
commit
9d3f538471
2 changed files with 21 additions and 10 deletions
|
@ -0,0 +1 @@
|
||||||
|
Update PyUnstable_GC_VisitObjects to traverse perm gen.
|
30
Python/gc.c
30
Python/gc.c
|
@ -1966,6 +1966,23 @@ PyObject_GC_IsFinalized(PyObject *obj)
|
||||||
return 0;
|
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
|
void
|
||||||
PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
|
PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
|
||||||
{
|
{
|
||||||
|
@ -1974,18 +1991,11 @@ PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
|
||||||
int origenstate = gcstate->enabled;
|
int origenstate = gcstate->enabled;
|
||||||
gcstate->enabled = 0;
|
gcstate->enabled = 0;
|
||||||
for (i = 0; i < NUM_GENERATIONS; i++) {
|
for (i = 0; i < NUM_GENERATIONS; i++) {
|
||||||
PyGC_Head *gc_list, *gc;
|
if (visit_generation(callback, arg, &gcstate->generations[i])) {
|
||||||
gc_list = GEN_HEAD(gcstate, i);
|
goto done;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
visit_generation(callback, arg, &gcstate->permanent_generation);
|
||||||
done:
|
done:
|
||||||
gcstate->enabled = origenstate;
|
gcstate->enabled = origenstate;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue