https://github.com/python/cpython/commit/9d3f5384716ab068414cfbfe230a3b94e119a921
commit: 9d3f5384716ab068414cfbfe230a3b94e119a921
branch: 3.13
author: Donghee Na <donghee...@python.org>
committer: corona10 <donghee.n...@gmail.com>
date: 2025-03-27T02:43:16+09:00
summary:

[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 7bb41aef4b7b8f3c3f07c11b801c5b7f8afaac7f)

* fix

files:
A Misc/NEWS.d/next/C API/2025-03-26-06-56-40.gh-issue-131740.9PdxxQ.rst
M Python/gc.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
index 00000000000000..585f07aaddd8c8
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2025-03-26-06-56-40.gh-issue-131740.9PdxxQ.rst     
@@ -0,0 +1 @@
+Update PyUnstable_GC_VisitObjects to traverse perm gen.
diff --git a/Python/gc.c b/Python/gc.c
index 8dbcb340d4089d..81871c5f3d6bd1 100644
--- a/Python/gc.c
+++ b/Python/gc.c
@@ -1966,6 +1966,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)
 {
@@ -1974,18 +1991,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;
 }

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to