Skip to content

Commit a7ccd4d

Browse files
committed
Fix heap types in the stdlib to correctly visit its parent
1 parent 3bc77ee commit a7ccd4d

File tree

7 files changed

+29
-0
lines changed

7 files changed

+29
-0
lines changed

Modules/_abc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ typedef struct {
4646
static int
4747
abc_data_traverse(_abc_data *self, visitproc visit, void *arg)
4848
{
49+
PyTypeObject *parent = Py_TYPE(self);
50+
if (parent->tp_traverse == (traverseproc)abc_data_traverse) {
51+
Py_VISIT(parent);
52+
}
4953
Py_VISIT(self->_abc_registry);
5054
Py_VISIT(self->_abc_cache);
5155
Py_VISIT(self->_abc_negative_cache);

Modules/_curses_panel.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ _curses_panel_clear(PyObject *m)
3939
static int
4040
_curses_panel_traverse(PyObject *m, visitproc visit, void *arg)
4141
{
42+
PyTypeObject *parent = Py_TYPE(m);
43+
if (parent->tp_traverse == (traverseproc)_curses_panel_traverse) {
44+
Py_VISIT(parent);
45+
}
4246
Py_VISIT(get_curses_panelstate(m)->PyCursesError);
4347
return 0;
4448
}

Modules/_json.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,10 @@ encoder_dealloc(PyObject *self)
17451745
static int
17461746
encoder_traverse(PyEncoderObject *self, visitproc visit, void *arg)
17471747
{
1748+
PyTypeObject *parent = Py_TYPE(self);
1749+
if (parent->tp_traverse == (traverseproc)encoder_traverse) {
1750+
Py_VISIT(parent);
1751+
}
17481752
Py_VISIT(self->markers);
17491753
Py_VISIT(self->defaultfn);
17501754
Py_VISIT(self->encoder);

Modules/_struct.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,6 +1641,10 @@ unpackiter_dealloc(unpackiterobject *self)
16411641
static int
16421642
unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
16431643
{
1644+
PyTypeObject *parent = Py_TYPE(self);
1645+
if (parent->tp_traverse == (traverseproc)unpackiter_traverse) {
1646+
Py_VISIT(parent);
1647+
}
16441648
Py_VISIT(self->so);
16451649
Py_VISIT(self->buf.obj);
16461650
return 0;

Objects/structseq.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ PyStructSequence_GetItem(PyObject* op, Py_ssize_t i)
7070
static int
7171
structseq_traverse(PyStructSequence *obj, visitproc visit, void *arg)
7272
{
73+
PyTypeObject *parent = Py_TYPE(obj);
74+
if (PyType_GetFlags(parent) & Py_TPFLAGS_HEAPTYPE &&
75+
parent->tp_traverse == (traverseproc)structseq_traverse) {
76+
Py_VISIT(parent);
77+
}
7378
Py_ssize_t i, size;
7479
size = REAL_SIZE(obj);
7580
for (i = 0; i < size; ++i) {

Parser/asdl_c.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,10 @@ def visitModule(self, mod):
673673
static int
674674
ast_traverse(AST_object *self, visitproc visit, void *arg)
675675
{
676+
PyTypeObject *parent = Py_TYPE(self);
677+
if (parent->tp_traverse == (traverseproc)ast_traverse) {
678+
Py_VISIT(parent);
679+
}
676680
Py_VISIT(self->dict);
677681
return 0;
678682
}

Python/Python-ast.c

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)