| #include <torch/csrc/utils/pyobject_preservation.h> | |
| #include <structmember.h> | |
| void clear_slots(PyTypeObject* type, PyObject* self) { | |
| Py_ssize_t n = Py_SIZE(type); | |
| PyMemberDef* mp = type->tp_members; | |
| for (Py_ssize_t i = 0; i < n; i++, mp++) { | |
| if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) { | |
| char* addr = (char*)self + mp->offset; | |
| PyObject* obj = *(PyObject**)addr; | |
| if (obj != nullptr) { | |
| *(PyObject**)addr = nullptr; | |
| Py_DECREF(obj); | |
| } | |
| } | |
| } | |
| } |