]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-131740: Update PyUnstable_GC_VisitObjects to traverse perm gen (#131828)
authorDonghee Na <donghee.na@python.org>
Fri, 28 Mar 2025 13:55:58 +0000 (22:55 +0900)
committerGitHub <noreply@github.com>
Fri, 28 Mar 2025 13:55:58 +0000 (14:55 +0100)
Misc/NEWS.d/next/C API/2025-03-26-06-56-40.gh-issue-131740.9PdxxQ.rst [new file with mode: 0644]
Modules/gcmodule.c

diff --git a/Misc/NEWS.d/next/C API/2025-03-26-06-56-40.gh-issue-131740.9PdxxQ.rst b/Misc/NEWS.d/next/C API/2025-03-26-06-56-40.gh-issue-131740.9PdxxQ.rst
new file mode 100644 (file)
index 0000000..585f07a
--- /dev/null
@@ -0,0 +1 @@
+Update PyUnstable_GC_VisitObjects to traverse perm gen.
index e14d9d58f8c46439f3960ade4e79e123a13b18f4..cd1115b0288f994349f1df7836487836992c259a 100644 (file)
@@ -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;
 }