bpo-33418: Add tp_clear for function object (GH-8058) · python/cpython@3c45240 (original) (raw)

`@@ -523,23 +523,31 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,

`

523

523

`return (PyObject *)newfunc;

`

524

524

`}

`

525

525

``

``

526

`+

static int

`

``

527

`+

func_clear(PyFunctionObject *op)

`

``

528

`+

{

`

``

529

`+

Py_CLEAR(op->func_code);

`

``

530

`+

Py_CLEAR(op->func_globals);

`

``

531

`+

Py_CLEAR(op->func_module);

`

``

532

`+

Py_CLEAR(op->func_name);

`

``

533

`+

Py_CLEAR(op->func_defaults);

`

``

534

`+

Py_CLEAR(op->func_kwdefaults);

`

``

535

`+

Py_CLEAR(op->func_doc);

`

``

536

`+

Py_CLEAR(op->func_dict);

`

``

537

`+

Py_CLEAR(op->func_closure);

`

``

538

`+

Py_CLEAR(op->func_annotations);

`

``

539

`+

Py_CLEAR(op->func_qualname);

`

``

540

`+

return 0;

`

``

541

`+

}

`

``

542

+

526

543

`static void

`

527

544

`func_dealloc(PyFunctionObject *op)

`

528

545

`{

`

529

546

`_PyObject_GC_UNTRACK(op);

`

530

``

`-

if (op->func_weakreflist != NULL)

`

``

547

`+

if (op->func_weakreflist != NULL) {

`

531

548

`PyObject_ClearWeakRefs((PyObject *) op);

`

532

``

`-

Py_DECREF(op->func_code);

`

533

``

`-

Py_DECREF(op->func_globals);

`

534

``

`-

Py_XDECREF(op->func_module);

`

535

``

`-

Py_DECREF(op->func_name);

`

536

``

`-

Py_XDECREF(op->func_defaults);

`

537

``

`-

Py_XDECREF(op->func_kwdefaults);

`

538

``

`-

Py_XDECREF(op->func_doc);

`

539

``

`-

Py_XDECREF(op->func_dict);

`

540

``

`-

Py_XDECREF(op->func_closure);

`

541

``

`-

Py_XDECREF(op->func_annotations);

`

542

``

`-

Py_XDECREF(op->func_qualname);

`

``

549

`+

}

`

``

550

`+

(void)func_clear(op);

`

543

551

`PyObject_GC_Del(op);

`

544

552

`}

`

545

553

``

`@@ -612,7 +620,7 @@ PyTypeObject PyFunction_Type = {

`

612

620

`Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */

`

613

621

`func_new__doc__, /* tp_doc */

`

614

622

` (traverseproc)func_traverse, /* tp_traverse */

`

615

``

`-

0, /* tp_clear */

`

``

623

`+

(inquiry)func_clear, /* tp_clear */

`

616

624

`0, /* tp_richcompare */

`

617

625

` offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */

`

618

626

`0, /* tp_iter */

`