diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_operator.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/Modules/_operator.c b/Modules/_operator.c index f55c2f1..5bd5a3b 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -1004,12 +1004,19 @@ itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)ig; } +static int +itemgetter_clear(itemgetterobject *ig) +{ + Py_CLEAR(ig->item); + return 0; +} + static void itemgetter_dealloc(itemgetterobject *ig) { PyTypeObject *tp = Py_TYPE(ig); PyObject_GC_UnTrack(ig); - Py_XDECREF(ig->item); + (void)itemgetter_clear(ig); tp->tp_free(ig); Py_DECREF(tp); } @@ -1017,6 +1024,7 @@ itemgetter_dealloc(itemgetterobject *ig) static int itemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(ig)); Py_VISIT(ig->item); return 0; } @@ -1113,6 +1121,7 @@ static PyType_Slot itemgetter_type_slots[] = { {Py_tp_dealloc, itemgetter_dealloc}, {Py_tp_call, itemgetter_call}, {Py_tp_traverse, itemgetter_traverse}, + {Py_tp_clear, itemgetter_clear}, {Py_tp_methods, itemgetter_methods}, {Py_tp_new, itemgetter_new}, {Py_tp_getattro, PyObject_GenericGetAttr}, @@ -1250,12 +1259,19 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)ag; } +static int +attrgetter_clear(attrgetterobject *ag) +{ + Py_CLEAR(ag->attr); + return 0; +} + static void attrgetter_dealloc(attrgetterobject *ag) { PyTypeObject *tp = Py_TYPE(ag); PyObject_GC_UnTrack(ag); - Py_XDECREF(ag->attr); + (void)attrgetter_clear(ag); tp->tp_free(ag); Py_DECREF(tp); } @@ -1264,6 +1280,7 @@ static int attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg) { Py_VISIT(ag->attr); + Py_VISIT(Py_TYPE(ag)); return 0; } @@ -1435,6 +1452,7 @@ static PyType_Slot attrgetter_type_slots[] = { {Py_tp_dealloc, attrgetter_dealloc}, {Py_tp_call, attrgetter_call}, {Py_tp_traverse, attrgetter_traverse}, + {Py_tp_clear, attrgetter_clear}, {Py_tp_methods, attrgetter_methods}, {Py_tp_new, attrgetter_new}, {Py_tp_getattro, PyObject_GenericGetAttr}, @@ -1505,14 +1523,21 @@ methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)mc; } +static int +methodcaller_clear(methodcallerobject *mc) +{ + Py_CLEAR(mc->name); + Py_CLEAR(mc->args); + Py_CLEAR(mc->kwds); + return 0; +} + static void methodcaller_dealloc(methodcallerobject *mc) { PyTypeObject *tp = Py_TYPE(mc); PyObject_GC_UnTrack(mc); - Py_XDECREF(mc->name); - Py_XDECREF(mc->args); - Py_XDECREF(mc->kwds); + (void)methodcaller_clear(mc); tp->tp_free(mc); Py_DECREF(tp); } @@ -1520,8 +1545,10 @@ methodcaller_dealloc(methodcallerobject *mc) static int methodcaller_traverse(methodcallerobject *mc, visitproc visit, void *arg) { + Py_VISIT(mc->name); Py_VISIT(mc->args); Py_VISIT(mc->kwds); + Py_VISIT(Py_TYPE(mc)); return 0; } @@ -1680,6 +1707,7 @@ static PyType_Slot methodcaller_type_slots[] = { {Py_tp_dealloc, methodcaller_dealloc}, {Py_tp_call, methodcaller_call}, {Py_tp_traverse, methodcaller_traverse}, + {Py_tp_clear, methodcaller_clear}, {Py_tp_methods, methodcaller_methods}, {Py_tp_new, methodcaller_new}, {Py_tp_getattro, PyObject_GenericGetAttr}, |