diff options
Diffstat (limited to 'Python/gc.c')
-rw-r--r-- | Python/gc.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/Python/gc.c b/Python/gc.c index e37d4b76456..dad088e09f8 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -544,6 +544,12 @@ visit_decref(PyObject *op, void *parent) int _PyGC_VisitStackRef(_PyStackRef *ref, visitproc visit, void *arg) { + // This is a bit tricky! We want to ignore stackrefs with embedded + // refcounts when computing the incoming references, but otherwise treat + // them like normal. + if (!PyStackRef_RefcountOnObject(*ref) && (visit == visit_decref)) { + return 0; + } Py_VISIT(PyStackRef_AsPyObjectBorrow(*ref)); return 0; } @@ -554,7 +560,7 @@ _PyGC_VisitFrameStack(_PyInterpreterFrame *frame, visitproc visit, void *arg) _PyStackRef *ref = _PyFrame_GetLocalsArray(frame); /* locals and stack */ for (; ref < frame->stackpointer; ref++) { - Py_VISIT(PyStackRef_AsPyObjectBorrow(*ref)); + _Py_VISIT_STACKREF(*ref); } return 0; } |