[3.10] bpo-42972: Fully implement GC protocol for functools keywrapper and partial types (GH-26363) by miss-islington · Pull Request #26424 · python/cpython
static int partial_clear(partialobject *pto) { Py_CLEAR(pto->fn); Py_CLEAR(pto->args); Py_CLEAR(pto->kw); Py_CLEAR(pto->dict); return 0; }
static int partial_traverse(partialobject *pto, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(pto)); Py_VISIT(pto->fn); Py_VISIT(pto->args); Py_VISIT(pto->kw); Py_VISIT(pto->dict); return 0; }
static void partial_dealloc(partialobject *pto) { PyTypeObject *tp = Py_TYPE(pto); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(pto); if (pto->weakreflist != NULL) if (pto->weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject *) pto); Py_XDECREF(pto->fn); Py_XDECREF(pto->args); Py_XDECREF(pto->kw); Py_XDECREF(pto->dict); } (void)partial_clear(pto); tp->tp_free(pto); Py_DECREF(tp); }
static int partial_traverse(partialobject *pto, visitproc visit, void *arg) { Py_VISIT(pto->fn); Py_VISIT(pto->args); Py_VISIT(pto->kw); Py_VISIT(pto->dict); return 0; }
PyDoc_STRVAR(partial_doc, "partial(func, *args, **keywords) - new function with partial application\n\ of the given arguments and keywords.\n");
static int keyobject_traverse(keyobject *ko, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(ko)); Py_VISIT(ko->cmp); Py_VISIT(ko->object); return 0;
result = PyObject_New(keyobject, Py_TYPE(ko)); result = PyObject_GC_New(keyobject, Py_TYPE(ko)); if (result == NULL) { return NULL; } Py_INCREF(ko->cmp); result->cmp = ko->cmp; Py_INCREF(object); result->object = object; PyObject_GC_Track(result); return (PyObject *)result; }
state = get_functools_state(self); object = PyObject_New(keyobject, state->keyobject_type); object = PyObject_GC_New(keyobject, state->keyobject_type); if (!object) return NULL; Py_INCREF(cmp); object->cmp = cmp; object->object = NULL; PyObject_GC_Track(object); return (PyObject *)object; }
lru_cache_tp_clear(obj); (void)lru_cache_tp_clear(obj); tp->tp_free(obj); Py_DECREF(tp); }