From: Neil Schemenauer Date: Tue, 1 Oct 2019 07:49:36 +0000 (-0700) Subject: Restore tp_clear for function object. (#16502) X-Git-Tag: v3.8.0rc1~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3612070b746f799901443b65725008bc035872b;p=thirdparty%2FPython%2Fcpython.git Restore tp_clear for function object. (#16502) This is a revert of the revert (GH-15826). Having a tp_clear for functions should be safe (and helpful) now that bpo-38006 has been fixed. --- diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 53aebf12f550..df5cc2d3f570 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -570,23 +570,31 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, return (PyObject *)newfunc; } +static int +func_clear(PyFunctionObject *op) +{ + Py_CLEAR(op->func_code); + Py_CLEAR(op->func_globals); + Py_CLEAR(op->func_module); + Py_CLEAR(op->func_name); + Py_CLEAR(op->func_defaults); + Py_CLEAR(op->func_kwdefaults); + Py_CLEAR(op->func_doc); + Py_CLEAR(op->func_dict); + Py_CLEAR(op->func_closure); + Py_CLEAR(op->func_annotations); + Py_CLEAR(op->func_qualname); + return 0; +} + static void func_dealloc(PyFunctionObject *op) { _PyObject_GC_UNTRACK(op); - if (op->func_weakreflist != NULL) + if (op->func_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject *) op); - Py_DECREF(op->func_code); - Py_DECREF(op->func_globals); - Py_XDECREF(op->func_module); - Py_DECREF(op->func_name); - Py_XDECREF(op->func_defaults); - Py_XDECREF(op->func_kwdefaults); - Py_XDECREF(op->func_doc); - Py_XDECREF(op->func_dict); - Py_XDECREF(op->func_closure); - Py_XDECREF(op->func_annotations); - Py_XDECREF(op->func_qualname); + } + (void)func_clear(op); PyObject_GC_Del(op); } @@ -661,7 +669,7 @@ PyTypeObject PyFunction_Type = { Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ - 0, /* tp_clear */ + (inquiry)func_clear, /* tp_clear */ 0, /* tp_richcompare */ offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */