aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/gc.c')
-rw-r--r--Python/gc.c8
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;
}